Soruya Genel Bakış
Operatör öncelikleri C dilinde matematiksel ve mantıksal ifadelerde hesaplama sırasını kontrol etmek için tanıtılmıştır. Matematiksel operatörler tarihte beklenen bir önceliğe sahip olsa da (cebirdeki gibi), pek çok yeni operatörün (mantıksal, bit düzeyinde, atama vb.) ortaya çıkması durumu karmaşık hale getirmiştir. Hataları azaltmak ve okunabilirliği artırmak için resmi bir operatör öncelikleri ve eşassociatiflik listesi ortaya çıkmıştır.
Sorun
Daha fazla operatör ve farklı nitelikleri (aritmetik, karşılaştırma, atama, mantıksal, indeksleme) nedeniyle karmaşık ifadelerin oluşturulmasında belirsizlikler ortaya çıkmaktadır. Bunların kullanım sırasını yanlış anlama mantıksal hatalara ve her zaman gözle görülmeyen hata ortalarına neden olabilmektedir, özellikle bit düzeyinde ve mantıksal operatörlerin, göstericilerin, artırmaların ve üçlü operatörün bir arada kullanılması durumunda.
Çözüm
Kod Örneği:
#include <stdio.h> int main() { int a = 1, b = 2, c = 3, d; d = a + b * c; // b*c öncelikli: d = 1 + (2*3) = 7 printf("%d ", d); d = a + b << 1; // a + b = 3, ardından 3 << 1 (6) printf("%d ", d); d = a < b ? a++ : b++; printf("%d ", d); // a < b doğru => d = a (1), a artırılacak }
Ana Özellikler:
x = y > z ? y : z; ifadesi parantezler olmadan ne sonuç verir?
Cevap: Üçlü operatör ?: > operatöründen daha düşük bir önceliğe sahiptir. İlk olarak (y > z) hesaplanır ve ardından y ve z arasında seçim yapılır. Ama atama ile bir araya geldiğinde, beklenmedik etkiler olabilir. Her zaman parantez kullanmak daha iyidir: x = (y > z) ? y : z;.
p++ ifadesi ne sonuç verir ve neden?
Cevap: Postfix artırma (++) operatörü, çözümleme (*), bu yüzden *p++ ifadesi *(p++): önce p kullanılır ve artırılır, sadece ardından çözülür ve bu *++p'den (artırmadan sonra çözme) farklıdır.
a & b == c ifadesi neden beklenildiği gibi çalışmıyor?
Cevap: == operatörü &, operatöründen daha yüksek bir önceliğe sahip, bu nedenle ifade a & (b == c) olarak analiz edilir, (a & b) == c değil, bu da beklenmedik bir sonucun doğmasına neden olur. İstenen mantık için parantez kullanılmalıdır.
if ((a & b) == c) { ... }
Negatif Durum
Kodun optimize edilmesi sırasında programcı bazı operatörleri parantezsiz birleştirmiştir: if( mask & flag == 0 ) ..., bu sonuçta kontrol mantığı yanlış çalışmış ve sistemin çökmesine neden olmuştur.
Artılar:
Eksiler:
Pozitif Durum
Açık gruplama kullanımı: if( (mask & flag) == 0 ) ..., mantık şeffaf, bayrakların değiştirilmesi kolay.
Artılar:
Eksiler: