функция — Каков порядок, чтобы оценить это и почему? Переполнение стека

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 оценивается первым и почему?
код, который я разместил, был упрощен, поэтому нет необходимости его отслеживать.
благодарю вас

0

Решение

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

 (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: Когда вызывается функция, каждый параметр должен быть инициализирован с соответствующим аргументом. [Примечание: такие
инициализации неопределенно упорядочены по отношению к каждому
другое — конечная нота]

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]