[英]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(不是0,因此-1被解释为true)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.