C / C ++ - оценка аргументов в вызове функции [duplicate]

0

Возможный дубликат:
порядок оценки параметров функций

Можно ли использовать следующую конструкцию в C/С++?

f(g(), h());

где ожидается, что g() оценивается сначала, затем h().

Все ли компиляторы демонстрируют одинаковое поведение на всех архитектурах?

  • 2
    Этот вопрос часто задают здесь, я не могу решить, какой выбрать для дублирующего маркера ...
  • 0
    Спасибо, а как насчет реальных компиляторов? Какой порядок они используют?
Показать ещё 1 комментарий
Теги:
semantics
multiplatform

5 ответов

8
Лучший ответ

НЕТ! Нет никакой гарантии, в каком порядке они выполняются. Только, что и g() и h() выполняются до f(). Смотрите это: http://www.gotw.ca/gotw/056.htm Я думаю, что там обновленная версия С++ 11, я посмотрю.

Изменить: С++ 11 версия http://herbsutter.com/gotw/_102/

Изменить 2: Если вы действительно хотите знать, что делают конкретные компиляторы, попробуйте следующее: http://www.agner.org/optimize/calling_conventions.pdf Раздел 7 (стр. 16) может быть уместным, хотя это немного над моей головой, но, например, __cdecl, вызывающий соглашение, аргументы передаются справа налево (по крайней мере, хранятся таким образом), тогда как для __fastcall "Первые два DWORD или меньше аргументы передаются в регистры ECX и EDX, все остальные аргументы передаются справа налево." (http://msdn.microsoft.com/en-us/library/6xa169sk%28v=vs.71%29.aspx)

Таким образом, он различается для разных компиляторов.

Много позже отредактируйте. Оказывается, что для конструкторов, использующих синтаксис списка инициализаторов (фигурные скобки {}), порядок оценки гарантирован (даже если это вызов конструктора, который делает не принимайте std::initializer_list. См. этот вопрос.

1

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

foo = g();
bar = h();
f(foo, bar);
1

См. 1.9 Выполнение программы:

Некоторые другие аспекты и операции абстрактной машины описаны в этом Международном стандарте как unspecified (, например, порядок оценки аргументов функции). Там, где это возможно, Стандарт определяет набор допустимых типов поведения.

и 8.3.6 Аргументы по умолчанию, 9:

[...] Аргументы по умолчанию оцениваются каждый раз при вызове функции. Порядок оценки функции аргументы не определены. Следовательно, параметры функции не должны использоваться в аргументе по умолчанию, даже если они не оцениваются. [...]

0

Нет, порядок оценки аргументов относительно друг друга неуточнен. Единственная гарантия, что у вас есть, это то, что они не будут выполняться одновременно друг с другом.

0

Нет. Стандарт не определяет порядок оценки в этом случае, и каждый компилятор может делать все, что захочет. Я думаю, что большинство из них (и особенно gcc) оценивают самые правильные сначала.

  • 0
    В зависимости от флагов оптимизации (и целевого оборудования).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню