繁体   English   中英

为什么此C程序输出-1的输出?

[英]Why does this C program print an output of -1?

我正在练习编程测验,但不确定为什么该程序输出-1:

#include <stdio.h>

int main()
{
    int x = 1;

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

在C语言中,诸如&&||类的逻辑运算符 使用短路评估来评估 ,这实际上意味着当保证一条语句为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时,无需通过评估语句的其余部分来浪费资源,因此将执行else块。

这将导致x的最终值为-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-- ),并且&&短路评估开始,并且评估第二个&&的右侧表达式。

x--     

不; 如上所述,未对此进行评估。

由于条件为假(1 && 0 && dont_care_not_evaluated)因此在else情况下,它仅将 x减2时打印出该值。

用C语言,一旦确定结果,测试语句将终止其操作。 在这种情况下,第一个x--返回1并设置x = 0,第二个x--返回0并设置x = -1。

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

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

  1. x---> 1--在递减为0后在这里返回1
  2. x---> 0--它在这里递减x到
  3. x--->其未修改的,因为这是一个and条件,如果它的一部分为false它将停止

因此最终值将为-1(不是0,因此-1被解释为true)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM