请问下面两段代码,为啥是其对应的输出结果呢?
1、输出:120(重点想问n--的执行顺序,以及为什么这样)
int step(int n)
{
if (n > 1) {
return n-- * step(n);
} else {
return 1;
}
}
int main(int argc, char* argv[])
{
int a = step(5);
printf("%d", a);
return 0;
}2、输出:24
int step(int n)
{
if (n > 1) {
return n * step(--n);
} else {
return 1;
}
}
int main(int argc, char* argv[])
{
int a = step(5);
printf("%d", a);
return 0;
}C语言运算符有优先级和结合性,但是参与运算的操作数的求值顺序并没有规定。所以这两个代码是有问题的。
第一个例子中:
return 后面的 n-- 的值肯定是n,但是n自减在这个表达式中是什么时候发生的并不确定(在return语句后肯定减1了,但也没意义了)
第二个例子:
step的参数--n的值肯定是n-1,而且在函数调用后n的值也肯定是减1了,但是由于操作数的求值顺序未定,所以不能保证肯定先调用step函数。
这两个代码的行为都是未定义的,能出运算结果不一定代表这就是“正确的”结果。