2013-07-21 18 views
5

W C++, zwykle sprawdzić wskaźnik czy jest null lub nie, ja po prostu wiem, powinniśmy używaćNULL == wskaźnik

if(NULL == ptr) 

zamiast:

if(ptr == NULL) 

Chcę wiedzieć, dlaczego?

W additiol, jeśli chcemy zainicjować wartość ptr na zero, czy powinniśmy użyć ptr = NULL lub ptr = 0? tak wiem w C++, zwykle używamy ptr = nullptr, chcę wiedzieć, dlaczego mamy to zrobić po prostu chcesz zunifikować kod? Dzięki

+6

Zwykle piszę "jeśli (! Ptr)". Jest krótszy i mniej zbędny. – glglgl

+0

Jestem tu trochę zakłopotany, czy pytanie brzmi: dlaczego nie możesz użyć 'NULL == ptr' zamiast' ptr == NULL' lub twoje pytanie brzmi: dlaczego nie możesz użyć '=' zamiast '== '? – Ravi

+0

Zadałem dwa pytania: – minicaptain

Odpowiedz

12

Jest to styl kodowania (nazwane Yoda Conditions), aby uniknąć pisania = zamiast == w if-oświadczenie, że to ważne, aby użyć zadanie = w if-oświadczenie, ale to nie jest zwykle to, co chcesz.

Osobiście wolę tego nie używać, ponieważ jest to trudne do odczytania, a nowoczesne kompilatory ostrzegą użytkownika, gdy użyje się instrukcji = w instrukcji if.

Należy również pamiętać, że:

  1. if(ptr == NULL) samo jest z if(!ptr).
  2. C++ 11 wprowadzono nullptr w celu zastąpienia za pomocą NULL. Tak aby zainicjować pustego wskaźnika, to korzystne jest stosowanie ptr = nullptr

dlaczego używać nullptr nad NULL:

Przed C++ 11, NULL jest zazwyczaj realizowane wewnętrznie jako #define NULL 0, ale problemem jest to, 0 jest także liczba całkowita zero. Może to powodować problemy w niektórych sytuacjach. Na przykład:

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

func(NULL); //call which function? 

Choć auther oznacza, że ​​NULL jest rodzajem wskaźnika, ale kompilator po prostu wiem zadzwonić func(0). Tak więc pierwsza wersja zostanie wywołana.

Przy użyciu func(nullptr) kompilator będzie wiedział, że jest wskaźnikiem i wywołuje drugą wersję.

+0

+1, ale chciałbym zwrócić uwagę, że problem polega na tym, że '=' to * zadanie * nawet w trybie warunkowym - często dezorientuje początkujących. Jest to zawsze przyjęte w tej odpowiedzi, ale nigdy nie zostało wyraźnie określone. –

+1

To 'nullptr', a nie' null_ptr'. –

+0

tak w moim drugim pytaniu, wiem, że powinniśmy używać nullptr, chcę wiedzieć dlaczego? tylko chcesz zunifikować styl kodu? – minicaptain

1

Stosowanie równania Yoda zapobiega pewnym błędom, takim jak użycie pojedynczego = lub gdy kompilator próbuje określić liczbę całkowitą ze wskaźnika inteligentnego.

Wiadomo

spędziłem dwa dni tropienie tego błędu, jak oni myślą Yoda jest złym pomysłem.

Powiązane problemy