这段代码真的神了!
我打算以此为蓝本,稍微改改,列入面试题库。
以后谁要是敢在简历上写“精通C/C++”的,一律拿这题出来问运行结果是啥。
认真一点说吧,这段代码其实是能跑的——但是别问我这段代码到底是想干嘛就行了。
例如说最诡异的一段写法是这个:
for(int a=0||1;a++;)
这代码虽然看着很诡异,但仔细分析其实没问题的:
int a=0||1
这是个逻辑或,0||1的结果永远是1。
然后,我们就可以把代码简化为:
for(int a=1;a++;)
这时候,虽然这个循环看着是一个错误的语法,或者有回答觉得是个死循环。然而实际上并不是:当a在不断++之后,产生溢出,从而可以顺利的回绕到0,这时候这个循环就可以退出来了。想验证一把的,可以把这代码中的int改为char,缩小一下溢出次数就知道了。而代码原文之所以有“死循环”的错觉,是它叠加了4层int溢出的次数,自然假死了。
对了,面试题里,我再加一个问:这段代码到底循环了多少次?
真乃专治各种不服的良药啊!
虽然用在这里不太合适,但我还是想说“Not even wrong”。好一阵子没时间答题了,难得今天打开问题推荐列表,就给我看这个?!
这段代码就没有几行是无错的,以至于无法猜测出你想要实现什么。只能大概说说典型错误吧。
for(int a=0||1;a++;)
这行代码实在令人费解,a=0||1
也许能通过编译,但它不是人话。符号||
用以表示“或者”,通常用于连接多个bool值,而不是数字。直接读这句话大概就是“把a设置成0或者1” ,“0或者1”是什么东西啦。
然后说for
括号内的东西,for
括号内被分号分为三段,分别是“循环初始化”“循环终止条件”“每次循环后要做的”。而你在这里分别填写了“把a设置成0或者1” “把a加1,如果a不为0就继续循环”“不做任何事”,合起来大概就是“先把a设置成0或者1,然后反复执行下面大括号里的内容,每次执行完就给a加上1,直到a等于0”,你是怎么觉得给一个正整数反复加1最终能到0的?!
if (((a==0)+(c==1)+(d==1)+(d==0))==3)
我相信你不是在依赖隐式转换来炫技,那么你应该知道,符号==
的意思是判断是否相等,得到的结果是true或者false,也就是“是”或“否” ,那你这句“如果'是+是+是+是'的结果是3则执行下面大括号里的内容”像人话吗?
main
函数的返回值用以告诉系统当前程序是否正常退出,只要返回的不是0,就相当于通知电脑当前程序工作不正常,那你永远return 1;
是打算?
总结:建议从课本第一页重新看。
看得出来,题主是想要 0..1 的 range 式循环,可是 C 语言并没有哦。
C语言可以这样实现,把循环声明改成 :
for(int a=0;a<=1;a++)
就可以了,四行循环头都要对应修改哦。
剩下的经测试没啥问题,哦,printf后边需要加 哦。
#include <stdio.h> int main () { for(int a=0; a<=1;a++) for(int b=0;b<=1;b++) for(int c=0;c<=1;c++) for(int d=0;d<=1;d++) { if (a+b+c+d==1){ if (((a==0)+(c==1)+(d==1)+(d==0))==3) { if (a==1) printf("a是小偷。
"); if (b==1) printf("b是小偷。
"); if (c==1) printf("c是小偷。
"); if (d==1) printf("d是小偷。
"); } } } return 1; }
题主看起来还算挺靠谱,发个程序只有两个小问题,解决了就直接能运行,而且知道用代码段提问而不是手机拍屏,我觉得还是挺有前途的。