Какой порядок это оценить и почему? C++

int foo(int a, int& b, int c) {
    int temp = a;
    a = b;
    b = c;
    c = temp;
    return a - b;
}

int main() {


**foo(foo(a, b, c), b, foo(a, b, foo(a, b, c)));**


return 0;
}

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

1 ответ

Решение

Предполагая, что ** являются опечатками, а не синтаксическими ошибками, и используют следующие имена:

 (A)      (B)          (C)       (D) 
foo ( foo(a, b, c), b, foo(a, b, foo(a, b, c)))

следствие верно:

  • (D) оценивается до (C), потому что значение параметра требуется для вызова (C).
  • (A) оценивается после (B) и (C) (и, следовательно, (D))

Больше нельзя сказать, потому что стандарт C++ позволяет упорядочивать оценку параметров компилятору:

5.2.2 / 4: при вызове функции каждый параметр должен быть инициализирован соответствующим аргументом. [Примечание: такие инициализации неопределенно упорядочены друг относительно друга - примечание конца]

Другие вопросы по тегам