在GCC编译器上布尔类型的C和C++语言的缺省初始化器是64,而不是0。是编译器错误吗? 我研究D语言,同时与C++语言进行比较,它在DMD和GDC编译器上都很好,但是当我在GCC编译器上测试时,发现了一个看起来像GCC编译器错误的东西,布尔类型的默认初始化器而不是0 /false,请参阅下面的代码:

在GCC编译器上布尔类型的C和C++语言的缺省初始化器是64,而不是0。是编译器错误吗? 我研究D语言,同时与C++语言进行比较,它在DMD和GDC编译器上都很好,但是当我在GCC编译器上测试时,发现了一个看起来像GCC编译器错误的东西,布尔类型的默认初始化器而不是0 /false,请参阅下面的代码:,c++,c,gcc,C++,C,Gcc,C++代码 C codefoo.C: tcc编译器 铿锵编译器 有人能解释gcc的行为吗 > P>当警告消息指示,在使用它们之前,你不初始化局部变量,所以它们的内容将是未定义的。 < P>基本类型的C++默认初始化意味着未初始化。也就是说,任何值都可以存在。你得到了64,因为它恰好在那个内存位置 如果要进行值初始化,则需要使用bool: 值初始化实际上意味着将基本类型初始化为零 C++11使这一点更加清晰: bool b{}; //Now is false. 提示:请看警告。默认情况下,C++

C++代码

C codefoo.C:

tcc编译器

铿锵编译器


有人能解释gcc的行为吗

> P>当警告消息指示,在使用它们之前,你不初始化局部变量,所以它们的内容将是未定义的。

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

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

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

C++11使这一点更加清晰:

bool b{}; //Now is false.

提示:请看警告。默认情况下,C++没有指定变量初始化为任何对象。有人可以删除-1吗?这是一个真正的问题@杰克:不,这是C/C++的东西。谢谢你的解释。“但为什么是64号呢?”杰克,因为这正是目前堆栈上的数字。如果您真的想知道,您可以跟踪crt0启动代码,看看是什么留下了该值;但你问的是明确未定义的行为。
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
#include <stdio.h>
#include <stdbool.h>

#define bool _Bool

int main(int argc, char * args[])
{
    bool b;
    printf("%d\n", b);
    return 0;
}
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 -Wall foo.c
./a.out
0
clang -Wall -pedantic foo.c     
./a.out
0
bool b = bool(); //Now is false.
bool b{}; //Now is false.