2013-07-21 16 views
5

In C++, di solito controlla un puntatore se è nullo o no, so solo che dovremmo usareNULL == puntatore

if(NULL == ptr) 

invece di:

if(ptr == NULL) 

Voglio sapere perché?

In additiol, se vogliamo inizializzare un ptr su null, dovremmo usare ptr = NULL o ptr = 0? sì, lo so in C++, di solito usiamo ptr = nullptr, voglio sapere perché dovremmo fare questo voglio solo unificare il codice? grazie

+6

Di solito scrivo 'if (! Ptr)'. È più breve e meno ridondante. – glglgl

+0

Qui sono un po 'confuso, se la tua domanda è perché non puoi usare 'NULL == ptr' invece di' ptr == NULL' o la tua domanda è perché non puoi usare '=' invece di '== '? – Ravi

+0

Ho posto due domande – minicaptain

risposta

12

E 'uno stile di codifica (chiamato Yoda Conditions) di evitare di scrivere = invece di == in un se-dichiarazione, è valido per utilizzare l'assegnazione = in una dichiarazione if-, ma non è di solito quello che vuoi.

Personalmente, preferisco non usarlo in questo modo perché è difficile da leggere e i compilatori moderni ti avviseranno quando usi = in un'istruzione if.

Si noti inoltre che:

  1. if(ptr == NULL) è lo stesso con if(!ptr).
  2. C++ 11 ha introdotto nullptr da sostituire utilizzando NULL. Quindi, per inizializzare un puntatore nullo, è preferito usare ptr = nullptr

proposito perché usare nullptr oltre NULL:

Prima di C++ 11, NULL di solito è implementato internamente come #define NULL 0, ma il problema è, 0 è anche lo zero intero. Potrebbe causare problemi in alcune situazioni. Per esempio:

void func(int n); 
void func(char *s); 

func(NULL); //call which function? 

Anche se l'auther implica che NULL è un tipo di puntatore, ma il compilatore è sufficiente sapere per chiamare func(0). Quindi verrà chiamata la prima versione.

Utilizzando func(nullptr), il compilatore saprà che è un puntatore e chiama la seconda versione.

+0

+1, ma vorrei sottolineare che il problema è che '=' è * assegnazione * anche in un condizionale - questo spesso confonde i principianti. Questo è sempre assunto in questa risposta, ma mai dichiarato esplicitamente. –

+1

È 'nullptr', non' null_ptr'. –

+0

sì nella mia seconda domanda, so che dovremmo usare nullptr, voglio sapere perché? voglio solo unificare lo stile del codice? – minicaptain

1

Utilizzando l'uguaglianza yoda impedisce alcuni errori come l'utilizzo di un singolo = o il tentativo del compilatore di determinare un numero intero da un puntatore intelligente.

È noto

Ho trascorso due giorni rintracciare tale errore come pensano Yoda è una cattiva idea.

Problemi correlati