我最近遇到了一段代码
//克服除零的程序
int a=0;
int b=100;
int c= a==0 || b/a ;
printf("Hello");
//输出:Hello
我的理论: 根据优先级,operator /的优先级高于||。所以b / a必须首先执行,我们应该得到一个运行时错误。
我假设发生的事情是:
短路运营商|| ,评估LHS a == 0,这是真的,因此不执行b / a。
我的理论错了吗?我很确定这是非常简单的,我现在无法理解
答案 0 :(得分:8)
优先顺序并不意味着评估顺序,只是分组(括号)。
在||
的第一个操作数被删除之后有一个序列点(旧的说法),所以||
的第一个操作数必须在第二个操作数之前进行评估,而不管这些操作数是什么。因为在这种情况下,表达式a == 0 || b/a
的整体结果由第一个操作数确定,所以第二个操作数根本不被评估。
答案 1 :(得分:3)
/
优先级高于||
意味着表达式的计算结果如下:
int c= (a==0) || (b/a) ;
而不是
int c= (a==0 || b)/a ;
但是,由于逻辑评估被短路,b/a
只会在a!=0
时进行评估。