() 的优先级不大于 &&
precedence of () is not greater than &&
在下面的代码中,
int main() {
int a =1, b = 2, c = 3;
if(((a++) == 5) && ((b++) == 5) && ((c++) == 5)) {
cout<<"inside if"<< endl; // prints !!!Hello World!!!
}
cout<<a<<b<<c<<endl;
return 0;
}
所有的自增操作都应该在逻辑操作之前完成。但是执行会跳过增量 b 和 c。为什么逻辑 && 优先于 ()?顺便说一下,这段代码的结果是 223
.
由于短路:当&&
左边为false
时,右边不计算。另一方面,优先级是您认为应该的方式(并且,正如 AnT 所说,它与您所看到的行为无关):()
优先于 &&
.
(同理,当||
左边为true
时,右边不计算)
all increment operation should be done before doing logical operation
这根本不是真的。没有理由在执行逻辑操作之前完成增量操作,并且 ()
不会以任何方式改变它。正如之前多次声明的那样,运算符优先级 与求值顺序 没有任何关系。这是两个完全不相关的概念。
在顶层,您的表达式具有以下结构
<term1> && <term2> && <term3> && ... && <termN>
此类表达式始终按照从 <term1>
到 <termN>
的从左到右的严格顺序进行求值(可能存在短路求值)。这些术语中的内容完全无关紧要:<term2>
中的任何内容都不会在 <term1>
.
之前进行评估
在下面的代码中,
int main() {
int a =1, b = 2, c = 3;
if(((a++) == 5) && ((b++) == 5) && ((c++) == 5)) {
cout<<"inside if"<< endl; // prints !!!Hello World!!!
}
cout<<a<<b<<c<<endl;
return 0;
}
所有的自增操作都应该在逻辑操作之前完成。但是执行会跳过增量 b 和 c。为什么逻辑 && 优先于 ()?顺便说一下,这段代码的结果是 223
.
由于短路:当&&
左边为false
时,右边不计算。另一方面,优先级是您认为应该的方式(并且,正如 AnT 所说,它与您所看到的行为无关):()
优先于 &&
.
(同理,当||
左边为true
时,右边不计算)
all increment operation should be done before doing logical operation
这根本不是真的。没有理由在执行逻辑操作之前完成增量操作,并且 ()
不会以任何方式改变它。正如之前多次声明的那样,运算符优先级 与求值顺序 没有任何关系。这是两个完全不相关的概念。
在顶层,您的表达式具有以下结构
<term1> && <term2> && <term3> && ... && <termN>
此类表达式始终按照从 <term1>
到 <termN>
的从左到右的严格顺序进行求值(可能存在短路求值)。这些术语中的内容完全无关紧要:<term2>
中的任何内容都不会在 <term1>
.