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