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:

x = 20;
printf ("%d %d\n", x, x = 4);

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:

y = 20;
printf ("%d %d\n", y, x = 4);

Aqui está outra maneira, com o outro significado:

x = 4;
printf ("%d %d\n", x, x);

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