Qual è la differenza tra questi (bCondition == NULL) e (NULL == bCondition)?

Durante l’esplorazione dei siti msdn, la maggior parte delle condizioni controlla i luoghi che stanno utilizzando (NULL == bCondition).

qual è lo scopo di utilizzare queste notazioni?

Fornire alcuni esempi per spiegare questi per favore.

Grazie.

L’uso della NULL == condition fornisce un comportamento più utile nel caso di un errore di battitura, quando un operatore di assegnazione = viene usato per errore piuttosto che l’operatore di confronto == :

 if (bCondition = NULL) // typo here { // code never executes } if (NULL = bCondition) // error -> compiler complains { // ... } 

Il C-compiler dà un avvertimento nel primo caso, non ci sono avvertimenti in molte lingue.

Si chiama Yoda Conditions . (Il link originale , hai bisogno di un alto rappresentante per vederlo).

Ha lo scopo di evitare assegnazioni accidentali = in condizioni in cui era previsto un confronto di uguaglianza == . Se ti attacchi a Yoda per abitudine e fai un errore scrivendo = invece di == , il codice non verrà compilato perché non puoi assegnarlo a un valore.

Vale la pena l’imbarazzo? Alcuni non sono d’accordo, affermando che i compilatori emettono un avviso quando vedono = in espressioni condizionali. Dico che è semplicemente accaduto solo due o tre volte nella mia vita per fare questo errore, il che non giustifica la modifica di tutti gli MLOC che ho scritto nella mia vita a questa convention.

Molte persone preferiscono scrivere NULL == bCondition in modo che accidentalmente non assegnino il valore NULL a bCondition.

A causa di errori di battitura succede invece di scrivere

 bCondition == NULL 

finiscono per scrivere

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

In caso di

 NULL = bCondition // there will be an error 

Non c’è differenza. È un modo antico di programmazione difensiva che è stato obsoleto per oltre 20 anni. Lo scopo era di proteggere da digitando accidentalmente = invece di == quando si confrontano due valori. I programmatori Pascal in migrazione verso C erano particolarmente inclini a scrivere questo bug.

Da Borland Turbo C rilasciato nel 1990 e in avanti, ogni compilatore noto mette in guardia contro “l’assegnazione probabilmente errata”, quando riesci a digitare questo bug.

Quindi scrivere (NULL == bCondition) non è una pratica migliore o peggiore del contrario, a meno che il compilatore non sia estremamente antico. Non devi preoccuparti di scriverli in un ordine particolare.

Quello con cui dovresti preoccuparti è di adattare uno stile di codifica in cui non scrivi mai assegnazioni all’interno di se / condizioni del ciclo. Non c’è mai una ragione per farlo. È una caratteristica completamente superfluo, rischiosa e brutta del linguaggio C. Tutti gli standard di programmazione de facto standard vietano l’assegnazione all’interno delle condizioni.

Riferimenti:

  • MISRA C: 2004 13.1
  • CERT C EXP18-C

È semplicemente una buona misura difensiva. Alcuni potrebbero anche trovarlo più comodo da leggere. Nel caso di un’assegnazione errata invece dell’operatore di uguaglianza, il compilatore tenterà di modificare NULL , che non è un lvalue e produrrà un messaggio di errore. Quando si utilizza bCondition = NULL , il compilatore potrebbe produrre un avvertimento sull’utilizzo di un compito come valore di verità, un messaggio che può essere perso e passare inosservato.

Mentre di solito non c’è differenza tra variable == value e value == variable , e in linea di principio non dovrebbe esserci, in C ++ a volte può esserci una differenza nel caso generale se è coinvolto l’overloading dell’operatore. Ad esempio, anche se == dovrebbe essere simmetrico, qualcuno potrebbe scrivere un’implementazione patologica che non lo è.

La class di stringa _bstr_t di Microsoft soffre di un problema di asimmetria nel suo operator== implementazione.