C dilindeki virgül operatörü , iki (veya daha fazla) ifadeyi birleştirir, bunları soldan sağa sırayla hesaplar ve son ifadenin değerini döndürür:
int x = (f(), g()); // f() ve g() çağrılır, x == g() sonucudur
En sık for döngülerinde kullanılır:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
Ne zaman faydalı:
Kandırıcı noktalar:
Soru: Aşağıdaki kod ne yazdıracak?
int a = 1; int b = (a = 2, a + 3); printf("%d ", b);
Cevap: "5" yazdırır. Önce a=2 atanır, ardından ifade a+3 2+3=5 olarak hesaplanır ve bu değer b değişkenine atanır.
Hikaye
C projesinde bir geliştirici, return fonksiyonunda virgül operatörünü parantezsiz kullandı:
return x++, y++;Fonksiyonun y+1 döndürmesini umuyordu ama gerçekte return yalnızca sağdaki ifadenin sonucunu alır, soldaki x++ ayrı hesaplanır. Bu, kullanıcı kodunu yanıltmıştır, çünkü return sonucu beklenenden farklı çıktı.
Hikaye
Bir for döngüsünde bir programcı, noktalı virgül yerine yanlışlıkla virgül koydu:
for(i=0, i<10, i++) ...Program derlendi ama döngü yalnızca bir kez çalıştı, çünkü for döngüsündeki i<10, i++ koşulundaki ifade her zaman son ifadenin değerini (i++) döndürür, döngünün devam koşulunu değil.
Hikaye
Makroları yazarken bir geliştirici şöyle tanımladı:
#define DO(x, y) x, y int v = DO(f(), g());Her iki fonksiyonun çağrılacağını bekliyordu ama parantez koymayı unuttu. Sonuçta yalnızca f(); çağrıldı; g()'nin değeri v'ye atanmadı. Doğru kullanım:
#define DO(x, y) ((x), (y)).