自从我在 https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm 上找到此特定文档以来,我一直在思考这一特定的代码行<table class="table table-striped">
<tr>
<th>One</th>
<th>Two</th>
</tr>
<tr>
<td>This is 1st</td>
<td>This is 2nd</td>
</tr>
</table>
。每当我不得不生成一些东西时,我都会使用{ {1}}是为了不每次运行程序时都生成相同的内容,但是当我遇到这个问题时,我一直在想:srand((unsigned)time(&t));
和srand(time(NULL))
之间是否有区别?是因为我它们似乎好像在做同样的事情。为什么要使用time_t变量?为什么在srand((unsigned)time(&t))
中使用了地址运算符?
srand(time(NULL))
答案 0 :(得分:4)
是的,它将产生相同的结果。但是这个例子写得不好。
我会仔细阅读Tutorialspoint。这是一个以不良C代码而闻名的网站,您在SO的问题中看到的许多不良习惯都可以追溯到该网站。好的,这是轶事证据,但我确实在这里问了一个用户,为什么他们强制转换malloc
的结果,他们回答说,他们已经在Tutorialspoint上学到了这一点。实际上,您可以在这个简短的代码片段中看到(至少)四个示例。
time()
,这完全没有必要,只会使代码混乱。 t
,在此示例中这完全没有用。如果您阅读time()
的文档,您会发现在此示例中仅传递NULL就足够了。n
?对于这个简短的示例,使用硬编码值完全可以。而且,当您使用变量来避免使用硬编码的值时,应声明它们const
,并为它们提供比n
更具描述性的名称。#include<time.h>
,如果他们也省略了其余的包含内容,那没关系。一个人可能还会争论另外两件事,但是有些人会不同意。
i
?自20岁的C99以来,在内部声明它是合法的。return 0
结束函数?从C99开始,也可以省略此设置。如果要返回0以外的其他值,则只需要在main中有一个return即可。如果您的目标是在没有支持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)
。如果您不使用变量,则没有理由使用第二个签名。