Perché la condizione in questo codice è true
?Perché un valore letterale stringa vuoto è considerato true?
int main ()
{
if ("")
cout << "hello"; // executes!
return 0;
}
Perché la condizione in questo codice è true
?Perché un valore letterale stringa vuoto è considerato true?
int main ()
{
if ("")
cout << "hello"; // executes!
return 0;
}
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.
Perché ""
decade ad un char const*
e tutti i puntatori non Null restituiscono true
se o quando convertito in un valore booleano.
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.
Perché "" "è un puntatore non-' NULL'. – Jesper
'" "' come espressione valuta un indirizzo non nullo, non null in booleano eval-speak significa non-falso. – WhozCraig
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? –