Efeitos colaterais
A ordem de avaliação das expressões é definida pela implementação específica, exceto quando a linguagem garante uma determinada ordem de avaliação (conforme descrito em Precedência e ordem de avaliação). Por exemplo, os efeitos colaterais ocorrem nas seguintes chamadas de função:
add( i + 1, i = j + 2 );
myproc( getc(), getc() );
Os argumentos de uma chamada de função podem ser avaliados em qualquer ordem. A expressão i + 1
pode ser avaliada antes de i = j + 2
, ou i = j + 2
pode ser avaliada antes de i + 1
. O resultado é diferente em cada caso. De maneira similar, não é possível garantir quais caracteres serão passados para myproc
. Como os incrementos unários e operações de redução envolvem atribuições, essas operações podem causar efeitos colaterais, conforme mostrado no seguinte exemplo:
x[i] = i++;
Neste exemplo, o valor de x
alterado é imprevisível. O valor do subscrito pode ser o valor novo ou antigo de i
. O resultado pode variar em compiladores diferentes ou níveis de otimização diferentes.
Como C não define a ordem de avaliação de efeitos colaterais, ambos os métodos de avaliação discutidos anteriormente estão corretos e qualquer um pode ser implementado. Para garantir que o seu código seja portátil e claro, evite as instruções que dependem de um pedido específico de avaliação quanto aos efeitos colaterais.