【问题标题】:Default value of dynamic bool array in C++ [duplicate]C ++中动态布尔数组的默认值[重复]
【发布时间】:2014-06-11 07:09:51
【问题描述】:

我需要创建一个由参数传递的长度未知的布尔数组。所以,我有以下代码:

void foo (int size) {

    bool *boolArray = new bool[size];

    for (int i = 0; i < size; i++) {

            if (!boolArray[i]) {

                cout << boolArray[i];

            }
    }
}

我认为布尔数组正在使用错误值进行初始化...

然后,如果我在 Eclipse(在 Ubuntu 上)中运行该代码,它对我来说工作正常,该函数会打印所有值,因为 !boolArray[i] 返回 true(但值不是false 值,它们是垃圾值)。如果我在 Visual Studio 中运行它,这些值也是垃圾值,但该函数不会打印任何值(因为 !boolArray[i] 返回 false)。为什么数组值默认不是假值?!?为什么 !boolArray[i] 在 Visual Studio 中返回 false 而在 Eclipse 中返回 true?!?

我读到了这个问题:Set default value of dynamic array,所以如果我像下面这样更改代码,它对我来说也可以正常工作(在 Eclipse 和 Visual Studio 中)!但我不知道为什么。

void foo (int size) {

    bool *boolArray = new bool[size]();

    for (int i = 0; i < size; i++) {

            if (!boolArray[i]) {

                cout << boolArray[i];

            }      
    }
}

对不起,我的英语不好!

提前致谢!

【问题讨论】:

  • @ShafikYaghmour 实际上,我有两个问题...该帖子回答了一个问题,但没有说明为什么 !boolArray[i] 在 Visual Studio 中返回 false 而在 Eclipse 中返回 true...跨度>
  • 使用未初始化的变量是未定义的行为,所以它并没有真正这么说,但我不认为这方面使它不是一个重复。
  • @ShafikYaghmour 谢谢!!!

标签: c++ arrays dynamic boolean


【解决方案1】:

为 POD 实例添加 (),在 C++03 及更高版本中调用 值初始化。在 C++98 中,它调用了默认初始化。但是对于 POD 类型,两者都减少到 零初始化,对于布尔值,零是错误的。

例如,如果 S 是 POD struct,并且您有一个变量

S o;

然后你可以通过这样做将它归零

o = S();

不需要不安全和丑陋的memset


顺便说一句,std::vector&lt;bool&gt;bool 原始数组的更高级别替代方案,但由于现在被视为过早优化,它有一些奇怪的行为:它支持每个布尔值的实现一位,因此取消引用迭代器不会像一般std::vector 所期望的那样为您提供对bool 的引用。所以更好的选择是例如std::vector&lt;My_bool_enum&gt;,正确定义了My_bool_enum。或者只是std::vector&lt;char&gt;。 ;-)


关于

“为什么 !boolArray[i] 在 Visual Studio 中返回 false 而在 Eclipse 中返回 true?!?”

只是 Visual C++ 选择了效率,而不是在它不需要的地方初始化,而 Eclipse 中使用的编译器(可能是 g++)会进行初始化,即使它不需要也不要求这样做。

我更喜欢这里的 Visual C++ 行为有两个原因:

  • C++ 的一个主要理念是不用为不用的东西付费,这里的 Visual C++ 行为符合这个理念。

  • 零初始化很容易给用户一种错误的印象,即他们的代码可以工作,而实际上它是不可移植的。

【讨论】:

  • 非常感谢!!!我现在明白了!谢谢!!!
猜你喜欢
  • 2014-02-25
  • 1970-01-01
  • 2011-12-13
  • 2011-02-27
  • 2015-10-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多