逻辑运算符及其在C / C ++中的优先级

时间:2012-11-10 12:43:50

标签: c++ c operators logical-operators

我最近遇到了一段代码

//克服除零的程序

int a=0;
int b=100;

int c= a==0 || b/a ;

printf("Hello");

//输出:Hello

我的理论: 根据优先级,operator /的优先级高于||。所以b / a必须首先执行,我们应该得到一个运行时错误。

我假设发生的事情是:

短路运营商|| ,评估LHS a == 0,这是真的,因此不执行b / a。

我的理论错了吗?我很确定这是非常简单的,我现在无法理解

2 个答案:

答案 0 :(得分:8)

优先顺序并不意味着评估顺序,只是分组(括号)。

||的第一个操作数被删除之后有一个序列点(旧的说法),所以||的第一个操作数必须在第二个操作数之前进行评估,而不管这些操作数是什么。因为在这种情况下,表达式a == 0 || b/a的整体结果由第一个操作数确定,所以第二个操作数根本不被评估。

答案 1 :(得分:3)

/优先级高于||意味着表达式的计算结果如下:

int c= (a==0) || (b/a) ;

而不是

int c= (a==0 || b)/a ;

但是,由于逻辑评估被短路,b/a只会在a!=0时进行评估。