2014-07-02 27 views
20

Bu koddaki koşul neden true? 0 * dışında bir şey olarak değerlendirilirseBoş bir dize literal neden doğru olarak değerlendiriliyor?

int main () 
{ 

    if ("") 
     cout << "hello"; // executes! 

    return 0; 
} 
+14

Çünkü "" "olmayan bir" NULL "işaretçisidir. – Jesper

+6

'" "" ifadesi, null olmayan bir adrese değerlendirir, null olmayan bir boolean değerlendirmesinin anlamı, false anlamına gelir. – WhozCraig

+3

Aslında bu kadar fazla düşürülmesi gereken bir sebep göremiyorum. Soru güzel, konuya göre, kodun yazarın farkında olmadığı bir cevaba ihtiyacı olduğu gösteriliyor. Neden bu kadar çok nefret? –

cevap

29

bir koşul "gerçek" olarak kabul edilir. "", tek bir \0 karakterini içeren bir const char dizisidir. Bunu bir koşul olarak değerlendirmek için, derleyici diziyi const char* olarak "bozar". const char[1] adres 0'da bulunmadığından işaretçi sıfır değildir ve koşul karşılanır. o true olarak değerlendirilirse


* Daha doğrusu, örtük bool dönüştürülür sonra. Basit türler için bu, sıfırla aynı şeyle aynıdır, ancak sınıf türleri için, operator bool()'un tanımlanıp tanımlanmadığını ve ne yaptığını düşünmeniz gerekir.

C++ 11 taslak spec § 4.12:

4,12 Boole dönüşüm [conv.bool]

elemanı tipine aritmetik, unscoped numaralandırma, işaretçi ya da ibrenin bir prvalue dönüştürülebilir boole tipi bir değere. Sıfır değeri, boş gösterici değeri, veya null üye işaretçi değeri false değerine dönüştürülür; diğer herhangi bir değer doğruya dönüştürülür. Std :: nullptr_t türünde bir prvalue, türünde bir boole tipine dönüştürülebilir; Ortaya çıkan değer yanlıştır.

+11

Bu, const const [1] 'dır. – chris

+2

@chris Bu, ancak "const char *" 'e dönüştürülmesi gereken bir koşul olarak değerlendirilmeli, doğru mu? – dlf

+4

Evet, bozuluyor, ancak başlamak için bir işaret değil. Bütün dize hazırlayıcıları işaretçi olayı gibi yaygın bir yanlış anlama olduğu için, açıklığa kavuşturmayı önemli buluyorum. – chris

3

"" bir char const* zayıflar ve ya bir mantıksal değere dönüştürüldüğünde eğer boş olmayan tüm işaretçiler true için değerlendirmek çünkü.

php -r 'echo "X";if ("") echo "Y";' 

THis X yazdırır, ancak Y boş dize değeri yoktur, çünkü:

0

Muhtemelen onay farklı işlenir PHP, böyle bir languange geliyor.

Diğerlerinin de işaret ettiği gibi, C++'da null olmayan bir işaretçi olduğu için doğru olarak değerlendirilir.

İlgili konular