2016-06-04 18 views
5

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?

+2

prova 'if (!! 10 == true)' – BLUEPIXY

+2

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

+1

@ 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

risposta

21

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.)

+1

Non sono sicuro che i termini dei tuoi laici siano veramente laici. ! :) – SergeyA

+0

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

+0

@lllllllllll Ma non è vero? L'espressione in C non viene valutata true se non è zero? – tangrs

-2

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.

+0

Il ragionamento errato all'inizio '1 == true' è vero, anche se' 1' è un numero è una costante 'int' e' true' è un ' bool' costante. –

+0

È 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. –

+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 –

-1

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)

1
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) 
+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

+0

@GManNickG, quindi cos'è' true'? Perché vedo '1' quando I' std: : cout << true << std :: end'? – lllllllllll

+0

'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

Problemi correlati