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