0

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);
}
4

4 回答 4

8

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

所以从x=1, y=1,开始z=1, 短路后得到x=2, y=1, z=1.

于 2011-08-27T04:12:01.990 回答
5
x=y=z=1;

使所有变量 = 1

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

因为++xmake it = 2 并且因为它不为零,所以它停止检查其他条件,因为第一个是true.

因此x=2, 和y and z = 1

于 2011-08-27T04:14:08.287 回答
4

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

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

被分组为

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

其余的与运算符优先级完全无关。

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

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

q = (++x != 0)

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

于 2011-08-27T04:38:51.047 回答
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..

希望帮助更清楚。

于 2012-03-22T23:19:14.463 回答