使用 gets func 时 int var 中的值是什么

What value is in the int var when using gets func

我对代码高尔夫产生了兴趣,我从问题中看到了下面的代码:

write a program that gets two one-digit number from stdin separated by space and print the sum of two.

stdin stdout
1 2 3
8 9 17

代码(非高尔夫)

main(n) {
    gets(&n);
    printf("%d",n%85-43);
}

try it online

我调试了代码并得到了 n 的值。

stdin stdout n
1 2 3 3285041

代码输出答案,所以不能是未定义的值,必须有一定的意义。

3285041怎么出来的?

在我们开始解释之前,我会将您的代码修复为与现代标准兼容的版本并删除 deprecated/unsafe 函数 -

所以 -

#include <stdio.h>
int main(int n, char* b[])
{
    fgets((char*)&n, sizeof(n), stdin);
    printf("%d",n%85-43);
}   

现在更正了,让我们看看解释。

所以fgets(或你的情况下的gets)通常用于扫描字符串。它是如何扫描整数的,也是其中的 2 个。

它不会,它将它扫描为字符串,但在用于整数的内存中。所以整数变量的位表示将使用字符串的位表示。这是 n 将获得的值 -

代码依赖于第二个字符 ' ' 和存储的整数,以便首先存储最低有效字节。 它还假定字符使用 ASCII 表示。

0 的 ASCII 值是 48,数字 x(单个数字)的 ASCII 值是 48 + x' ' 的 ASCII 值是 32

假设这两个数字是 xy,n 将是

(48 + x) + (32 * 256) + ((48 + y) * 65536)

我们最终使用的是n % 85 - 43

如果你化简 n % 85 你会得到 x + y + 43.

因此最终结果是 x + y,这是 printf.

打印的结果

编辑: 这是 n % 85

的简化
((48 + x) + (32 * 256) + (65536 * (48 + y))) % 85
((48 + x) % 85 + (32 * 256) % 85 + (65536 * (48 + y)) % 85) % 85
(48 + x + 32 + (3145728 % 85 + 65536y % 85) % 85) % 85
(80 + x + (48 + 65536y) % 85) %85
(80 + x + (48 + ((y % 85) * 1) % 85) % 85
(128 + x + y) % 85
43 + x + y