我碰到了这个问题。

#include <stdio.h>
int main()
{
int k=8;
int x=0==1||k++;
printf("%d  %d",x,k);
    return 0;
}

输出为1 9
这表明
与按位|运算符不同,|运算符保证从左到右求值;第一个操作数求值后有一个序列点。如果第一个操作数的比较结果不等于0,则不计算第二个操作数。
我无法理解如何计算语句int x=0==1||k++,因此x和k的值分别变为1,9。
有人能解释一下c语言中的编译器是如何计算这些语句的吗?

最佳答案

“与按位|运算符不同,|运算符保证从左到右求值;第一个操作数求值后有一个序列点。如果第一个操作数的比较结果不等于0,则不计算第二个操作数。”
是的,这是真的。。。
首先要清楚的是,你要知道这些基本知识
1)(1 | |任何|变量)是1
2)运算符优先级如下
++
然后
==
然后
||
现在来猜疑一下|
注意|(单管)操作符..,将同时执行LHS和RHS,不管是什么操作)
鉴于
||(双管)首先计算| |的LHS,如果是1,则不需要计算RHS(速度)
如果LHS为真,| | |运算符的RHS将不被评估。
但这里0==1为false,即0==1返回0
因此RHS将被疏散
所以声明
k++被执行
但是使用了8(因为post increment运算符的属性是-->先使用后增量)
所以0 | | 8肯定是真的(1)所以x的值是1
然后k在序列点ie k等于9后递增
因此输出x=1和k=9
我希望它能消除你的疑虑:)

关于c - 此代码中的语句评估顺序是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38421466/

10-15 17:56