问题描述
#include<stdio.h>
int main(){
int y=15;
if(y++>19 && y++!=21 && y++>21)
printf("%d",y);
else
printf("%d",y);
return 0;
}
我预计输出为 15 甚至 18,但它给出了 16,我不知道为什么。
解决方法
这里 y++>19 ==> y 与 19 进行比较,然后由于后缀 ++ 增加。 因此,y++>19 实际上被计算为 15>19,然后 y 递增并变为 16。
由于 15>19 为假,其余的条件 y++!=21 && y++>21 不会被评估,控制转到 else 条件并打印 y。由于上面的 y 已经变成了 16,所以打印出 16。
请注意,在短路评估中,A && B && C,如果 A 被评估为真,则只有 B 被评估。 如果 A 和 B 都被评估为真,则只有 C 被评估。
因此,在您的情况下,由于 A 为假,因此没有对 B 和 C 进行进一步评估,控件只是输入其中的其他部分并打印 y。
,我建议阅读运算符优先级(以及结合性)。通常每种语言都有一个解释功能的规范,C 也是如此。在线资源比比皆是,学习 C 的一本好书是 K&R,解释得很好,而且练习很有趣。
我将引导您完成此示例:
int y=15; // y is assigned the value 15,the return of the assignment is discarded (you will encounter that fact sooner or later surely)
if 语句可以用 (y++>19) && (y++!=21) && (y++>21)
来表示清楚。 &&
运算符是短路的:即一旦可以确定最终结果,其余的将不会被评估。具体来说,在这种情况下,一旦看到 false
或 0
,它就会停止评估并返回 false
。
y++>19
有两个运算符,后缀增量(更高的优先级)和大于(更低的优先级)。后缀增量首先返回值,然后对其进行增量,因此有效地计算 15>19 并且 y
增加到 16
。现在记住短路。程序停止计算该表达式,因为最终结果不会改变。程序进入 else 部分并打印分配给 y
的值,即 16
。
有几件事情正在发生
if(y++>19 && y++!=21 && y++>21)
&&
运算符(连同 ||
、?:
和逗号运算符)强制从左到右求值,这意味着 y++ > 19
在 {{ 之前求值1}},它将在 y++ != 21
之前进行评估。它还引入了一个序列点,因此 y++ > 21
的所有副作用都将在 y++ > 19
被评估之前应用。
y++ != 21
运算符 short-circuits - &&
仅在 y++ != 21
评估为非零 (y++ > 19
) 时才会评估,并且true
仅在两个先前表达式的计算结果都为非零时才会计算。
后缀 y++ > 21
运算符产生操作数的当前值(因此 ++
的计算结果为 y++
);作为副作用,它会增加操作数,因此在计算 15
后,y++ > 19
会增加到 y
,即使整个表达式的计算结果为 {{ 1}} (16
)。
这是你写的,但只是一点点shorter and faster
:
#include<stdio.h>
int main(){
int y = 15;
y++; // y = y + 1; means value of variable y equals 16 at this point
if(y != 21 && y > 19) // now you check this 16 != 21 && 16 > 19 which is false
printf("%d",y);
else // continue here directly
printf("%d",y); // print value of variable y
return 0; // exit success
}
是的,结果总是16。如果这不是您所期望的,请确保更正您的第一条语句 if(y != 21 && y > 19)
。
我希望,这会帮助您更正您的 IF 语句(我的建议)。
我可以向您推荐以下两个视频,以便在编写此类语句之前正确理解赋值、逻辑和比较运算符,因为:
false AND true -> false
true AND false -> false
(1) ArithmeticOperator 程序 https://www.youtube.com/watch?v=oaO2eT46Mm8
(2) 比较运算符程序 https://www.youtube.com/watch?v=ovKVOj3xNsA
(3) LogicalOperator 程序 https://www.youtube.com/watch?v=kclf0PQnxrI
赞成更正后的答案。