2015-07-24 8 views
5

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()); 
} 
+0

Zgodnie z http://en.cppreference.com/w/cpp/language/eval_order, zamówienie jest _unspecified_ w obu przypadkach. –

Odpowiedz

5
Struct().Member(Function()) 

to wywołanie funkcji gdzie przyrostek ekspresja jest Struct().Member i argument jest Function(). Ogólnie rzecz biorąc, w wywołaniu funkcji ocena Postfiks-wyrażenia jest niesekwencjonowana w odniesieniu do oceny argumentów.

Dlatego kolejność wywołań puts jest rzeczywiście nieokreślona.

Nie ma znaczenia, że ​​funkcja jest niestatyczną funkcją składową.

Powiązane problemy