运算符优先级问题

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=%dy=%dz=%d",x,y,z); } 

运算符优先级不以任何方式确定运算符的执行顺序。 运算符优先级仅定义运算符及其操作数之间的分组。 在您的情况下,运算符优先级表示表达式

 q = ++x || ++y && ++z 

分组为

 q = ((++x) || ((++y) && (++z))) 

其余的与运营商优先权完全无关。

其余部分由每个特定运算符的语义决定。 在这种情况下,顶级运算符是||||的具体属性 运算符是它始终首先评估其左侧。 如果左手大小变为非零,那么它甚至不会尝试评估右侧。

这正是你的情况。 左侧是++x ,它的计算结果为非零值。 这意味着您使用给定初始值的整个表达式在function上等同于仅仅

 q = (++x != 0) 

||的右侧 操作员甚至没有触及。

实际上结果完全符合标准C. ++x之后的逻辑或运算符( || )短路,因为它的计算结果为非零数字,因此忽略其余的数字。

因此,从x=1y=1z=1 ,在短路之后,得到x=2y=1z=1

 x=y=z=1; 

使所有变量= 1

 q=++x || ++y && ++z; 

由于++x使得它= 2并且由于它不为零,因此它会停止检查其他条件,因为第一个条件为true

因此, x=2 ,并且y and z = 1

逻辑&&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.. 

希望有助于更清楚。