C 递归代码模棱两可的回答

C 递归代码模棱两可的回答,c,recursion,reference,C,Recursion,Reference,如果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

如果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
,我对引用调用部分
返回f(x,c)*x

每次调用后x值会改变,还是保持不变?

假设这是C++而不是C(因此引用声明有一定意义),结果未指定(但未定义行为)。 问题是,在表达式
f(x,c)*x
中,未指定程序在调用
f(x,c)
之前还是之后计算第二个
x


请注意,由于此行为未指定,您根本无法依赖它-更改编译器选项可能会更改求值顺序。事实上,编译器在技术上允许使用一个排序来评估表达式,对于某些调用,使用<代码> f>(<)>代码>(虽然我认为这在实践中从未发生过)。假设这是C++,而不是C。(因此引用声明有一定意义),结果是未指定的(但不是未定义的行为)

问题是,在表达式
f(x,c)*x
中,未指定程序在调用
f(x,c)
之前还是之后计算第二个
x


请注意,由于此行为未指定,因此您根本无法依赖它-更改编译器选项可能会更改求值顺序。事实上,技术上允许编译器使用一个顺序对
f()
的某些调用求值表达式,而使用另一个顺序对
f()的其他调用求值(虽然我认为这在实践中从来没有发生过)。C代码> INTF(int和x,int c)< /C>是C语法错误。C++是在竞争激烈的考试中被问到的吗?我认为它只是CICE中的一个代码。这是个技巧问题。C没有“引用”。该代码在C.中无效。代码在C++中具有不可预知的(未指定的)行为。换句话说,没有应用Ad答案。<代码> int f(int x,int c)C是一个语法错误。C是C++吗?在竞争考试中被问到了……我认为它只是CICE中的一个代码。它是个技巧问题。C没有“引用”;只有指针。在C.代码无效。代码在C++中有不可预知的(未指定的)行为。换句话说,没有应用Ad答案。