Выбор ответа Middle Типы и неопределённое поведение обновлено

Порядок вычисления аргументов функции

Вопрос

В каком порядке вычисляются a() и b() в вызове f(a(), b())?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Не определён стандартом (unspecified). Порядок вычисления аргументов unspecified: компилятор выбирает любой, причём с C++17 вычисления аргументов не перемешиваются (indeterminately sequenced).

Варианты ответа

  1. Не определён стандартом (unspecified)правильный ответ
  2. Слева направо, как записаны аргументы
  3. Справа налево, как кладутся в стек
  4. Это неопределённое поведение (UB)

Разбор

Порядок вычисления аргументов unspecified: компилятор выбирает любой, причём с C++17 вычисления аргументов не перемешиваются (indeterminately sequenced). GCC на x86-64 часто вычисляет справа налево, Clang слева направо, полагаться нельзя.

  • «Слева направо» гарантировано для << в цепочке cout << a() << b() с C++17, но не для аргументов функции.
  • Это не UB: допустимые варианты ограничены.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.