Порядок оценки аргументов с использованием std :: cout - PullRequest
11 голосов
/ 11 октября 2011

Привет всем, что я наткнулся на этот кусок кода сегодня, и я не понимаю, что именно происходит и более конкретно в каком порядке:

Код:

#include <iostream>

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;
}

Вывод:

Value of test is :      1       Return value of function is : 1 Value of test : 0

Видя это, я предположил бы, что как-то самый правый аргумент выводится перед вызовом функции. Так что это оценка справа налево ?? Хотя во время отладки кажется, что функция вызывается до вывода, что я и ожидал. Я использую Win7 и MSVS 2010. Любая помощь приветствуется!

Ответы [ 4 ]

22 голосов
/ 11 октября 2011

Порядок вычисления элементов в выражении не определен (за исключением некоторых очень частных случаев, таких как операторы && и || и троичный оператор, которые вводят точек последовательности ); поэтому, не гарантируется, что test будет оцениваться до или после foo(test) (что его модифицирует).

Если ваш код основан на определенном порядке вычисления, самый простой способ получить его - разделить выражение на несколько отдельных операторов.

10 голосов
/ 11 октября 2011

Порядок оценки не уточняется.Это не слева направо, справа налево или что-то еще.

Не делайте этого.

6 голосов
/ 16 мая 2018

Ответ на этот вопрос изменился в C ++ 17.

Оценка перегруженных операторов теперь выполняется так же, как и для встроенных операторов (C ++ 17 [over.match.oper] / 2).

Кроме того, <<, >> и операторы подписки теперь имеют левый операнд , секвенированный перед справа, а постфиксное выражение вызова функции * секвенируется до оценка аргументов.

(другие бинарные операторы сохраняют свое предыдущее упорядочение, например, + все еще не упорядочено).

Таким образом, код в вопросе должен теперь вывести Value of test is : 0 Return value of function is : 1 Value of test : 1. Но совет «Не делай этого» все еще разумен, учитывая, что всем потребуется некоторое время для обновления до C ++ 17.

2 голосов
/ 11 октября 2011

Порядок оценки не указан, см. http://en.wikipedia.org/wiki/Sequence_point

Это та же ситуация, что и в примере с оператором + пример:

Рассмотрим две функции f() и g(). В C и C ++ оператор + не связан с точкой последовательности, и поэтому в выражении f()+g() возможно, что сначала будет выполняться либо f(), либо g().

...