Armadilha: Atribuição em Subexpressões
Em C, a ordem de cálculo das partes de uma expressão não é fixa. Com exceção de alguns poucos casos especiais, as operações podem ser calculadas em qualquer ordem. Se uma parte da expressão tem uma atribuição para x
e outra parte da expressão usa x
, o resultado é imprevisível, pois esse uso pode ser calculado antes ou depois da atribuição.
Aqui está um exemplo de código ambíguo:
Se o segundo argumento, x
, for calculado antes do terceiro argumento, x = 4
, o valor do segundo argumento será 20. Se eles forem calculados na outra ordem, o valor do segundo argumento será 4.
Aqui está uma maneira de tornar esse código não ambíguo:
Aqui está outra maneira, com o outro significado:
Esse problema se aplica a todos os tipos de atribuições, e aos operadores de incremento e decremento, que são equivalentes a atribuições. Veja para mais informações sobre isso.
No entanto, pode ser útil escrever atribuições dentro de uma condição if
ou um teste while
, junto com operadores lógicos. Veja .
Atualizado