运算符优先级问题
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=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 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..
希望有助于更清楚。