鱼C论坛

 找回密码
 立即注册
查看: 819|回复: 13

[已解决]一个小问题

[复制链接]
发表于 2023-6-1 21:32:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一个普普通通简简单单的教科书上的程序 f4e45f59051a891777a1e60a300fe93.png
我想知道不按他的规则只输入一个数字 c3d3f512e2e7c0126c0392bfc0881b1.png
结果为什么是2^15-1,希望能稍微讲一讲背后的逻辑
最佳答案
2023-6-1 22:03:21
本帖最后由 歌者文明清理员 于 2023-6-1 22:12 编辑

根据你提供的代码,在输入一个数字时出现了输出结果为32767的情况,原因是该程序中没有对只输入一个数字的情况进行处理,此时变量b没有被正确地赋值,导致程序在进行比较时使用了未被初始化的变量,从而导致输出了奇怪的结果。

对于这种情况,一种简单的解决方法是在读入变量a时,再判断是否还有另一个变量,如果没有则将变量b赋值为0。修改后的代码如下:

  1. #include <stdio.h>

  2. int main() {
  3.     int max(int x, int y);
  4.     int a, b, c;
  5.     printf("请输入两个数,以空格或回车分隔:");
  6.     scanf("%d", &a);
  7.     if (getchar() == ' ') {
  8.         scanf("%d", &b);
  9.     } else {
  10.         b = 0;
  11.     }
  12.     c = max(a, b);
  13.     printf("max=%d\n", c);
  14.     return 0;
  15. }

  16. int max(int x, int y) {
  17.     int z;
  18.     if (x > y)
  19.         z = x;
  20.     else
  21.         z = y;
  22.     return z;
  23. }
复制代码


这样,当用户只输入一个数字时,程序会自动将第二个变量赋值为0,避免了出现未定义行为的情况,输出结果也会正常。

在C语言中,未初始化的变量会被赋予一个随机的值。在这个程序中,由于只有变量a被正确读入,而变量b没有被正确赋值,所以变量b的值是一个未知的随机值。此后在调用max函数时,变量b的值会与变量a做比较,由于变量b的值是随机的,可能大于或小于变量a的值,从而得到一个错误的判断结果。在输出时,使用了错误的值,导致了错误的结果。

