Порядок звонков и побочных эффектов

Рассмотрим такую ​​операцию:

int a = f1(mystream)*f2(mystream)+f3(mystream);

Где f1, f2, f3 имеют следующую форму:

int f(std::istream&)

или же

int f(std::ostream&)

У меня есть гарантия, что f1, f2 а также f3 будет выполнен в таком порядке?

1

Решение

Нет. Отдельные подвыражения не упорядочены по отношению друг к другу. Что гарантировано, так это то, что любой вызов одной функции завершается до запуска другого, но порядок трех вызовов функций не определен.

4

Другие решения

У вас нет гарантии, что каждый компилятор использует порядок слева направо. Так что, если вы не уверены, вы можете посмотреть это в вашем ассемблере. После того, как компилятор создал код сборки, порядок гарантирован.
Посмотрите на следующий ассемблерный код:

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

Это код, который создает мой компилятор …

0

Нет, они могут быть выполнены в любом порядке. Это потому, что встроенный * а также + операторы не вводят точка последовательности. Некоторые встроенные операторы, такие как || а также && ввести точки последовательности и определить порядок выполнения.

0
По вопросам рекламы [email protected]