Pek çok farklı şeyi karıştırıyorsunuz: kontrol ifadeleri, operatörler ve boole türleri. Her birinin kendi kuralları vardır.
Kontrol ifadeleri, örneğin ifC11 6.4.8.1 ifadesi gibi çalışır :
Her iki formda da, ifade eşit olmayan değeri 0 ile karşılaştırırsa, ilk ikame yürütülür.
while, forVb aynı kural vardır. Bunun "doğru" veya "yanlış" ile ilgisi yoktur.
Boole sonucunu verdiği varsayılan operatörler için, gerçekte int1 veya 0 değerine sahip bir sonuç veriyorlar. Örneğin eşitlik operatörleri, C11 6.5.9:
Operatörlerin her biri, belirtilen ilişki doğruysa 1, yanlışsa 0 verir
Yukarıdakilerin tümü, 1999 yılına kadar C'nin bir boole türüne sahip olmadığı ve bir tane alsa bile, yukarıdaki kuralların değiştirilmediği içindir. Bu nedenle, deyimlerin ve operatörlerin bir boole türü verdiği (C ++ ve Java gibi) diğer programlama dillerinin çoğundan farklı olarak, sadece intsıfır değerine sahip veya sıfır olmayan bir an verirler . Örneğin, sizeof(1==1)C'de 4, C ++ 'da 1 verir.
C'deki gerçek boole türü adlandırılır _Boolve modern bir derleyici gerektirir. Başlık stdbool.htanımlar makrolar bool, trueve falsegenişletmek, _Bool, 1ve 0(C ++ ile uyumluluk için) olarak bulundu.
Bununla birlikte, kontrol ifadelerini ve işleçleri, bir boole türünü gerçekten gerekliyormuş / vermiş gibi ele almak iyi bir programlama uygulaması olarak kabul edilir. MISRA-C gibi belirli kodlama standartları böyle bir uygulamayı tavsiye eder. Yani:
if(ptr == NULL)yerine if(ptr).
if((data & mask) != 0)yerine if(data & mask).
Bu tarzın amacı, statik analiz araçları yardımıyla tip güvenliğini artırmak ve bu da hataları azaltmaktır. Muhtemelen, bu tarz yalnızca statik çözümleyiciler kullanıyorsanız anlamlıdır. Bazı durumlarda daha okunabilir, kendi kendini belgeleyen koda yol açsa da, örneğin
if(c == '\0')
Güzel, niyet açık, kod kendi kendini belgeliyor.
karşı
if(c)
Kötü. Bir şey ifade edebilir cve kodu anlamak için türünü aramalıyız . Tamsayı mı, işaretçi mi yoksa karakter mi?