0

我正在研究 D 语言并同时与 C 和 C++ 语言进行比较。它在 dmd 和 gdc 编译器上都可以正常工作,但是当我在 gcc 编译器上测试时,我发现一个看起来像 GCC 编译器的错误的东西,布尔的默认初始化程序键入而不是 0/false 请参见以下代码:

C++ 代码

#include <iostream>
using namespace std;

int main()
{
    bool b;
    cout << b << endl;
    return 0;
}

G++ 编译器(gcc 版本 4.4.3(Ubuntu 4.4.3-4ubuntu5.1):

g++ -Wall -pedantic test.cpp
test.cpp: In function ‘int main()’: test.cpp:7: warning: ‘b’ is used
uninitialized in this function 
./a.out 64

C 代码(foo.c):

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

#define bool _Bool

int main(int argc, char * args[])
{
    bool b;
    printf("%d\n", b);
    return 0;
}

gcc 编译器

gcc-4.6 -Wall -pedantic a.c
foo.c: In function ‘main’:
foo.c:9:8: warning: ‘b’ is used uninitialized in this function [-Wuninitialized]
./a.out
64

tcc 编译器

tcc -Wall foo.c
./a.out
0

铿锵编译器

clang -Wall -pedantic foo.c     
./a.out
0

有人可以解释 gcc 的行为吗?

4

2 回答 2

6

正如您的警告消息所示,您没有在使用局部变量之前对其进行初始化,因此它们的内容将是未定义的。

于 2012-04-25T00:48:37.267 回答
5

C++ 中基本类型的默认初始化意味着“未初始化”。也就是说,任何值都可以存在。你得到了 64,因为它恰好在那个内存位置。

如果要进行值初始化,则需要使用bool()

bool b = bool(); //Now is false.

值初始化实际上意味着将基本类型初始化为零。

C++11 让这变得更简洁:

bool b{}; //Now is false.
于 2012-04-25T00:58:17.753 回答