Jest powszechnie znana (choć niezbyt szeroko>. <), że C i C++ nie określają kolejności, w jakiej parametry do funkcji są oceniane. Oznacza to, że dwa puts()
s poniżej mogą występować w dowolnej kolejności, jako arbitralnego wyboru kompilatora:Czy ocena wywołania funkcji jest "to" w nieokreślonej kolejności w odniesieniu do parametrów?
#include <cstdio>
int Function1() {
std::puts("Function1");
return 1;
}
int Function2() {
std::puts("Function2");
return 2;
}
int Add(int x, int y) {
return x + y;
}
int main() {
return Add(Function1(), Function2());
}
Jednak ma to również zastosowanie do oceny this
po lewej stronie .
, .*
, ->
lub ->*
operatorów? Innymi słowy, czy kolejność wartości puts()
poniżej również nie jest określona jako?
#include <cstdio>
struct Struct {
Struct() { std::puts("Struct::Struct"); }
int Member(int x) const { return x * 2; }
};
int Function() {
std::puts("Function");
return 14;
}
int main() {
return Struct().Member(Function());
}
Zgodnie z http://en.cppreference.com/w/cpp/language/eval_order, zamówienie jest _unspecified_ w obu przypadkach. –