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)
实际上结果完全符合标准C.逻辑或运算符(||)之后短路,++x因为它评估为非零数字,因此忽略其余部分.
所以开始x=1,y=1,z=1,短路后,你会得到x=2,y=1,z=1.
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
运算符优先级无论如何都不会决定运算符的执行顺序。运算符优先级仅定义运算符及其操作数之间的分组。在您的情况下,运算符优先级表示表达式
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)
操作员的右侧||甚至没有被触及。
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |