C ve bazı benzer dillerde, için eşitlik boolean ifadeleri karşılaştırarak false
veya true
tehlikeli bir alışkanlıktır.
C'de herhangi bir skalar ifade (sayısal veya işaretçi), örneğin bir if
deyimin 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 cond
işaretçi tiptedir, 0
bir 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 cond
sıfır değilse ilk doğrudur ; İkincisi, yalnızca true
C'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 int
değer döndürür 0
. Koşulun 42
doğru olduğunu belirtmek için geri dönebilir . Karşılaştırma 42 == true
başarısız olur.
O olur 0
iç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 false
tamam olduğunu ve karşılaştırmanın true
olmadığı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.)0
1
C ++ biraz farklı kurallara sahiptir; örneğin, bool
dili biraz daha sıkı bir şekilde tümleşiktir ve türe if (cond)
dönüşür . Ancak etkisi (çoğunlukla) aynıdır.cond
bool
Bazı diğer diller, birinin daha iyi davranışta bulunan booleanlar diyebileceği şeye sahiptir; öyle ki cond == true
ve cond == false
(veya sözdizimi ne olursa olsun) güvenlidir. Öyle olsa bile, gördüğüm her dilin bir vardır not
ya !
operatör; o orada, o yüzden kullansan iyi edersin. Bence kullanmak cond == false
yerine !cond
ya 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 true
ve false
tehlikeli 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.