考试前夜遇到的有趣代码及思考
> 开场
那是一个非同寻常的夜晚,第二天即将考试,我一改往日悠闲刷手机的习惯,转而焦虑地刷着手机,突然微信传来通知

我仔细一看,我去!这不就是我闲的没事做的实验题吗?!,为了检验自己的水平,顺便help my classmate,我毅然决然地接下了这份任务。

> 一.
在我通过了那位同学的好友申请后,我收到了一份代码,其内容如下
#include <stdio.h>
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0 && m==0)
{
break;
}
int num[101];
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
int pos=n;
for(int i=0;i<n;i++)
{
if(num[i]>m)
{
pos=i;
break;
}
}
for(int i=0;i<pos;i++)
{
printf("%d",num[i]);
}
printf("%d",m);
for(int i=pos;i<n;i++)
{
printf("%d",num[i]);
}
printf("\n");
}
return 0;
}
事情开始变得有趣起来了,"四个for循环?!"我暗想道。
同学:"帮忙看看我代码哪里出问题了呗"
我:"善"。
在经历了长达十多分钟的分析后,我彻底看懂了这份代码,作者在Output那一部分的创新让我十分认可,正常的Output应该是输出一个数组里的全部元素,但我这位同学却不同,她别具新意地将Output分为了三部分----"数组前半部分,被插入的数字,数组后半部分"

经一番尝试,我找到了她代码中的问题:存入数组的元素下标写错了
我给了她2个解决方案: 1.修改Output使输出正确
2.修改Input的存入数组部分(更优)
但是问题真的就这么简单吗?
>二.
在解决她的代码时,我发现了一个令我疑惑的问题

上图为错误代码的输出
奇怪?输入的是1 2 4 那么这个0从何而来?

上图为我与Deepseek的对话
既然如此,那么错误输出的num[0]理应是一个随机数啊,为何是0?
一开始我以为是Deepseek又在胡言乱语了,但随着对话的进行,我发现并没有那么简单。
>三.
在我的层层盘问之下,Deepseek居然说出"没准是这个随机数刚好随机到0了"这种胡话,动脑子想想就知道,在int范围内刚好随机到0,这几乎是一个不可能事件!


上图为我连续追问后,Deepseek给出的回答
`
识别关键词:调试模式 ."何为调试模式? "我继续追问道。
`
真相已渐渐浮出水面!
>四.
所以Deepseek之前说数组元素本应是随机数是对的!但它说的那种情况是发布模式,Codeblocks默认的调试模式只会使得数组内元素初始值为0,我终于搞懂了num[0]为什么是0这一问题!
或许这点小问题在某些大神眼里根本算不上什么问题,但对于我来说这的确是个不错的挑战,我收获了新的知识,也获得了关于如何解决问题的一些经验,对于我这个编程爱好者来说,这个"解决问题"的过程已是一份相当有趣的经历,我悠然自得。
有趣,下一次会有什么问题等着我呢?

浙公网安备 33010602011771号