本人是一枚蒟蒻,刚刚跟随老师学了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的运行结果
有没有想对呢?
从结果中我们可以知道,无论 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));
这语句看着有些奇怪?
笔者第一次看到也是懵逼的.
根据运算逻辑,应该先算括号从左到右,再算与逻辑
让我们来看看结果
x=9?!
有的人可能就要说了,“欸,前面你不是说要进行赋值语句运算的吗?”
我认为可能是括号的问题,于是改了下
if(x<y&&(x=0));
按照本人所学的一点小知识,应该是先进行括号的赋值语句 再进行x<y的比较 再与逻辑
可现实狠狠地打了我的脸
还是x=9!
如果换个顺序呢?
if((x=0)&&x<y);
x=0了!
对此
我们课上得出的结论是
C语言内部对与逻辑运算有一种 “懒惰算法”,就是当与的左边为0时,程序直接“开摆”,不执行右边的语句 。
具体原因是什么,由于我本人水平有限,无法从底层理性说明,只能感性地对此发表一些形象的观点。
这个懒惰算法到底有什么用,有待更多的研究
欢迎各位大佬,在评论区发表下自己的看法。
一只刚学C语言的小熊猫0.0