在以下代码中:
#include<iostream>
using namespace std;
int main()
{
int x = 1 , y = 1, z = 1;
cout << ( ++x || ++y && ++z ) << endl; //outputs 1;
cout << x << " " << y << " " << z ; //x = 2 , y = 1 , z = 1;
return 0;
}
据我所知,逻辑 AND 应该先求值,然后是逻辑 OR。然而,结果似乎与我的假设相反。谁能解释一下?
答案 0 :(得分:2)
operator&&
的 precedence 比 operator||
高,这意味着 ++x || ++y && ++z
将被解释为 ++x || (++y && ++z)
,这并不意味着 (++y && ++z)
得到首先评价。 ++x
仍然首先被评估,它给出一个非零值可以转换为 bool
的值为 true
,然后 (++y && ++z)
不会被评估,因为 {{3 }}。
答案 1 :(得分:2)
运算符 ||
和 &&
是短路的(如果没有过载)。
因此,对于 ||
:如果第一个参数是 true
,则不计算第二个参数。
对于 &&
:如果第一个是 false
,则不计算第二个。
如果 a
中的 a || (b && c)
是 true
,则不会对第二个表达式包含的任何内容求值。
(我设置了括号(实际上不是必需的)来强调 ||
的第二个参数是什么。)
答案 2 :(得分:0)
您似乎将运算符的优先级与求值顺序混淆了。是的,&&
的优先级高于 ||
,因此 ++x || ++y && ++z
被评估为 ++x || (++y && ++z)
,但它仍然是从左到右评估。
也就是说,||
的左参数将始终在右参数之前进行评估。因此 ++x
first 被评估,这产生 true
和条件 short-circuits,所以 (++y && ++z)
根本不被评估。