此代码中语句的评估顺序是什么?

时间:2016-07-17 12:57:16

标签: c comparison-operators post-increment

我遇到了这个问题。

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

输出为1 9

正如answer所暗示的那样

  

与按位|不同运算符,||运营商保证从左到右的评估;在评估第一个操作数后有一个序列点。如果第一个操作数比较不等于0,则不计算第二个操作数。

我无法理解如何评估语句int x=0==1||k++,因为x和k的值分别变为1,9。

有人可以解释c中编译器如何评估这些语句吗?

3 个答案:

答案 0 :(得分:5)

&#34;与按位|不同运算符,||运营商保证从左到右的评估;在评估第一个操作数后有一个序列点。如果第一个操作数将不等于0,则不评估第二个操作数。&#34;

是的,这是真的......

明确 首先确保了解这些基本知识

1)(1 || any_var)为1

2)运算符优先级如下

++

然后

==

然后

||

现在让您怀疑 || vs |

请注意 | (单管)操作符..,无论如何都将执行LHS和RHS

,而

|| (双管)评估||的LHS首先,如果是1则不需要评估RHS(速度)

||的RHS如果LHS真实,则不会对运营商进行评估。

此处0 == 1为假,即0 == 1返回0

因此 RHS将被证实

所以声明

执行k ++

但使用了8(作为后增量运算符的属性表示 - &gt;首先使用然后增量)

所以0 || 8绝对是真的(1)所以x的计算结果为1

然后k在序列点后递增,即k等于9

因此输出x = 1且k = 9

我希望它能清除你的怀疑:)。

答案 1 :(得分:1)

运营商|| (OR)在案例中评估为真:

ex:A ||乙

  • A是真的,
  • B是真的,
  • 两者都是真的

因为如果A被评估为真,则此操作使用Short-Circuit Evaluation,这意味着该语句已经为真,并且它不会评估B.

在你的情况下,0 == 1(0等于1)显然是假的,所以它将评估k ++。 k ++是一个棘手的(在我看来)。在C世界中,真/假评估是基于0或不是(除了时间错误意味着小于0 ...)但是在真/假评估中0是假的,其他一切都是真的。

K ++意味着评估K然后递增,所以,如果K为0则为假并变为1,如果是其他任何东西,则为真然后增量。

在你的情况下k == 8所以k ++的结果为TRUE,k将变为9.K为真意味着x评估结果为TRUE(它为FALSE或TRUE)。

因此输出为1(真)9(8 ++)

答案 2 :(得分:1)

0==1||k++为1,因为表达式:1结果为真(在C land中为0 == 1)。你为什么问?这里有两个序列点:k++0。由于第一个序列点的计算结果为false(C land中为||),因此评估第二个序列点(因为短路运算符为1)。第二个序列返回true(或0 || 1)。所以,你将整个表达式分解为:x。因此1k

由于9;

k++C

HTH。