Рассмотрим такую операцию:
int a = f1(mystream)*f2(mystream)+f3(mystream);
Где f1, f2, f3 имеют следующую форму:
int f(std::istream&)
или же
int f(std::ostream&)
У меня есть гарантия, что f1
, f2
а также f3
будет выполнен в таком порядке?
Нет. Отдельные подвыражения не упорядочены по отношению друг к другу. Что гарантировано, так это то, что любой вызов одной функции завершается до запуска другого, но порядок трех вызовов функций не определен.
У вас нет гарантии, что каждый компилятор использует порядок слева направо. Так что, если вы не уверены, вы можете посмотреть это в вашем ассемблере. После того, как компилятор создал код сборки, порядок гарантирован.
Посмотрите на следующий ассемблерный код:
cout << f1() * f2() * f3();
00C6452E call f1 (0C61096h)
00C64533 mov esi,eax
00C64535 call f2 (0C6112Ch)
00C6453A imul esi,eax
00C6453D call f3 (0C61127h)
00C64542 imul esi,eax
00C64545 mov edi,esp
Это код, который создает мой компилятор …
Нет, они могут быть выполнены в любом порядке. Это потому, что встроенный *
а также +
операторы не вводят точка последовательности. Некоторые встроенные операторы, такие как ||
а также &&
ввести точки последовательности и определить порядок выполнения.