Возможный дубликат:
порядок оценки параметров функций
Можно ли использовать следующую конструкцию в C/С++?
f(g(), h());
где ожидается, что g()
оценивается сначала, затем h()
.
Все ли компиляторы демонстрируют одинаковое поведение на всех архитектурах?
НЕТ! Нет никакой гарантии, в каком порядке они выполняются. Только, что и 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
. См. этот вопрос.
Нет, это небезопасно - если вам нужен гарантированный порядок оценки, например. из-за побочных эффектов, вам нужно будет сделать что-то вроде этого:
foo = g();
bar = h();
f(foo, bar);
См. 1.9 Выполнение программы:
Некоторые другие аспекты и операции абстрактной машины описаны в этом Международном стандарте как unspecified (, например, порядок оценки аргументов функции). Там, где это возможно, Стандарт определяет набор допустимых типов поведения.
и 8.3.6 Аргументы по умолчанию, 9:
[...] Аргументы по умолчанию оцениваются каждый раз при вызове функции. Порядок оценки функции аргументы не определены. Следовательно, параметры функции не должны использоваться в аргументе по умолчанию, даже если они не оцениваются. [...]
Нет, порядок оценки аргументов относительно друг друга неуточнен. Единственная гарантия, что у вас есть, это то, что они не будут выполняться одновременно друг с другом.
Нет.
Стандарт не определяет порядок оценки в этом случае, и каждый компилятор может делать все, что захочет.
Я думаю, что большинство из них (и особенно gcc
) оценивают самые правильные сначала.