帅踢锅
2015-08-05 11:55
请问下面两段代码,为啥是其对应的输出结果呢?
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函数。
这两个代码的行为都是未定义的,能出运算结果不一定代表这就是“正确的”结果。
Linux C语言结构体
118294 学习 · 162 问题
相似问题