Выбор ответа Middle Типы и неопределённое поведение обновлено
Порядок вычисления аргументов функции
Вопрос
В каком порядке вычисляются a() и b() в вызове f(a(), b())?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Не определён стандартом (unspecified). Порядок вычисления аргументов unspecified: компилятор выбирает любой, причём с C++17 вычисления аргументов не перемешиваются (indeterminately sequenced).
Варианты ответа
- Не определён стандартом (unspecified)правильный ответ
- Слева направо, как записаны аргументы
- Справа налево, как кладутся в стек
- Это неопределённое поведение (UB)
Разбор
Порядок вычисления аргументов unspecified: компилятор выбирает любой, причём с C++17 вычисления аргументов не перемешиваются (indeterminately sequenced). GCC на x86-64 часто вычисляет справа налево, Clang слева направо, полагаться нельзя.
- «Слева направо» гарантировано для
<<в цепочкеcout << a() << b()с C++17, но не для аргументов функции. - Это не UB: допустимые варианты ограничены.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что C++20 изменил для знаковых целых
Следующий вопрос
Объясни, что такое неопределённое поведение
Ещё по теме «Типы и неопределённое поведение»
- Порядок байтов: перевернуть uint32 и посчитать единицы
- Умножение int64 с проверкой переполнения
- Середина двух int64 без переполнения
- std::bit_cast
- Продвижение unsigned char
- Размер long на Windows и Linux
- Сопоставьте пример и вид поведения
- Почему проверка x + 1 < x исчезла