由于我在https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm上找到了这个特殊的文档,我一直在考虑这个特殊的代码行srand((unsigned)time(&t));
。每当我必须生成一些东西时,我使用srand(time(NULL))
以便每次运行程序时都不会生成相同的东西,但是当我来到在这一点上,我一直在想:srand((unsigned)time(&t))
和srand(time(NULL))
之间有什么区别吗?因为对我来说他们似乎也做同样的事情。为什么使用time_t变量?为什么在srand()
中使用地址运算符?
#include <stdio.h>
#include<stdlib.h>
int main(){
int i,n;
time_t t;
n = 5;
srand((unsigned)time(&t));
for (i = 0; i < n; i++) {
printf("%d\n", rand() % 50);
}
return(0);
}
是的,它会产生相同的结果。但是这个例子写的很糟糕。
我会小心阅读Tutorialspoint。这是一个以糟糕的C代码着称的网站,你在SO的问题中看到的许多坏习惯都可以追溯到该网站。好吧,这是轶事证据,但我确实向用户询问他们为什么投出malloc
的结果,他们回答说他们在Tutorialspoint上学到了这一点。您可以在这个简短的片段中看到(至少)四个示例。
time()
,这完全没有必要,只会使代码混乱。t
,这在这个例子中完全没用。如果你阅读time()
的文档,你会发现在这个例子中只传递NULL就足够了。n
?对于这个简短的例子,硬编码值完全没问题。当你使用变量来避免硬编码值时,你应该声明它们const
并给它们一个比n
更具描述性的名称。#include<time.h>
,如果他们也省略了其余的包括,那就没问题了。人们也可以争论另外两件事,但有些人会对这些事情持不同意见。
i
?自从C99开始宣布它是合法的,这是20年。return 0
结束这个功能?从C99开始,省略这一点也没问题。如果你想返回0以外的东西,你只需要在main中返回一个。如果您的目标是在没有支持C99的编译器的环境中维护非常旧的C代码,则上述两者都是值得记住的。但这有多常见?
所以,如果我在tutorialspoint重写示例,我会这样写:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand(time(NULL));
for (int i = 0; i < 5; i++) {
printf("%d\n", rand() % 50);
}
}
他们做得好的一件事是他们使用int main()
而不是int main(int argc, char **argv)
。如果您不使用变量,则没有理由使用第二个签名。