百科问答小站 logo
百科问答小站 font logo



C语言初学者,想问下面这个代码哪里不对,为什么运行不了呢? 第1页

  

user avatar   haozhi-yang-41 网友的相关建议: 
      

这段代码真的神了!

我打算以此为蓝本,稍微改改,列入面试题库。

以后谁要是敢在简历上写“精通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溢出的次数,自然假死了。


对了,面试题里,我再加一个问:这段代码到底循环了多少次?


真乃专治各种不服的良药啊!


user avatar   lu-ren-25-37 网友的相关建议: 
      

虽然用在这里不太合适,但我还是想说“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的?!

二、把bool值相加?

       if (((a==0)+(c==1)+(d==1)+(d==0))==3)     

我相信你不是在依赖隐式转换来炫技,那么你应该知道,符号==的意思是判断是否相等,得到的结果是true或者false,也就是“是”或“否” ,那你这句“如果'是+是+是+是'的结果是3则执行下面大括号里的内容”像人话吗?

三、main的返回值

main函数的返回值用以告诉系统当前程序是否正常退出,只要返回的不是0,就相当于通知电脑当前程序工作不正常,那你永远return 1;是打算?


总结:建议从课本第一页重新看。


user avatar   pansz 网友的相关建议: 
      

看得出来,题主是想要 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; }     


题主看起来还算挺靠谱,发个程序只有两个小问题,解决了就直接能运行,而且知道用代码段提问而不是手机拍屏,我觉得还是挺有前途的。




  

相关话题

  求BAT代码或C语言代码如何自动复制剪切板文本并分行保存一个txt? 
  Rust有可能在嵌入式领域取代C的位置吗? 
  为什么有些编程语言写完一句后要加分号? 
  C 与 C++ 谁的效率高,为什么? 
  为什么指针不能相加? 
  从操作系统内存管理来说,malloc申请一块内存的背后原理是什么? 
  怎样通俗地解释「堆栈溢出」是什么? 
  如何滴水不漏的学完C语言? 
  假如用汇编语言重制某游戏或者软件能否降低 CPU 性能损耗? 
  请问如何区分c语言中float和double的用法? 

前一个讨论
程序员的穿搭真的是清一色格子衬衫吗?
下一个讨论
太空垃圾被地球引力吸引,垃圾在大气层坠落的过程中会烧毁殆尽,那么地球不就等于超自然焚化炉吗?





© 2024-11-05 - tinynew.org. All Rights Reserved.
© 2024-11-05 - tinynew.org. 保留所有权利