运算符优先级问题

时间:2011-08-27 04:07:23

标签: 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);
}

4 个答案:

答案 0 :(得分:8)

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

x=1y=1z=1开始,在短路后,您会获得x=2y=1z=1。< / p>

答案 1 :(得分:5)

x=y=z=1;

使所有变量= 1

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

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

因此,x=2y and z = 1

答案 2 :(得分:2)

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

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

分组为

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

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

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

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

q = (++x != 0)

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

答案 3 :(得分: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..

希望有助于更清楚。