为什么使用int i的值; 未定义的行为,但使用rand()的值不是?

ggr*_*grr 3 c++ random undefined-behavior

如果我不初始化i,我不知道它的价值,但我也无法预测它的价值rand().

但另一方面,我知道未初始化的价值iINT_MIN和之间INT_MAX,而且我也知道rand()0和之间的价值RAND_MAX.

为什么使用未初始化的i未定义行为的值但使用的值rand()不是?

Dev*_*lar 7

未初始化变量的值未定义.返回值rand()明确定义为给定种子的伪随机序列中的下一个数字.

你可以依赖rand()返回一个伪随机数.你不能依赖未初始化的任何价值特征int i.

我查阅了C99标准(ISO/IEC 9899:1999),这是我唯一可用的标准文件,但我很怀疑这些事情已经发生了变化.在章的类型6.2.6交涉,更说明整数允许被存储在存储器中与填充比特,其值是未指定的,而是可以包括奇偶校验比特,这将在初始化时和任何算术运算在整数来设置.某些表示(例如奇偶校验不匹配)可能是陷阱表示,其行为未定义(但可能会终止您的程序).

所以,不,你甚至不能依赖于未初始化的int iINT_MIN<= i<= INT_MAX.


jua*_*nza 5

标准说从未初始化的变量读取是未定义的行为,所以它是.你不能说它介于INT_MIN和之间INT_MAX.事实上,无法将该变量视为保留任何值,因此您甚至无法检查该假设*.

rand()另一方面,设计用于产生范围内的随机数.如果从结果中读取rand()未定义,则它不会成为任何库的一部分,因为它无法使用.


*通常"未定义的行为"提供优化的范围.优化器可以使用未初始化的变量执行任何操作,并假设它不是从中读取的.