【发布时间】:2021-07-31 21:10:24
【问题描述】:
#include <stdio.h>
int i=0, n=10;
int f(int n, int *i){
if (n==0){
return *i;
}
else{
(*i)++;
return n+f(n/2, i);
}
}
int main(){
if (f(n, &i) || f(n*n, &i) || f(n*n*n, &i)){
n = f(n, &i);
}
printf("%d %d", n, i);
}
当我第一次看到该代码时,我认为所有条件都可以。但是当我运行该代码时,if 内部并没有完全工作。只有f(n, &i) 在f(n, &i) || f(n*n, &i) || f(n*n*n, &i) 中工作,编译器继续使用n = f(n, &i);。这段代码输出:
26 8
为什么编译器不运行f(n*n, &i) || f(n*n*n, &i)?即使第一个条件为真,它不应该运行其他条件吗?
【问题讨论】:
-
“即使第一个条件为真,也不应该运行其他条件吗?”不,这是C/C++的基本规则之一。
-
如果第一个表达式为真,那么所有其他表达式都无法使其更真,因此自 1978 年以来的 C/C++ 编译器将它们缩短了。
-
这并没有解决问题,但是那些全局变量
i和n真的很混乱,因为函数f有同名的局部变量。全局变量没有做任何有用的事情;将它们移至main。