C'deki virgül operatörü (,) birden fazla ifadeyi birleştirmeyi sağlar ve son ifadenin değeri sonucu olarak döner.
Örnek:
int a = 1, b = 2, c; c = (a += 2, b += 3, a + b); // önce a'yı artırıyoruz, ardından b'yi, sonra a + b'yi topluyoruz
Kullanım:
for döngüsünün başlığında kullanılır.İnce Noktalar:
Döngü örneği:
for (i = 0, j = 10; i < j; ++i, --j) { /* ... */ }
Fonksiyon argümanları listesinde virgülün operatör ile ayırıcı olarak farklılığı nedir?
Yaygın Hata: Her yerde virgülün bir operatör olduğu ve her zaman ifadeleri birleştirdiği düşünülmektedir.
Doğru Cevap: Virgül, yalnızca başlatma listeleri, argüman ve dizi elemanları dışında bir operatördür. Örneğin:
int x = (1, 2); // x == 2, burada operatör void foo(int a, int b) { ... } // burada ayırıcı
Virgül operatörü yalnızca parantez içinde çalışır, diğer durumlarda sadece bir ayırıcıdır.
Hikaye
do { ... } while (0) içinde virgül operatörünün parantezsiz talimatları birleştirmek için kullanıldığı bir makroda, if (a) MACRO(); else ... gibi bir şey, makronun yanlış sözdizimi nedeniyle bir sözdizimi hatasına neden oluyordu.
Hikaye
Virgül operatörünün önceliği ile atama önceliği arasındaki karışıklık, a = b, c = d; ifadesinin (a = b), (c = d) şeklinde çalışmasına neden oldu ve programcı her iki atamanın da tek bir ifadenin parçası olarak aynı anda gerçekleştirildiğini varsayıyordu.
Hikaye
Bir işlevde, işlev çağrılarını ardışık olarak gerçekleştirmek için virgül kullanıldı, ancak yalnızca son değerin döneceği göz ardı edildi. Sonuç ifadesinin tüm çağrıların etkilerini birleştirdiği varsayıldı ve aslında sadece ilk çağrıların yan etkileri önemliydi, bunların döndürdüğü değerler kayboluyordu.