使用 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);
}
我调试了代码并得到了 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
。
假设这两个数字是 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
我对代码高尔夫产生了兴趣,我从问题中看到了下面的代码:
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);
}
我调试了代码并得到了 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
。
假设这两个数字是 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