2011-05-02 15 views

Odpowiedz

26

Zastosowanie NULL == condition zapewnia bardziej użyteczne działanie w przypadku typo, gdy operator przypisania = ta zostanie przypadkowo użyta, a następnie operator porównanie ==:

if (bCondition = NULL) // typo here 
{ 
// code never executes 
} 

if (NULL = bCondition) // error -> compiler complains 
{ 
// ... 
} 

kompilator C daje ostrzeżenia w pierwszym przypadku, nie ma takich ostrzeżeń w wielu językach.

+0

Czy on mówi o '=' lub '=='? –

+0

Myślę, że pyta o "=="? – Jess

+1

@Jess: Głównym celem jest to, że jeśli ktoś zapomni umieścić operatora przypisania zamiast operatora porównania.it będzie wyświetlał błąd.i dlaczego w witrynach msdn używają porównań takich jak te NULL == bCondition – karthik

8

Wiele osób woli pisać NULL == bCondition, aby przypadkowo nie przypisać wartości NULL do bCondition.

powodu literówki zdarza się, że zamiast pisać

bCondition == NULL 

one skończyć pisanie

bCondition = NULL // the value will be assigned here. 

w przypadku

NULL = bCondition // there will be an error 
4

To po prostu dobry środek obronny. Niektórym może również wygodniej czytać. W przypadku błędnego przypisania zamiast operatora równości, kompilator spróbuje zmodyfikować NULL, który nie jest lwartością i spowoduje wyświetlenie komunikatu o błędzie. Podczas korzystania z bCondition = NULL kompilator może wygenerować ostrzeżenie o użyciu przypisania jako wartości prawdziwej, wiadomości, która może zostać zgubiona i niezauważona.

+0

Może masz błędne wyrazy "lwartości" i "rwartości"? – beduin

+6

Niektórzy z nas uważają, że czytanie jest bardzo niewygodne. Przynajmniej to oczywiście powoduje, że ludzie pytają, dlaczego ktoś to zrobił! :-) –

+0

@beduin: tak, dziękuję za uwagę. –

10

Nazywa się Yoda Conditions. (The original link, potrzebujesz wysokiego powtórzenia, aby go zobaczyć).

Jest przeznaczony do ochrony przed przypadkowym przeniesieniem = w warunkach, w których zamierzano dokonać porównania równości ==. Jeśli trzymasz się Yody przez nawyk i robisz literówkę pisząc = zamiast ==, kod nie powiedzie się, ponieważ nie możesz przypisać do wartości r.

Czy to jest warte niezręczności? Niektórzy nie zgadzają się, mówiąc, że kompilatory wyświetlają ostrzeżenie, gdy widzą wyrażenia warunkowe w postaci =. Mówię, że po prostu popełniłem ten błąd dwa lub trzy razy w ciągu mojego życia, co nie usprawiedliwia zmiany wszystkich MLOC, które napisałem w moim życiu na tę konwencję.

+1

+1 również, szkoda, że ​​link jest już martwy. – Flavius

+6

@Flavius: nie jest dokładnie martwy, wystarczy mieć wystarczającą liczbę powtórzeń, aby go zobaczyć. Nie mogę uzyskać trendu moderatorów na SO, aby usunąć wszystko. Mógłby zostać przynajmniej przeniesiony do programisty SE. – ybungalobill

+1

Na stronie WiKi znajduje się strona [WiKi] (http://en.wikipedia.org/wiki/Yoda_conditions). –

8

Nie ma różnicy. To starożytna metoda programowania obronnego, która od ponad 20 lat jest przestarzała. Celem było zabezpieczenie przed przypadkowym wpisaniem = zamiast == przy porównywaniu dwóch wartości. Pasjansowi programiści migrujący do C byli szczególnie skłonni do napisania tego błędu.

Od Borland Turbo C wydany w 1990 roku i do przodu, każdy znany kompilator ostrzega przed "prawdopodobnie niepoprawnym przypisaniem", kiedy uda ci się wpisać ten błąd.

Zatem pisanie (NULL == bCondition) nie jest lepszą lub gorszą praktyką niż odwrotnie, chyba że twój kompilator jest bardzo stary. Nie musisz się martwić o pisanie ich w dowolnej kolejności.

Co powinny przejmuj się, jest dostosowanie stylu kodowania, gdzie nigdy zapisu zadania wewnątrz pętli IF/warunki. Nigdy nie ma powodu, aby to robić. Jest to całkowicie zbędna, ryzykowna i brzydka cecha języka C. Wszystkie branżowe standardy kodowania de facto zakazują przydziału w warunkach.

Referencje:

  • MISRA C: 2004 13,1
  • CERT C EXP18-C
+0

MSVC, przynajmniej domyślnie, nie ostrzega przed tym błędem. – shebaw

+2

@shebaw Imponujące, że udało im się zrobić kompilator, który jest gorszy niż TC od 1991 roku. Zdobądź nowy kompilator. – Lundin

+2

+1 za najlepszą odpowiedź. Nie cierpię stylu Yoda. Jest wiele lepszych sposobów na uniknięcie tej wady języka, niż pisanie wstecz. –

1

Podczas zwykle nie ma różnicy między variable == value i value == variable, aw zasadzie nie powinnam” T być, w C++ czasami może być różnica w ogólnym przypadku, jeśli w grę wchodzi przeciążenie operatora. Na przykład, chociaż oczekuje się, że == będzie symetryczny, ktoś mógłby napisać patologiczną implementację, która nie jest.

Klasa string Microsoft _bstr_t ma problem z asymetrią w implementacji operator==.

+0

Istnieją ważne przypadki dotyczące asymetrii. Np. Podczas implementacji inteligentnego wskaźnika, ma sens mieć operatora == wewnątrz klasy, który przyjmuje surowy wskaźnik jako argument. W takiej sytuacji przywrócenie zamówienia spowoduje błąd kompilacji. – SomeWittyUsername

Powiązane problemy