5

我最近遇到了一段代码

// 克服被零除的程序

int a=0;
int b=100;

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

printf("Hello");

//输出:你好

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

我假设正在发生的事情是:

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

我的理论错了吗?我很确定这是非常简单的事情,我现在无法弄清楚

4

2 回答 2

8

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

在计算 的第一个操作数之后有一个序列点(旧用语)||,因此||无论这些操作数是什么,都必须在第二个操作数之前计算 的第一个操作数。由于在这种情况下,表达式的整体结果a == 0 || b/a是由第一个操作数确定的,因此根本不计算第二个操作数。

于 2012-11-10T12:46:31.437 回答
3

/over的较高优先级||意味着表达式被计算为:

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

并不是

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

但是,由于逻辑评估是短路的,b/a只会在a!=0.

于 2012-11-10T12:47:39.053 回答