为什么这个C程序打印输出为-1?

时间:2015-08-28 01:43:04

标签: c

我正在进行练习编程测验,我不确定为什么这个程序打印出-1:

#include <stdio.h>

int main()
{
    int x = 1;

    if (x-- && x-- && x--)
    {
        printf("%d\n", x);
    } else
    {
        printf("%d\n", x);
    }
    return 0;
}

4 个答案:

答案 0 :(得分:7)

在C中,使用short-circuit evaluation评估&&||等逻辑运算符,这实际上意味着当一个语句保证为true或false时,任何后续表达式都在声明未被评估。

在您的程序中,只需要评估前两个条件以确定整个语句是错误的。第三个表达式未被评估。

if (x-- &&   /* evaluates true, and then x is decremented */
    x-- &&   /* evaluates false, and then x is decremented */
    x--)     /* this is not executed */

因为这是一系列AND语句,从逻辑上讲,只有一个表达式需要为false才能使整个语句为false。当第二个表达式被确定为false时,不需要通过评估语句的其余部分来浪费资源,因此执行else块。

这会导致x的最终值为-1,而不是-2

答案 1 :(得分:2)

首先从x = 1开始,然后x-- && x-- && x--的序列如下所示,其中每个x--代表条件的相应部分..(请注意&&行为作为序列点)。

x = 1   ->    x = 1

x--     -> 1, x = 0

结果为1(1 && x-- && x--),因此评估了第一个&&的右手表达。

x--     -> 0, x = -1

结果为0(1 && 0 && x--)和&amp;&amp;短路评估开始,右手表达第二&amp;&amp;是评估。

x--     

都能跟得上;如上所述,没有评估。

由于条件为假(1 && 0 && dont_care_not_evaluated),它会在else情况下打印出值,而减少x两次。

答案 2 :(得分:2)

在C语言中,只要可以确定结果,测试语句就会结束其操作。在这种情况下,第一个<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <label>Change html font-size <input id="html" type='number' value="20" min="18" max="30" /> </label> <div class="rem rem1">rem</div> <div class="rem rem2">rem</div> <label>Change div font-size <input id="div" type='number' value="20" min="18" max="30" /> </label> <div class="em em1">em</div> <div class="em em2">em</div>返回1并设置x = 0,第二个x--返回0并设置x = -1。

1&amp;&amp; 0可以将结果确定为0,因此忽略最后一个x--

使用FALSE语句,x--选择第二个if-else作为输出并打印printf的值:-1;

答案 3 :(得分:0)

  1. x-- - &gt; 1--在它减少到0
  2. 之后,它返回1
  3. x-- - &gt; 0--它在这里返回0,在将x递减到
  4. 之后表示错误
  5. x-- - &gt;它未兑现,因为这是一个条件,如果它的一部分是假的,它就会停止
  6. 所以最终值为-1(不是0,所以-1被解释为true)