C++ C/C+中的逻辑运算符及其优先级+;
我最近遇到了一段代码 //克服零除的程序C++ C/C+中的逻辑运算符及其优先级+;,c++,c,operators,logical-operators,C++,C,Operators,Logical Operators,我最近遇到了一段代码 //克服零除的程序 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
的整体结果是由第一个操作数确定的,所以第二个操作数根本不计算。与|
相比,//code>的优先级更高意味着表达式的计算结果为:
int c= (a==0) || (b/a) ;
而不是
int c= (a==0 || b)/a ;
但是,由于逻辑求值是短路的,b/a
仅在a=0
+1。这是一条很棒的信息,谢谢@GolezTrol和Daniel Fischer。我假设我遗漏了一些简单的语法问题。老师们在解释运算符优先级时说,肯定有一些根本错误,因为很多人认为这与评估顺序有关。也许需要某种组织,在世界的各个阶层中漫游,寻找那些说“首先计算最高优先级的运算符”(或者不管基本错误是什么)的人,请告诉我,为什么要写代码,你必须挠头才能弄清楚到底发生了什么?它是愚蠢的,无法维护,因此是c**P!请告诉我写这样的代码有什么意义。@EdHeal实际上这很常见。唯一困扰我的是(a==0)
在分配给c
时被视为int 0而不是boolean false,但我相信这是c的东西。@EdHeal我没有写这段代码,我在我正在运行的某个程序中看到了这段代码。@GolezTrola==0
的计算结果为1/true。存在从bool
到int
的隐式转换,因此int c=boolean\u表达式
等价于int c=boolean\u表达式?1 : 0;代码>@DanielFischer,谢谢-曼联球迷:)。