【发布时间】:2015-01-31 03:54:50
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
main() {
int j, u[23] = {0};
while (!u[19]) {
while (u[j = rand() % 23]++)
;
putchar("uatChks rteJ r hon,\neca"[j]);
}
}
是一段用于打印的混淆代码
只是另一个 C 黑客,
它适用于我尝试过的两种不同的在线编译器/解释器(ideone.com 和 codepad.org),但当我使用 GCC 运行它时却不行。
当我使用 GCC 构建并运行它时,它会打印:
,cthehasok tre anu
在我的计算机上,我正在使用以下命令构建它:
gcc C:\Programming\c\JACH.c -o JACH
我认为问题与rand() 函数有关,也可能与RAND_MAX 宏有关:
在我的编译器中,RAND_MAX 被定义为 32767,而在 ideone.com 上,它是 2147483647。我不确定这是否真的与它有关,但我确信rand() 是问题所在,在运行了这样的测试之后:
srand(0);
int i;
for (i=1;i<4;i++) {
printf("%d: %d\n", i, rand() % 23);
}
这段代码在不同的编译器中产生了非常不同的结果,
gcc:
1: 15
2: 14
3: 9
ideone.com:
1: 11
2: 0
3: 6
有谁知道如何强制我的编译器提供与 ideone.com/online 编译器相同的结果?
【问题讨论】:
-
我不确定您是否可以依赖
rand()作为跨系统的相同实现。 -
@JS1 好的,有什么方法可以测试吗?
-
@JS1 是的,我明白你的意思,但我该如何测试/修复它?
-
您可以使用一个简单的程序对其进行测试,该程序会打印前几个
rand()结果。我知道如果你不播种,你总是会在一台机器上从rand()获得相同的序列(这对测试很有用),但请记住 - 它是一个随机数生成器。请参阅上一个问题stackoverflow.com/questions/1026327/…
标签: c build compilation sublimetext2