2014-07-02 16 views
20

Perché la condizione in questo codice è true?Perché un valore letterale stringa vuoto è considerato true?

int main () 
{ 

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

    return 0; 
} 
+14

Perché "" "è un puntatore non-' NULL'. – Jesper

+6

'" "' come espressione valuta un indirizzo non nullo, non null in booleano eval-speak significa non-falso. – WhozCraig

+3

In realtà, non vedo una ragione per cui questo dovrebbe essere così sottovalutato. La domanda è buona, è al punto, il codice è mostrato l'autore ha solo bisogno di una risposta di cui non è a conoscenza. Perché tanto odio? –

risposta

29

Una condizione è considerata "vera" se si restituisce qualcosa di diverso da 0 *. "" è un array const-array che contiene un singolo carattere \0. Per valutare questo come una condizione, il compilatore "decaduta" la matrice su const char*. Poiché lo const char[1] non si trova all'indirizzo 0, il puntatore non è zero e la condizione è soddisfatta.


* Più precisamente, se si restituisce true dopo essere stato convertito in modo implicito bool. Per tipi semplici questo equivale a qualcosa di diverso da zero, ma per i tipi di classe devi considerare se è definito operator bool() e cosa fa.

§ 4.12 dal C++ 11 progetto spec:

4.12 conversioni booleane [conv.bool]

Un prvalue dell'aritmetica, censimento unscoped, puntatore o puntatore al Tipo di utente possono essere convertiti ad un valore di tipo bool. Un valore zero, un valore di puntatore nullo, o un valore di puntatore membro nullo viene convertito in falso; qualsiasi altro valore è convertito in true. Un valore di pren di tipo std :: nullptr_t può essere convertito in un valore di tipo bool; il valore risultante è falso.

+11

È un 'const char [1]'. – chris

+2

@chris Lo è, ma per essere valutato come condizione deve essere convertito in 'const char *', corretto? – dlf

+4

Sì, decade, ma non è un puntatore per cominciare. Poiché l'intera stringa letterale è una cosa sbagliata, ritengo importante chiarirlo. – chris

3

Perché "" decade ad un char const* e tutti i puntatori non Null restituiscono true se o quando convertito in un valore booleano.

0

Siete probabilmente proveniente da un languange come PHP, in cui il controllo viene elaborato diverso:

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

Questo stamperà la X, ma non Y perché la stringa vuota non ha alcun valore.

Come altri hanno sottolineato, in C++ è un puntatore non nullo, quindi valutato come vero.

Problemi correlati