Ordem de avaliação de argumentos usando std :: cout

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() e g() . Em C e C ++, o operador + não está associado a um ponto de sequência e, portanto, na expressão f()+g() é possível que f() ou g() sejam executados primeiro.