C语言中,由if(x=1)引发的if(x=0)与逻辑运算符的一次探究

本人是一枚蒟蒻,刚刚跟随老师学了if语句,其中同学们问了一堆非常‘神奇’的问题,有关If,特此记录。

我们都知道

if(x==1) 语句1;

在x为1时输出为true        会进行  语句1。身为新手的我,常会写错为 

if(x=1) 语句1;

这少个等于 可不得了,因为x=1,if(1)为true          直接导致语句1的必定运行。

爱思考的同学就问了:这个语句运行后x的值会改变吗?

话不多说,直接上代码:

#include<stdio.h>
int main()
{
	int x=0,y=1,z=2;
	if(x=1);
	printf("%d\n",x);
	if(x=0);
	printf("%d\n",x);
	return 0;
}

大家可以猜猜看结果是啥,呃........

不卖关子了,直接给出dev-c的运行结果

3874dc94a8794b209715614d5276166e.png

 有没有想对呢?

从结果中我们可以知道,无论 if()为true 或者 false 其中的赋值语句都会被运行,导致x的值发生改变.

------------------------------------------------------------------------------------------------

以上内容大家可能都在其他地方有所见闻,但如果碰上逻辑运算符,这个赋值语句又会怎么样呢?

#include<stdio.h>
int main()
{
	int x=9,y=1,z=2;
	if((x<y)&&(x=0));
	printf("x=%d\n",x);
	return 0;
}

    if((x<y)&&(x=0));

这语句看着有些奇怪?

者第一次看到也是懵逼的.

根据运算逻辑,应该先算括号从左到右,再算与逻辑

让我们来看看结果

c8641481c96741959744d60a19bb3964.png

x=9?!

有的人可能就要说了,“欸,前面你不是说要进行赋值语句运算的吗?”

我认为可能是括号的问题,于是改了下 

    if(x<y&&(x=0));

按照本人所学的一点小知识,应该是先进行括号的赋值语句 再进行x<y的比较 再与逻辑

可现实狠狠地打了我的脸

0fdfd990431a4b15a27f30c968707a23.png 

还是x=9!

 如果换个顺序呢?

    if((x=0)&&x<y);

bbf05962991b4e21934b0cb6e0347841.png

x=0了!

对此

我们课上得出的结论是

C语言内部对与逻辑运算有一种 “懒惰算法”,就是当与的左边为0时,程序直接“开摆”,不执行右边的语句 。

具体原因是什么,由于我本人水平有限,无法从底层理性说明,只能感性地对此发表一些形象的观点。

这个懒惰算法到底有什么用,有待更多的研究

                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        欢迎各位大佬,在评论区发表下自己的看法。

                                                                                                              一只刚学C语言的小熊猫0.0

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值