2009-09-25 10 views
27

if (c) corrisponde a if (c == 0) in C++?Come viene valutata l'istruzione in C++?

+2

Ricordare che 0 non significa sempre la stessa cosa. Può essere la costante del puntatore nullo o zero intero. –

+3

Non intendi "È se (c) è lo stesso di if (c! = 0) in C++?" ? –

+0

La variabile c di un tipo particolare? –

risposta

44

No, if (c) è lo stesso di if (c != 0). E if (!c) corrisponde a if (c == 0).

+9

Supponendo che non ci sia un sovraccarico strano luogo, che è spesso parte della risposta in C++. –

+6

Naturalmente, se gli operatori == o! = Sono sovraccarichi, potrebbe succedere di tutto, potrebbe anche iniziare a suonare l'inno nazionale per te ... ;-) – Jesper

+9

Uno di questi giorni ho intenzione di fare una classe che sovraccarichi gli operatori per riprodurre effetti sonori. Sarà fantastico ogni volta che qualcuno vorrà organizzarli. – rlbond

3

E 'più come if (c != 0)

Naturalmente, != operatore può essere sovraccaricato quindi non è perfettamente esatto dire che quelle sono esattamente uguali.

0

Sì, sono gli stessi se si modifica == 0 in != 0.

+0

Uh, no, non lo sono. – Aistina

+0

L'istruzione if è * definita * per accettare qualsiasi cosa diversa da zero come vera. Quindi sì è lo stesso. –

21

Mi rompo dal pacchetto su questo ... "if (c)" è il più vicino a "if (((bool)c) == true)". Per i tipi interi, significa "if (c != 0)". Come altri hanno sottolineato, sovraccaricare operator != può causare qualche stranezza, ma può sovraccaricare "operator bool()" a meno che non mi sbagli.

+1

La domanda è stata originariamente taggata con solo C, quindi le risposte di cui sopra in quanto non c'è bool in C. –

+3

if (static_cast (c)) ... Prenderò il mio cappotto. –

+0

C99 ha Bool ... – rlbond

0

Ciò vale solo per i valori numerici. se c è classe, ci deve essere un operatore di overload che fa conversione booleana, come qui:

#include <stdio.h> 

class c_type 
{ 
public: 
    operator bool() 
    { 
     return true; 
    } 
}; 

int main() 
{ 
    c_type c; 
    if (c) printf("true"); 
    if (!c) printf ("false"); 
} 
6

Se c è un puntatore o un valore numerico,

if(c) 

è equivalente a

if(c != 0) 

Se c è un valore booleano (tipo bool [solo C++]), (edit: o un tipo definito dall'utente con il sovraccarico del bool operatore())

if(c) 

è equivalente a

if(c == true) 

Se c è né un puntatore o un valore numerico né un booleano,

if(c) 

non viene compilato.

+2

C è un tipo definito dall'utente, si può semplicemente implementare 'operator bool()' come indicato da D. Shawley e galets, quindi verrà compilato correttamente. – Troubadour

+0

Esatto, lo aggiungo alla spiegazione –

-5

Se c è un puntatore, allora la prova

if (c) 

non è esattamente la stessa

if (c != 0) 

Quest'ultimo è un controllo diretto di c contro la (Null) puntatore 0 mentre la prima è in realtà un'istruzione per verificare se c è il punto di un oggetto valido. In genere i compilatori producono lo stesso codice però.

+0

no, non è ... entrambi significano assolutamente lo stesso nel caso di un puntatore: if (c! = NULL) – Massa

+0

Non c'è modo per la compilazione e/o il runtime di sapere se un oggetto è valido in C o C++. È possibile scrivere: "X * c = (X *) 1;" Quindi quasi certamente punta a un oggetto non valido. E "se (c)" sarà vero. –

+0

@Andrew: Dubito che tu possa giustificare la tua affermazione che non c'è modo di verificare se l'oggetto è valido o meno. Certamente, il compilatore richiede molto sforzo per generare un codice run-time da controllare ed è per questo motivo che i compilatori non si preoccupano di generare lo stesso codice, cioè il test contro il puntatore nullo. Ecco perché il tuo esempio non riesce a produrre un risultato falso su (probabilmente) tutti i compilatori correnti. – Troubadour

Problemi correlati