C 运算符优先级问题
结果表明,O/p为x=2,y=1,z=1,这与运算符优先级不符。我在Turbo C++编译器上运行:C 运算符优先级问题,c,operator-precedence,turbo-c,C,Operator Precedence,Turbo C,结果表明,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。逻辑or运算符(|)在++x之后短路,因为它的计算结果为非零数,因此忽略其余运算符 因此,从x=1,y=1,z=1开始,短路后,得到x=2
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。逻辑or运算符(
|
)在++x
之后短路,因为它的计算结果为非零数,因此忽略其余运算符
因此,从x=1
,y=1
,z=1
开始,短路后,得到x=2
,y=1
,z=1
x=y=z=1;
使所有变量都=1
q=++x || ++y && ++z;
由于++x
使它=2,并且由于不是零,因此它停止检查其他条件,因为第一个条件是true
因此,
x=2
,以及y和z=1
运算符优先级并不以任何方式决定运算符的执行顺序。运算符优先级仅定义运算符及其操作数之间的分组。在您的例子中,运算符优先级表示表达式
q = ++x || ++y && ++z
分组为
q = ((++x) || ((++y) && (++z)))
其余部分与运算符优先级完全无关
其余部分由每个特定操作符的语义决定。本例中的顶级运算符是| |
。|
运算符的特殊属性是它总是首先计算其左侧。如果左手边的大小不是零,那么它甚至不会尝试计算右手边的大小
这正是你的情况。左侧为++x
,计算结果为非零值。这意味着,具有给定初始值的整个表达式在功能上等价于
q = (++x != 0)
|
操作符的右侧甚至没有被触摸。逻辑和&
(和
)和|
(或
)操作符会发生短路
逻辑运算符保证从左到右计算其操作数。但是,它们计算确定表达式结果所需的最小操作数。这称为“短路”计算
因此,对于逻辑运算符,其计算结果总是从左到右(无论是|
还是&&
)。
如前所述,这里的优先权只决定谁取谁。
然后从左到右规则
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..
希望这有助于更清楚地了解情况。这是正确的结果。如果您愿意解释为什么您希望出现不同的情况,我们可能会告诉您错误的位置。您的推理是正确的,但这是合乎逻辑的或而不是按位或。按位or是
,不使用短路评估。根据C99标准,运算符“
”是按位or运算符;运算符“|
”是逻辑OR运算符。您当然是对的,我的错。什么abt运算符优先。&&比| |优先。因此表达式应分组为q=(++x | |++y)&&(++z)。为什么不发生这种情况,| |获得更高的优先级。什么abt运算符优先级&&比| |具有更高的优先级。因此表达式应分组为q=(++x | |++y)&&(++z)。为什么不发生这种情况,而且| |得到更高的优先级。@ramana:呃。。。你倒过来了。非正式地说,优先级是指抓取操作数的能力。当您说a | | b&c
时,&
具有更高的优先级,这意味着它将首先获取其操作数:a | |(b&c)
。也就是说,b
属于&
(而不是|
),因为&
具有更高的优先级。|
的优先级较低,因此它将使用&&
之后的剩余值。当然,在这种情况下将首先执行|
。但这并没有什么不寻常的。正如我上面所说,优先级与评估顺序没有任何关系。thanx很多andrey。这是一个很大的概念错误。thnx是crctn的。