运算符优先级问题

0 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);
}
Run Code Online (Sandbox Code Playgroud)

Bli*_*ndy 8

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

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

  • 你对推理是正确的,但那是"逻辑的"或"不是"或"按".按位或是"|",不使用短路评估. (5认同)

Dai*_*air 5

x=y=z=1;
Run Code Online (Sandbox Code Playgroud)

使所有变量= 1

q=++x || ++y && ++z;
Run Code Online (Sandbox Code Playgroud)

由于++x使得= 2,因为它不是零它停止检查的其他条件,因为第一个是true.

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


AnT*_*AnT 5

运算符优先级无论如何都不会决定运算符的执行顺序。运算符优先级仅定义运算符及其操作数之间的分组。在您的情况下,运算符优先级表示表达式

q = ++x || ++y && ++z
Run Code Online (Sandbox Code Playgroud)

被分组为

q = ((++x) || ((++y) && (++z)))
Run Code Online (Sandbox Code Playgroud)

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

其余的由每个特定运算符的语义决定。本例中的顶级运算符是||。运算符的特定属性||是它总是首先计算其左侧。如果左侧尺寸结果非零,那么它甚至不会尝试评估右侧。

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

q = (++x != 0)
Run Code Online (Sandbox Code Playgroud)

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