C ve bazı benzer dillerde, için eşitlik boolean ifadeleri karşılaştırarak falseveya truetehlikeli bir alışkanlıktır.
C'de herhangi bir skalar ifade (sayısal veya işaretçi), örneğin bir ifdeyimin koşulu olarak bir boolean bağlamında kullanılabilir . C kuralı if (cond)şuna eşittir if (cond != 0)- yani, sıfır yanlıştır ve sıfır olmayan herhangi bir değer doğrudur. Eğer condişaretçi tiptedir, 0bir boş gösterici sabit olarak kabul edilir; if (ptr)anlamına gelir if (ptr != NULL).
Bu şu demek
if (cond)
ve
if (cond == true)
aynı şeyi kastetmiyorum . İlki condsıfır değilse ilk doğrudur ; İkincisi, yalnızca trueC'ye (varsa #include <stdbool.h>) basit olan eşitse geçerlidir 1.
Örneğin, içinde isdigit()bildirilen işlev , bir rakam ise argüman, sıfır değilse sıfır olmayan <ctype.h>bir intdeğer döndürür 0. Koşulun 42doğru olduğunu belirtmek için geri dönebilir . Karşılaştırma 42 == truebaşarısız olur.
O olur 0için eşitlik karşılaştırılması, böylece yanlış olduğu düşünülen tek değerdir falseçalışacaktır; if (!cond)ve if (cond == false)aynı şeyi yapın. Ancak bundan faydalanacaksanız, karşılaştırmanın falsetamam olduğunu ve karşılaştırmanın trueolmadığını hatırlamak zorundasınız . Daha da kötüsü, karşılaştırmanın çoğu zamantrue işe yarayacağını (örneğin, eşitlik ve ilişkisel operatörler her zaman ya da verimi sağlar ). Bu, bunu kullanarak girdiğiniz herhangi bir hatanın hala tespit edilmesinin zor olabileceği anlamına gelir. (Endişelenmeyin, kodu önemli bir müşteriye demonte ettikten sonra görünecekler.)01
C ++ biraz farklı kurallara sahiptir; örneğin, booldili biraz daha sıkı bir şekilde tümleşiktir ve türe if (cond)dönüşür . Ancak etkisi (çoğunlukla) aynıdır.condbool
Bazı diğer diller, birinin daha iyi davranışta bulunan booleanlar diyebileceği şeye sahiptir; öyle ki cond == trueve cond == false(veya sözdizimi ne olursa olsun) güvenlidir. Öyle olsa bile, gördüğüm her dilin bir vardır notya !operatör; o orada, o yüzden kullansan iyi edersin. Bence kullanmak cond == falseyerine !condya da yapma not cond, okunabilirliği arttırmak. ( !Bir bakışta karakterin görülmesinin zor olabileceği doğru ; Bazen bundan !kaçınmak için boşluk eklerim .)
Sıklıkla sorunu önleyebilir ve kodu hafifçe yeniden düzenleyerek netliği artırabilirsiniz. Örneğin, yerine:
if (!cond) {
do_this();
}
else {
do_that();
}
yazabilirsin:
if (cond) {
do_that();
}
else {
do_this();
}
Bu her zaman daha iyi değildir , ancak olduğu yerde fırsat aramaktan zarar gelmez.
Özet: C ve C ++, eşitlik karşılaştırmalarda için trueve falsetehlikeli aşırı ayrıntılı ve zayıf stili vardır. Diğer birçok dilde, bu tür karşılaştırmalar tehlikeli olmayabilir, ancak yine de aşırı ayrıntılı ve zayıf stillerdir.