将夕愿 发表于 2023-6-1 21:32:03

一个小问题

一个普普通通简简单单的教科书上的程序
我想知道不按他的规则只输入一个数字
结果为什么是2^15-1,希望能稍微讲一讲背后的逻辑

陈尚涵 发表于 2023-6-1 21:41:35

我一个提高组的oier居然没看懂[哭

歌者文明清理员 发表于 2023-6-1 22:03:21

本帖最后由 歌者文明清理员 于 2023-6-1 22:12 编辑

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

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

#include <stdio.h>

int main() {
    int max(int x, int y);
    int a, b, c;
    printf("请输入两个数,以空格或回车分隔:");
    scanf("%d", &a);
    if (getchar() == ' ') {
      scanf("%d", &b);
    } else {
      b = 0;
    }
    c = max(a, b);
    printf("max=%d\n", c);
    return 0;
}

int max(int x, int y) {
    int z;
    if (x > y)
      z = x;
    else
      z = y;
    return z;
}

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

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

在实际情况中,变量未被正确初始化或赋值往往是引起程序出错的常见原因之一。因此,在编写程序时,一定要注意对变量进行正确的初始化或赋值。如果遇到未被正确初始化的变量,可以考虑加入适当的输入检查或默认值定义来避免出现类似的问题。

王逗比666 发表于 2023-6-2 15:32:55

因为你没有给b赋值,这个时候系统就会随便给b赋个值再拿这个值和a对比,最后就得到了一个随机的结果,你其实会发现你无论输入什么只要不是合法的输入得到的最后结果都是一样的

zhangjinxuan 发表于 2023-6-2 20:28:13

您的代码没有问题,这个的逻辑主要是因为 a, b 是局部变量,而且您也没有进行正确的 scanf 读入,那么 scanf 就会读入失败。

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

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

巧合,纯属巧合,您的运气真不错{:10_256:}

将夕愿 发表于 2023-6-2 20:43:05

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

我知道我的代码没有问题,我是想知道为什么会出现32767
不管你输入什么数字都会出现32767
我想知道它是怎样运行得出的32767

将夕愿 发表于 2023-6-2 20:44:11

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

感谢您的认真回复

将夕愿 发表于 2023-6-2 20:45:10

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

所以系统每次赋值都是32767吗?

zhangjinxuan 发表于 2023-6-2 20:47:11

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

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

毕竟未赋值的局部变量的值是不确定的。

将夕愿 发表于 2023-6-2 20:48:05

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

毕竟未赋值的局部 ...

好的,看来还得继续学习才能搞懂底层逻辑
感谢您的认真回答

zhangjinxuan 发表于 2023-6-2 20:50:40

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

#include <stdio.h>

int main() {
        int max(int x, int y);
        int a, b, c;
        scanf("%d,%d", &a, &b);
        c = max(a, b);
        printf("max = %d\n", c);
        return 0;
}

int max(int x, int y) {
        int z;
        if (x > y) z = x;
        else z = y;
        return (z);
}

运行结果

max = 12

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

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

另外,这个是没有底层逻辑之分的,没赋值的局部变量都是随机值,无法预测的。

王逗比666 发表于 2023-6-3 10:11:40

将夕愿 发表于 2023-6-2 20:45
所以系统每次赋值都是32767吗?

并不是,随机的,但是当你编译一次之后这个随机值就固定了,所以你无论输什么得到的结果都是32767

将夕愿 发表于 2023-6-3 18:22:07

zhangjinxuan 发表于 2023-6-2 20:50
运行结果




好的

将夕愿 发表于 2023-6-3 18:28:45

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

懂了,原来固定了
页: [1]
查看完整版本: 一个小问题