2008-09-29 22 views

cevap

37

, her zaman eşdeğer Kodunuz böylece olduğu 1. geçirilmeleri:

main(){ 
    int a = 10; 
    if (1 == a) 
     cout<<"y i am not getting executed"; 
    } 

Bu C++ standard parçasıdır, bu yüzden ne olmasını beklediğiniz şey Her C++ standartlarına uyumlu derleyici ile.

+0

"Her zaman doğruya dönüştürülür" yerine "her zaman 1'e dönüştürülür" demek istediğimi düşünüyorsunuz –

+1

Belki de boole int dönüştüğü için int dönüşen bool'un neden hızlı bir açıklaması olabilir? Demek istediğim, "çünkü C++ standardı öyle diyor ki" çoğu, ama yine de ... –

+0

"true" nin int'ye dönüştürüldüğünde değeri derleyiciye özel mi, yoksa standardın bir parçası mı? –

2

Gerçek 1 olduğundan. Sıfır olmayan bir değer için sınamak isterseniz, (a) ifadesini yazın.

+2

EEK İşte –

+0

Bu 5 ekstra karakter, çünkü operatör ile işlenenleri arasında boşluklar ekleyeceğim;) – OregonGhost

+0

Oh, iyi, bu durumda noktayı aldım;) Eğer (a) işaretçiler için çok, bir çeşit "eğer" varsa bir "dir. Ama sonunda, benim için gerçekten yardımcı olmadığına karar verdim ve verdim. –

5

Kişisel boolean bir tamsayı terfi ve 1.

-1

Ben bu kod tanımlanabilir istemem olur ve size derleyici size vereceği her türlü davranış bağımlı olmamalıdır edilir. Muhtemelen gerçek bir int (1) 'e dönüştürülür ve beklediğiniz gibi bir boole (true) dönüştürülmez. Ne demek istediğini yazmak daha iyidir (a! = 0) o zaman buna bağlı olarak (tanımlanmış olsa bile). (Bu yanlış) 0'dan farklı

-1

şey

-2

bir boolean C/C++ biraz ve gerçek 1 ile temsil edildiği için, yanlış 0

tarafından (diğer bir deyişle 1) doğru gerekli değildir

Güncelleme: yorumda belirtildiği gibi orijinal Cevabım yanlıştır. O zaman baypas et.

+0

C/C++, boolean'ın biraz olması için reçete yazmaz. C++ bool boyutunda uygulama bağımlıdır. C bool tipine sahip değildir - gerçekten tamsayıdır. –

+0

C99, #include tarafından etkinleştirilen, türden bir boole türüne sahiptir. Ancak boole tipinin C veya C++ cinsinden bir miktar olmadığını kabul ediyorum. –

-2

Gerçek 1'e eşit olduğu için. Bir ön-prosedüre direktifinde tanımlanmıştır, bu yüzden içinde true olan tüm kodlar derleme zamanından önce 1'e dönüştürülür. Bir Bool gerçek int dönüştürüldüğünde

+0

Tha sadece yanlış! Doğru ve yanlış, dilde tanımlanmış sembollerdir ve ön işlemciyle hiçbir ilgisi yoktur (DOĞRU ve yanlış ile eski C'den farklı olarak)! – PierreBdR

26

Baskı ifadenizin gerçekleştirilmemesinin nedeni, boole'nizin örtülü olarak başka bir yol yerine bir sayıya dönüştürülmesidir. Yani (1 == a)

Açıkça bir mantıksal dönüştürerek ilk bu sorunu alabilir:

main(){ 
int a = 10; 
if (((bool)a) == true) 
    cout<<"I am definitely getting executed"; 
} 

C/C++ 0 olarak temsil edilir sahte senin eğer deyimi bu eşdeğerdir.

Diğer her şey sıfır olarak temsil edilir. Bu bazen 1, bazen başka bir şey. Yani, asla eşitliği (==) doğru olan bir şeye test etmemelisiniz. Yerine, yanlış olan bir şeye eşitlik testi yapmalısınız. Sahte yalnızca 1 geçerli değere sahiptir. İşte

biz bunların hiçbirini iyi, olmayan tüm yanlış değerler için test ediyoruz:

main(){ 
int a = 10; 
if (a) 
    cout<<"I am definitely getting executed"; 
} 

Ve bir üçüncü örnek sadece (bir false false olarak kabul edilir herhangi bir tamsayı karşılaştırmak güvenli olduğunu kanıtlamak için olan) sadece 0'dır:

C ve C++ içinde
main(){ 
int a = 0; 
if (0 == false) 
    cout<<"I am definitely getting executed"; 
} 
+0

işlev stili dönüşümü veya C++ kalıbı kullanın. C tarzı davalar kötülüktür. 'bool (a)' veya 'static_cast (a)'. – Aaron

+0

Aaron, saçma sapan özür dileriz :) "işlev stili döküm", semantik olarak (T) x stili bir oyuncuya eşdeğerdir ve ek olarak belirsizlikleri de ortaya çıkarır. Bir şey varsa, bu bir tat meselesidir, fakat T (x) muhtemelen (T) x'den daha fazla problemi vardır. –

3

, 0 yanlış ve sıfır şey ama doğrudur:

if (0) 
{ 
// never run 
} 

if (1) 
{ 
// always run 
} 

if (var1 == 1) 
{ 
// run when var1 is "1" 
} 

Derleyici bir boole ifadesi hesapladığında 0 veya 1 üretmesi gerekir.Ayrıca, ifadelerinizde 1 ve 0 yerine "true" ve "false" kullanmanıza izin veren bir çift kullanışlı typedefs ve tanımlar.

Yani kod aslında şuna benzer:

main(){ 
int a = 10; 
if (1 == a) 
    cout<<"y i am not getting executed"; 
} 

Muhtemelen istiyorum:

main(){ 
int a = 10; 
if (true == (bool)a) 
    cout<<"if you want to explicitly use true/false"; 
} 

ya gerçekten sadece:

main(){ 
int a = 10; 
if (a) 
    cout<<"usual C++ style"; 
} 
1

Sana uyaran bir derleyici geçiş önermek Bu konuda ... (VC++ bunu verir: uyarı C4806: '==': güvensiz çalışma: değeri yok 'int' türüne yükseltilen 'bool' tipi, verilen sabite eşit olabilir; Elimde başka bir derleyici yok.)

Lou Franco'yla aynı fikirdeyim - bir değişkenin sıfırdan büyük (ya da bunun eşitsiz) olup olmadığını bilmek istersiniz, bunun için test edin. Son detayı bilmiyorsanız, derleyici tarafından dolaylı olarak yapılan her şey tehlikelidir. Ben de gördük

main(){ 
int a = 10; 
if (a) // all non-zero satisfy 'truth' 
    cout<<"y i am not getting executed"; 
} 

:

main(){ 
int a = 10; 
if (!!a == true) // ! result is guaranteed to be == true or == false 
    cout<<"y i am not getting executed"; 
} 
0

çoğu insan kodu bu tür yazma yoludur. Sıfır olmayan bir değer için test etmek isterseniz, yazınız (a! = 0). Gerçekte düşündüğünüzü söylemek için 3 karakter daha, dilin düşündüğünüzle eşdeğer olduğunu söylemek yerine. Pazarlık etmek.
İlgili konular