2017-08-27 35 views
-5

我现在正在学习C编程(我对它很陌生),我也在尝试各种各样的东西来理解事情的工作方式。所以,我很清楚下面的代码是不正确的代码;但我还是尝试了一下,了解它将如何编译:在C编程中,%d是否随机生成数字?

#include <stdio.h> 
#include <stdlib.h> 

int { 
    printf("I think C will give me %d %d %d %d %d.", 20); 
    return 0; 
} 

而且我在命令行中得到这个:

 
I think C will give me 20 8 108 108 2. 
Process returned 0 (0x0) execution time : 0.234 s 
Press any key to continue. 

如果从号码8,108,108和2 ?他们是如何产生的?

我只是想了解它是如何工作的。谢谢。

+1

这是未定义的行为,这就是为什么。 –

+1

您只为五个'%d'格式说明符中的第一个提供了参数,所以行为未定义。 –

+3

行为未定义。没有人知道这些数字是如何“生成”的,因为在实践中它将取决于许多特定实施情况。换句话说,可以想出一个“真实生活”的答案,但它高度依赖于你的设置。我们从这里看不到它。 – AnT

回答

1

因为它是未定义的行为。

没有随机参与,它只是printf()试图找到每个"%d"的correspoing参数,并将它访问内存不指向任何参数,所以它打印任何发现的情况。

但严格来说,这是未定义的行为。如果存在比参数更多的格式说明符,则标准不会指定行为。

所以通过一个单一的int变量,当函数需要5会导致不确定的行为,并在实践中这是不可能预测什么事情发生。

+2

这就是[FGITW](https://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem)。不要这样做。另外,我相信你知道这是许多事情的重复,因为你正在回答标准的UB响应,所以投票结束。 – Ryan

+1

@Ryan谢谢你的链接,我应该从头开始想到它,我再也不会这么做了。 –

+1

@Iharob [编辑:是,在删除评论]正确地说,这个答案本质上是正确的。尤其重要的是断言不涉及随机性。计算机是(理想)确定性机器。如果你知道前提条件,你可以绝对预测程序打印的数字。这就是为什么您需要通过随机敲击键盘来为一些应用程序(如加密密钥生成)手动生成随机性的原因。使用没有参数的printf强调*不是产生随机数的一种方法。 –