2014-07-02 12 views
20

Dlaczego ten kod jest podany na true?Dlaczego pusty tekst literału traktowany jest jako prawdziwy?

int main () 
{ 

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

    return 0; 
} 
+14

Ponieważ '" "' jest wskaźnikiem innym niż "NULL". – Jesper

+6

'' "' jak wyrażenie odnosi się do adresu innego niż zerowy, wartość niezerowa w bajkowym eval-speak oznacza nie-fałsz. – WhozCraig

+3

Właściwie nie widzę powodu, dla którego powinno to być tak bardzo odrzucone. Pytanie jest dobre, do rzeczy, kod jest pokazany, autor potrzebuje tylko odpowiedzi, której nie zna. Dlaczego tak bardzo nienawidzisz? –

Odpowiedz

29

Warunkiem jest uważane za „prawdziwe”, jeśli ma wartość inną niż 0 *. "" to stała tablica znaków zawierająca pojedynczy znak \0. Aby ocenić to jako warunek, kompilator "rozprasza" tablicę na const char*. Ponieważ const char[1] nie znajduje się pod adresem 0, wskaźnik jest niezerowy i warunek jest spełniony.


* Dokładniej, jeśli ocenia się true po niejawnie konwertowane do bool. W przypadku typów prostych oznacza to to samo, co niezerowe, ale w przypadku typów klas należy rozważyć, czy zdefiniowano operator bool() i co robi.

§ 4.12 ze C++ 11 projekcie specyfikacji:

4.12 logiczne konwersji [conv.bool]

prvalue arytmetyczne, unscoped wyliczenia wskaźnika lub kursora rodzaju człon może być przekształcany do wartości prime bool. Wartość zerowa, zerowa wartość wskaźnika, lub wartość wskaźnika elementu zerowego jest konwertowana na wartość false; każda inna wartość to skonwertowana na wartość true. Wartość progowa typu std :: nullptr_t może zostać przekonwertowana na na prvalue typu bool; wynikowa wartość jest fałszywa.

+11

To jest 'const char [1]'. – chris

+2

@chris Jest, ale aby zostać oceniony jako warunek musi zostać przekonwertowany na 'const char *', prawda? – dlf

+4

Tak, to rozpada się, ale nie jest to wskaźnik na początek. Ponieważ cały ciąg literalny będący wskaźnikiem jest tak powszechnym błędem, uważam za ważne wyjaśnienie. – chris

3

Ponieważ "" rozpady do char const* i wszystkie non-zerowe wskaźniki oceny do true czy i po przeliczeniu na wartość logiczną.

0

Prawdopodobnie pochodzących z languange jak PHP, gdzie kontrola jest przetwarzane inaczej:

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

to będzie wydrukować X, Y, ale nie dlatego, że pusty ciąg nie ma żadnej wartości.

Jak zauważyli inni, w C++ jest to wskaźnik inny niż zero, który jest oceniany jako prawdziwy.

Powiązane problemy