if(10)
è vero, ma if(10 == true)
è falso. Qualcuno può dirmi perché il primo caso converte il numero in bool ma il secondo caso non lo ha fatto?Perché non posso controllare se una variabile ha un valore usando == true?
risposta
if (10)
è equivalente a if (10 != 0)
, considerando if (10 == true)
è if (10 == 1)
(dal true
viene promosso il valore 1
di tipo int
).
In parole povere: due cose che soddisfano entrambe alcune proprietà non sono automaticamente la stessa cosa.
(ad esempio ciambelle e frisbee sono entrambi rotondi, ma ciò non significa che una ciambella è uguale a un frisbee. Interi e booleani possono entrambi essere valutati in un contesto booleano, ma ciò non significa che ogni intero che valuta come vero è uguale a ogni vero booleana.)
Non sono sicuro che i termini dei tuoi laici siano veramente laici. ! :) – SergeyA
Cosa c'è di sbagliato con le persone su StackOverflow? 'if (10)' NON è equivalente a 'if (10! = 0)'. Probabilmente sono equivalenti l'uno all'altro dopo l'ottimizzazione del compilatore. Si può dire che hanno le stesse conseguenze/esiti/effetti collaterali ma non sono affermazioni equivalenti. – lllllllllll
@lllllllllll Ma non è vero? L'espressione in C non viene valutata true se non è zero? – tangrs
10
è chiaramente non true
, nel senso che è un numero 10
e true
è un boolean
.
Quando ci si trova in un'istruzione if, il compilatore deve valutare la condizione finché non raggiunge un valore vero o falso. Se non raggiunge un vero o un falso, deve convertirlo in un vero o in un falso. Come regola generale, 0
restituisce false e tutto il resto è true.
Quindi if(-1)
è vero, come lo è if(234)
e così via.
L'espressione 10 == true
è già falsa, quindi non è necessaria alcuna ulteriore conversione. if(10)
non è né vero né falso, quindi il compilatore deve convertirlo, usando la nostra regola sopra, e diventa vero.
Il ragionamento errato all'inizio '1 == true' è vero, anche se' 1' è un numero è una costante 'int' e' true' è un ' bool' costante. –
È un po 'più complesso di così, e anche diverso in C e C++.In C++, l'espressione di controllo dell'istruzione 'if' è * convertita contestualmente in' bool' ". In C, le espressioni di controllo vengono confrontate per l'uguaglianza con 0. –
Ah e in C,' true' e 'false' sono macro, che si espandono in '1' e' 0', che sono proprio come un'altra costante di un intero –
Perché sono cose completamente diverse.
In C, tutto ciò che NON è falso è automaticamente vero e C ha una definizione molto rigorosa di false
.
si può pensare if(10)
come if(10 != false)
e allo stesso modo come if (10 == true)
if((10 == true) != false)
if(...)
{
// if statement
}
Per eseguire if
dichiarazione in C++, ...
dovrebbe avere un valore true
.
Quando hai scritto if(10){//something useful}
Penso 10
tratta come int
ma non bool
variabili.Il seguente logica dovrebbe essere applicata poi
if(10) -> if(bool(10)) -> if(true)
Quando si scrive if(10 == true){//something useful}
, secondo lo standard C++, ci dovrebbe essere la seguente logica dietro la scena
if(10 == true) -> if(10 == int(true)) -> if(10 == 1) -> if(false)
Si può scrivere qualcosa di simile
if(10 != false)
o
if(!!10 == true)
anche
if((bool) 10 == true) // alternatively, if(bool (10) == true)
Nella vecchia C
(prima C99
), non c'è false
o true
, ma ci sono 0 o non-0 valori.
Nella moderna C
(da C99
), c'è false
o true
(<stdbool.h>
), ma sono zucchero sintattico rispettivamente 0
e 1
,.
if(10) // evaluates directly since 10 is non-zero value
if(10 == true) -> if(10 == 1) -> if(0)
"true è uno zucchero sintattico per 1 di tipo bool" Huh? Questo non è corretto. non è zucchero sintattico Girando '10 == true' in' 10 == bool (1) 'sta andando nella direzione sbagliata – GManNickG
@GManNickG, quindi cos'è' true'? Perché vedo '1' quando I' std: : cout << true << std :: end'? – lllllllllll
'true' e' false' sono parole chiave e sono valori letterali booleani. Hanno il tipo 'bool' (non' int'). Un valore di tipo 'bool 'è definito come' vero' o 'falso'. Il motivo per cui si vede' 1' è un comportamento di 'std :: ios_base'; per impostazione predefinita, i booleani sono espressi su' int' ed emessi ('t rue' getta a '1',' false' getta a '0'). Puoi cambiare questo comportamento con ['std :: boolalpha'] (http://en.cppreference.com/w/cpp/io/manip/boolalpha). – GManNickG
prova 'if (!! 10 == true)' – BLUEPIXY
il valore di 'vera' può essere qualsiasi cosa (ho visto spesso 1 e! 0 e 2 in vari compilatori. Tuttavia, tutto ciò che non è 0 (falso) può essere testato e il test restituirà 'true'. Ecco perché puoi usare: 'if (10)' ma non 'if (1 == true)' Nell'istruzione 'if' che fallisce, il valore 1 viene confrontato con il valore utilizzato per rappresentare 'true'. In ogni caso, 10 non è 1 (né 2 né! 0) quindi il risultato del confronto è false. – user3629249
@ user3629249: in C++, 'true' è un valore booleano che verrà convertito con precisione in 1 se promosso a un intero.Penso che sia coerente con c99, data l'inclusione di 'stdbool.h'. – rici