Oi tudo que eu tropeçou neste pedaço de código hoje e estou confuso sobre o que exatamente acontece e mais em particular em que ordem:
Código:
#include bool foo(double & m) { m = 1.0; return true; } int main() { double test = 0.0; std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << foo(test) << "\tValue of test : " << test << std::endl; return 0; }
A saída é:
Value of test is : 1 Return value of function is : 1 Value of test : 0
Vendo isso, eu diria que, de alguma forma, o argumento mais correto é impresso antes da chamada para a function. Então, isso é certo para a avaliação esquerda? Durante a debugging, parece que a function é chamada antes da saída, que é o que eu esperaria. Eu estou usando o Win7 e MSVS 2010. Qualquer ajuda é apreciada!
A ordem de avaliação dos elementos em uma expressão não é especificada (exceto alguns casos muito particulares, como os operadores &&
e ||
e o operador ternário, que introduzem pontos de seqüência ); então, não é garantido que o test
será avaliado antes ou depois do foo(test)
(que o modifica).
Se o seu código depende de uma ordem particular de avaliação, o método mais simples para obtê-lo é dividir sua expressão em várias instruções separadas.
A ordem de avaliação não é especificada. Não é da esquerda para a direita, da direita para a esquerda ou de qualquer outra coisa.
Não faça isso.
A resposta a esta questão mudou em C ++ 17.
A avaliação de operadores sobrecarregados é agora sequenciada da mesma maneira que para operadores internos (C ++ 17 [over.match.oper] / 2).
Além disso, os operadores <<
, >>
e subscripting agora têm o operando esquerdo sequenciado antes do direito, e a expressão postfix de uma chamada de function é sequenciada antes da avaliação dos argumentos.
(Os outros operadores binários retêm seu seqüenciamento anterior, por exemplo, +
ainda não foi sequenciado).
Portanto, o código na pergunta deve agora saída Value of test is : 0 Return value of function is : 1 Value of test : 1
. Mas o conselho "Não faça isso" ainda é razoável, dado que levará algum tempo para que todos possam atualizar para o C ++ 17.
A ordem de avaliação não é especificada, consulte http://en.wikipedia.org/wiki/Sequence_point
Esta é a mesma situação que o exemplo com o operador + exemplo:
Considere duas funções
f()
eg()
. Em C e C ++, o operador+
não está associado a um ponto de sequência e, portanto, na expressãof()+g()
é possível quef()
oug()
sejam executados primeiro.