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 Ordem de Execução 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 Operadores Lógicos e Atribuições.

Atualizado

Isto foi útil?