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;
}
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;
}
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.
Bu, const const [1] 'dır. – chris
@chris Bu, ancak "const char *" 'e dönüştürülmesi gereken bir koşul olarak değerlendirilmeli, doğru mu? – dlf
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
""
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ü:
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.
Çünkü "" "olmayan bir" NULL "işaretçisidir. – Jesper
'" "" ifadesi, null olmayan bir adrese değerlendirir, null olmayan bir boolean değerlendirmesinin anlamı, false anlamına gelir. – WhozCraig
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? –