如果在p之前将p的值初始化为5,则f(p,p)
的返回值是多少
呼叫?请注意,第一个参数是通过引用传递的,而第二个参数是通过值传递的。
int f (int & x, int c )
{
c = c − 1;
if ( c == 0 ) return 1;
x = x + 1;
return f ( x, c ) * x;
}
(A)3024
(B)6561
(C)55440
(D)161051
根据我的3024因为我们开始
f(5,5)
f(6,4)*6
f(7,3)*7
f(8,2)*8
f(9,1)*9
那么1
,我对参考部分return f ( x, c ) * x
的电话有点困惑
x值会在每次调用后发生变化,还是会保持不变?
答案 0 :(得分:4)
假设这实际上是C ++而不是C(因此引用声明有一定意义),结果是未指定的(但不是未定义的行为)。
问题在于,在表达式f(x,c) * x
中,未指定程序是否会在调用x
之前或之后评估第二个f(x,c)
。
请注意,由于此行为未指定,因此您根本不能依赖它 - 更改编译器选项可能会更改评估顺序。实际上,技术上允许编译器使用一个排序对f()
的某些调用求值表达式,同时使用另一个顺序对f()
进行其他调用(尽管我想这不会发生在{{1}}实践)。