2017-10-19 76 views
6

Powiedzmy a jest wskaźnik, a po przydzielania pamięci dla niej, chcę sprawdzić, czy pamięć została przydzielona powodzeniem, widziałem dwa sposoby w ten sposób:W języku C, jest warunek: "if (a! = NULL)" taki sam jak warunek "if (a)"?

if(a != NULL) 

if(a) 

Jaka jest różnica między pierwszym i drugie stwierdzenia?

+4

Skończą jako takie same. – Steve

+0

NULL to makro, które jest zazwyczaj zdefiniowane jako 0, więc pierwsze wyrażenie jest takie samo jak (a! = 0), drugie sprawdza również, czy a! = 0, więc jest to ta sama edycja: zwykle –

+0

Tak, jeśli * 'a' * jest wskaźnikiem, może być inny, jeśli 'a' nie jest wskaźnikiem w zależności od definicji' NULL'. –

Odpowiedz

0

(a! = NULL) zwraca wartość logiczną, która jest identyczna dla (a). Instrukcja if zwraca wartość false, jeśli zawartość jest równa 0, a true w przeciwnym razie. NULL oznacza 0, więc jeśli a == 0, jeśli zwraca false. To jest dokładnie to samo dla kompilatora.

Mam nadzieję, że to pomoże!

0

Nie ma różnicy funkcjonalnej; są one równoważne i obaj testują wskaźnik zerowy.

Wszelkie preferencje są czysto subiektywne. Po prostu skorzystaj z tego, co lubisz, lub tego, co śledzą twoi koledzy programistami w twoim projekcie/organizacji.

+0

Czy mógłbyś trochę rozwinąć? – Marievi

2

to stan: if(a != NULL) taki sam jak stan if(a)?

Osiągają ten sam cel. Jedyną różnicą jest czytelność.

Ich efekt jest taki sam, ponieważ spowoduje to to samo.

NULL jest makro, które jest prawie zawsze 0, więc:

if(a != NULL) 

odpowiada:

if(a != 0) 

który jest całkiem podobny do:

if(a) 

ponieważ będzie sprawdź, czy wyrażenie a ma wartość true.

Tak więc, jeśli a jest wskaźnikiem, będą one takie same. Jeśli nie, to będzie zależeć od tego, jak zdefiniowano NULL (co, jak powiedziałem, jest almost always 0).

+1

Czy mógłbyś trochę rozwinąć? – Marievi

+0

pewny @Marievi, po drodze. – gsamaras

1

Według c faq:

if (p) jest równoważne if (! P = 0)

i to jest kontekst porównanie, tak kompilator może powiedzieć, że (implicite) 0 jest w rzeczywistości wskaźnikiem pustym o stałej wartości i używa poprawnej wartości wskaźnika zerowego. Nie ma tutaj żadnego oszustwa; kompilatory działają w ten sposób i generują identyczny kod dla obu konstrukcji. Wewnętrzna reprezentacja wskaźnika pustego nie ma znaczenia.