#include <iostream>
int foo() {
std::cout<<"foo() is called\n";
return 9;
}
int bar() {
std::cout<<"bar() is called\n";
return 18;
}
int main() {
std::cout<<foo()<<' '<<bar()<<' '<<'\n';
}
// Above program's behaviour is unspecified
// clang++ evaluates function arguments from left to right: http://melpon.org/wandbox/permlink/STnvMm1YVrrSRSsB
// g++ & MSVC++ evaluates function arguments from right to left
// so either foo() or bar() can be called first depending upon compiler.
Вывод вышеуказанной программы зависит от компилятора. Порядок, в котором оцениваются аргументы функции, не указан. Причина, по которой я читал об этом, заключается в том, что это может привести к высокооптимизированному коду. Как не указание точного порядка вычисления аргумента функции помогает компилятору генерировать оптимизированный код?
Насколько мне известно, порядок оценки строго указан в таких языках, как Java, C#, D и т. д.
bar()
иfoo()
могут быть оценены до того, как будут сделаны какие-либо вызовы. Единственное требование состоит в том, чтобы они оценивались до точки следования, где они необходимы. - person Martin York   schedule 04.05.2016foo()
иbar()
. - person StoryTeller - Unslander Monica   schedule 04.05.2016printf
. Крайние левые аргументы будут помещены в стек последними и, таким образом, будут иметь известное смещение относительно указателя стека. (Это также требовало, чтобы вызывающий, а не вызываемый объект корректировал стек по возвращении, потому что только вызывающий объект знает, сколько было отправлено.) - person Mike Dunlavey   schedule 04.05.2016