C

时间:2016-09-04 12:37:18

标签: c

我正在学习C语言,我试图理解为什么这个例子的输出是1 2 1 1

int main()
{
    int a, b, c, d;
    a = b = c = d = 1;
    a = ++b > 1 || ++c > 1 && ++d > 1;
    printf("%d%d%d%d", a, b, c, d);
}
  • 据我所知,只有逻辑OR ||之前的左操作数才会被评估,因为它是True,不需要评估正确的操作数。不评估右操作数。这是对的吗?
  • 左操作数为true,因为++b > 1等于1(2大于1)和a = 1。正确?

4 个答案:

答案 0 :(得分:2)

是的,你对两个帐户都是正确的。

需要注意的重要一点是,C标准保证了这种行为,通常称为short circuting

相关:Is short-circuiting logical operators mandated? And evaluation order?

答案 1 :(得分:1)

||的左侧评估为true,因此不需要评估右侧。因此,cd保持1b增加到2a被分配到true,被提升为1

<强>解释

a = b = c = d = 1;

所有四个变量都等于1

a = ++b > 1

在评估剩余的RHS之前,变量b会增加到2 。这导致表达式2 > 1,这是真的。正如其他人所提到的那样,你的||表达式然后被短路,这意味着||之后的内容将不会被评估,因为程序已经知道整个RHS将会无论发生什么,都要成真。这就是为什么我甚至不打算写表达式++c > 1 && ++d > 1,因为它会被跳过。

变量a设置为true,与1相同。

有关宣传int Can I assume (bool)true == (int)1 for any C++ compiler?

的真实情况的参考资料

答案 2 :(得分:1)

第一行a = b = c = d = 1为所有变量分配1,因为赋值运算符(=)的关联性是从右到左。

下一步: 这里应用的概念称为短路。 &#39;&gt;&#39;的偏好除了增量运算符(++)之外,它高于所有其他运算符 - 前缀增量是精确的。

因此,第一个b增加到2.现在,2 > 1的比较发生,这是真的或1。 OR的左操作数为真或1.因此,如果右操作数为true或false,则几乎没有区别,因为最终输出仍将返回true或1。

因此,OR(||)右边的所有内容都不会被评估。因此c和d不会增加并保持= 1。

a = True或1 因此a = 1, b = 2, c = d = 1

答案 3 :(得分:0)

c中的

OR运算符是逻辑运算符。 ||逻辑或。仅当任一操作数为true时为true。在第一行中,您通过a=b=c=d=1将1分配给所有变量。 之后,您将比较a=++b>1是否为真的条件,然后编译器将使用&& AND运算符检查++c>1 && ++d>1的第二个条件,因此在这种情况下,如果两个方程式均正确,则命令将运行。