我对代码高尔夫感兴趣,我从问题中看到了下面的代码:
write a program that gets two one-digit number from stdin separated by space and print the sum of two.
1 2
3
8 9
17
代码(非高尔夫)
main(n) {
gets(&n);
printf("%d",n%85-43);
}
我调试了代码并得到了值 n
.
n
1 2
3
3285041
代码输出答案,因此它不能是未定义的值并且必须具有某种含义。
怎么会3285041
出来了吗?
最佳答案
在我们开始解释之前,我将把您的代码修复为与现代标准兼容的版本,并删除已弃用/不安全的函数 -
所以 -
#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
。
假设两个数字是x
和y
,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
关于c - 使用 gets func 时 int var 的值是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219777/