O/p 结果是 x=2,y=1,z=1,这与运算符优先级不一致。我在 Turbo c++ 编译器上运行它:
void main()
{
int x,y,z,q;
x=y=z=1;
q=++x || ++y && ++z;
printf("x=%d y=%d z=%d",x,y,z);
}
O/p 结果是 x=2,y=1,z=1,这与运算符优先级不一致。我在 Turbo c++ 编译器上运行它:
void main()
{
int x,y,z,q;
x=y=z=1;
q=++x || ++y && ++z;
printf("x=%d y=%d z=%d",x,y,z);
}
实际上结果完全符合标准 C。逻辑或运算符 ( ||
) 短路,++x
因为它的计算结果为非零数,因此其余部分被忽略。
所以从x=1
, y=1
,开始z=1
, 短路后得到x=2
, y=1
, z=1
.
x=y=z=1;
使所有变量 = 1
q=++x || ++y && ++z;
因为++x
make it = 2 并且因为它不为零,所以它停止检查其他条件,因为第一个是true
.
因此x=2
, 和y and z = 1
运算符优先级不以任何方式确定运算符的执行顺序。运算符优先级仅定义运算符及其操作数之间的分组。在您的情况下,运算符优先级表示表达式
q = ++x || ++y && ++z
被分组为
q = ((++x) || ((++y) && (++z)))
其余的与运算符优先级完全无关。
其余的由每个特定运算符的语义决定。在这种情况下,顶级运算符是||
. 运算符的特定属性||
是它总是首先评估其左侧。如果左边的大小不为零,那么它甚至不会尝试评估右边的大小。
这正是您的情况。左侧是++x
,它的计算结果为非零值。这意味着具有给定初始值的整个表达式在功能上等同于
q = (++x != 0)
操作员的右侧||
甚至没有被触及。
逻辑&&
( AND
) 和||
( OR
) 运算符受短路约束。
“逻辑运算符保证从左到右评估其操作数。但是,它们评估确定表达式结果所需的最少数量的操作数。这称为“短路”评估。”
因此,对于逻辑运算符,总是从左到右计算为(不管||
或)。&&
而且如前所述,这里的优先级只决定谁拿谁。然后从左到右规则;
q = ++x || ++y && ++z;
//ok, lets play by rule, lets see who takes who:
//first pass ++ is badass here (has highest precedence)
//q = (++x) || (++y) && (++z)
//second pass &&'s turn
//q = (++x) || ((++y) && (++z))
//done, let's do left to right evaluation
q = (++x) || rest..
q = (true)|| whatever..
希望帮助更清楚。