【问题标题】:Can boolean variables be used to generate random numbers?布尔变量可以用来生成随机数吗?
【发布时间】:2017-11-16 02:06:49
【问题描述】:

我在玩布尔变量。我知道布尔值用于表示真(除 0 之外的任何其他数字)或假(数字 0)。我意识到变量会创建随机整数。我想知道是否可以使用布尔变量来生成随机数?有人可以详细说明由关键字布尔引起的这种行为吗?

我的代码如下:

  #include<stdio.h>
  #include<stdbool.h>

  int main()
 {
  bool a,b,c,d,e,f,g,h,i,j,k;

   printf("%d\n",a);
   printf("%d\n",b);
   printf("%d\n",c);
   printf("%d\n",d);
   printf("%d\n",e);
   printf("%d\n",f);
   printf("%d\n",g);
   printf("%d\n",h);
   printf("%d\n",i);
   printf("%d\n",j);
   printf("%d\n",k);
 }

【问题讨论】:

    标签: c


    【解决方案1】:

    这不是 bool 特有的行为。这是因为您使用的是uninitialized variable。这不仅不是随机的,而且是不安全的。这是undefined behaviour,你应该不惜一切代价避免它。

    【讨论】:

    • 根据 C 标准,未初始化对象的值是不确定的。这不一定会导致未定义的行为。
    • 例如,unsigned char x; printf("%d %d", x, x); 必须打印两次相同的数字。如果根据 C 标准未定义行为,则可能会打印两个不同的值或崩溃。但是行为不是未定义的;它表现得好像x 有一些价值。
    • @EricPostpischil 你有参考资料吗?我以为是未定义的,和c++标准一样?
    • C 2011 [N1570] 6.7.9 10 表示具有自动存储持续时间的未初始化对象具有不确定的值。但是我忘记了6.3.2.1 2,它说,如果对象的地址没有被取走,那么行为是未定义的。因此,插入一个其他未使用的&amp;x; 就足以定义行为,因为它需要x 的地址。
    【解决方案2】:

    布尔值不是随机定义的。这些变量将false 作为默认值。在编译器中。默认值是一致的,而不是时不时的随机0或1。

    【讨论】:

    • 实际上它们没有将任何值作为默认值。在大多数实现中,它是在创建布尔值的内存中的任何值。它可以是 0 或其他任何值。只有在声明为全局或静态时才设置为默认值。
    • 我认为他们有,也许有些语言确实有 0 到任何东西,但有些只有 0 和 1,VB 的布尔值是 0 和 1。如果您将 SQL Server 的位视为布尔值值,它也有0和1
    • Per C 2011 (N1570) 6.7.9 10:“如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。”
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2016-08-13
    • 2014-10-06
    • 2014-10-17
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多