在实际情况中,变量未被正确初始化或赋值往往是引起程序出错的常见原因之一。因此,在编写程序时,一定要注意对变量进行正确的初始化或赋值。如果遇到未被正确初始化的变量,可以考虑加入适当的输入检查或默认值定义来避免出现类似的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-1 21:41:35 | 显示全部楼层
我一个提高组的oier居然没看懂[哭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 22:03:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 2023-6-1 22:12 编辑

根据你提供的代码,在输入一个数字时出现了输出结果为32767的情况,原因是该程序中没有对只输入一个数字的情况进行处理,此时变量b没有被正确地赋值,导致程序在进行比较时使用了未被初始化的变量,从而导致输出了奇怪的结果。

对于这种情况,一种简单的解决方法是在读入变量a时,再判断是否还有另一个变量,如果没有则将变量b赋值为0。修改后的代码如下:

  1. #include <stdio.h>

  2. int main() {
  3.     int max(int x, int y);
  4.     int a, b, c;
  5.     printf("请输入两个数,以空格或回车分隔:");
  6.     scanf("%d", &a);
  7.     if (getchar() == ' ') {
  8.         scanf("%d", &b);
  9.     } else {
  10.         b = 0;
  11.     }
  12.     c = max(a, b);
  13.     printf("max=%d\n", c);
  14.     return 0;
  15. }

  16. int max(int x, int y) {
  17.     int z;
  18.     if (x > y)
  19.         z = x;
  20.     else
  21.         z = y;
  22.     return z;
  23. }
复制代码


这样,当用户只输入一个数字时,程序会自动将第二个变量赋值为0,避免了出现未定义行为的情况,输出结果也会正常。

在C语言中,未初始化的变量会被赋予一个随机的值。在这个程序中,由于只有变量a被正确读入,而变量b没有被正确赋值,所以变量b的值是一个未知的随机值。此后在调用max函数时,变量b的值会与变量a做比较,由于变量b的值是随机的,可能大于或小于变量a的值,从而得到一个错误的判断结果。在输出时,使用了错误的值,导致了错误的结果。

在实际情况中,变量未被正确初始化或赋值往往是引起程序出错的常见原因之一。因此,在编写程序时,一定要注意对变量进行正确的初始化或赋值。如果遇到未被正确初始化的变量,可以考虑加入适当的输入检查或默认值定义来避免出现类似的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-2 15:32:55 | 显示全部楼层
因为你没有给b赋值,这个时候系统就会随便给b赋个值再拿这个值和a对比,最后就得到了一个随机的结果,你其实会发现你无论输入什么只要不是合法的输入得到的最后结果都是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-2 20:28:13 | 显示全部楼层
您的代码没有问题,这个的逻辑主要是因为 a, b 是局部变量,而且您也没有进行正确的 scanf 读入,那么 scanf 就会读入失败。

如果读入失败,那么 scanf 不会操作任何值,即 a, b 仍然是一个随机的数字。

随机皆有可能,包括 32767,当然可能还会包括其他情况。

巧合,纯属巧合,您的运气真不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-2 20:43:05 | 显示全部楼层
zhangjinxuan 发表于 2023-6-2 20:28
您的代码没有问题,这个的逻辑主要是因为 a, b 是局部变量,而且您也没有进行正确的 scanf 读入,那么 scan ...

我知道我的代码没有问题,我是想知道为什么会出现32767
不管你输入什么数字都会出现32767
我想知道它是怎样运行得出的32767
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-2 20:44:11 | 显示全部楼层
歌者文明清理员 发表于 2023-6-1 22:03
根据你提供的代码,在输入一个数字时出现了输出结果为32767的情况,原因是该程序中没有对只输入一个数字的 ...

感谢您的认真回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-2 20:45:10 | 显示全部楼层
王逗比666 发表于 2023-6-2 15:32
因为你没有给b赋值,这个时候系统就会随便给b赋个值再拿这个值和a对比,最后就得到了一个随机的结果,你其 ...

所以系统每次赋值都是32767吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-2 20:47:11 | 显示全部楼层
将夕愿 发表于 2023-6-2 20:43
我知道我的代码没有问题,我是想知道为什么会出现32767
不管你输入什么数字都会出现32767
我想知道它是 ...


背后的原理十分复杂,需要考虑各部分软件的运行状态、运行状态等等。

毕竟未赋值的局部变量的值是不确定的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-2 20:48:05 | 显示全部楼层
zhangjinxuan 发表于 2023-6-2 20:47
背后的原理十分复杂,需要考虑各部分软件的运行状态、运行状态等等。

毕竟未赋值的局部 ...

好的,看来还得继续学习才能搞懂底层逻辑
感谢您的认真回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-2 20:50:40 | 显示全部楼层
将夕愿 发表于 2023-6-2 20:48
好的,看来还得继续学习才能搞懂底层逻辑
感谢您的认真回答

  1. #include <stdio.h>

  2. int main() {
  3.         int max(int x, int y);
  4.         int a, b, c;
  5.         scanf("%d,%d", &a, &b);
  6.         c = max(a, b);
  7.         printf("max = %d\n", c);
  8.         return 0;
  9. }

  10. int max(int x, int y) {
  11.         int z;
  12.         if (x > y) z = x;
  13.         else z = y;
  14.         return (z);
  15. }
复制代码


运行结果

  1. max = 12
复制代码


很明显,虽然 a 得到了正确的输入,但是 b 却没有得到输入,是一个随机值,这个随机值可能是 0,可能是 1,也可能是 114514。

未赋值的局部变量的值几乎是无法预测的(除非你能获取每一个软件的运行状态),在使用之前一定要赋值。

另外,这个是没有底层逻辑之分的,没赋值的局部变量都是随机值,无法预测的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-3 10:11:40 | 显示全部楼层
将夕愿 发表于 2023-6-2 20:45
所以系统每次赋值都是32767吗?

并不是,随机的,但是当你编译一次之后这个随机值就固定了,所以你无论输什么得到的结果都是32767
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-3 18:22:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-3 18:28:45 | 显示全部楼层
王逗比666 发表于 2023-6-3 10:11
并不是,随机的,但是当你编译一次之后这个随机值就固定了,所以你无论输什么得到的结果都是32767

懂了,原来固定了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 14:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表