Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 运算符优先级问题_C_Operator Precedence_Turbo C - Fatal编程技术网

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

结果表明,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
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的。