Qual é a diferença entre estes (bCondition == NULL) e (NULL == bCondition)?

Ao explorar sites msdn, a maioria da condição verifica os locais que eles estão usando (NULL == bCondition).

qual é o propósito de usar essas notações?

Forneça alguma amostra para explicar isso, por favor.

Obrigado.

O uso da NULL == condition fornece um comportamento mais útil no caso de um erro de digitação, quando um operador de atribuição = é usado acidentalmente em vez do operador de comparação == :

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

C-compilador dá um aviso no primeiro caso, não há tais avisos em muitos idiomas.

É chamado de condições Yoda . (O link original , você precisa de alta reputação para vê-lo).

Ele é feito para proteger contra designações acidentais = em condições em que uma comparação de igualdade foi planejada. Se você se ativer ao Yoda por hábito e fizer um erro de digitação escrevendo = vez de == , o código não será compilado porque você não pode atribuir a um rvalue.

Vale a pena o constrangimento? Alguns discordam, dizendo que os compiladores emitem um aviso quando vêem = em expressões condicionais. Eu digo que simplesmente aconteceu apenas duas ou três vezes na minha vida para cometer esse erro, o que não justifica mudar todos os MLOCs que escrevi em minha vida para essa convenção.

Muitas pessoas preferem escrever NULL == bCondition para que eles acidentalmente não atribuam o valor NULL para bCondition.

Por causa do erro, acontece que, em vez de escrever

 bCondition == NULL 

eles acabam escrevendo

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

No caso de

 NULL = bCondition // there will be an error 

Não há diferença. É uma forma antiga de programação defensiva que está obsoleta há mais de 20 anos. O objective era proteger contra a digitação acidental = em vez de == ao comparar dois valores. Programadores em Pascal migrando para C eram especialmente propensos a escrever este bug.

A partir do Borland Turbo C lançado em 1990 e para a frente, todos os compiladores conhecidos avisam contra “designações possivelmente incorretas”, quando você consegue digitar esse bug.

Portanto, escrever (NULL == bCondition) não é uma prática melhor ou pior do que o contrário, a menos que seu compilador seja extremamente antigo. Você não precisa se preocupar em escrevê-los em qualquer ordem específica.

O que você deve se preocupar é adaptar um estilo de codificação onde você nunca escreve atribuições dentro das condições if / loop. Nunca há uma razão para fazê-lo. É uma característica completamente supérflua, arriscada e feia da linguagem C. Todos os padrões de codificação de fato da indústria proíbem a atribuição dentro das condições.

Referências:

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

É simplesmente uma boa medida defensiva. Alguns também podem achar mais conveniente ler. No caso de uma atribuição incorreta em vez do operador de igualdade, o compilador tentará modificar NULL , que não é um lvalue e produzirá uma mensagem de erro. Ao usar bCondition = NULL , o compilador pode produzir um aviso sobre o uso de uma atribuição como um valor de verdade, uma mensagem que pode se perder e passar despercebida.

Embora normalmente não haja diferença entre a variable == value e value == variable , e em princípio não deveria existir, em C ++ às vezes pode haver uma diferença no caso geral se a sobrecarga do operador estiver envolvida. Por exemplo, embora se espere que == seja simétrica, alguém poderia escrever uma implementação patológica que não é.

A class de seqüência de caracteres _bstr_t da Microsoft sofre de um problema de assimetria em sua implementação de operator== .