C+中的基元类型+;C中的vs 在C++中,具有原始类型( int >代码>双 > char < /C> >……未定义如此未定义的行为。基元类型没有默认值,因为它们没有构造函数。但是,当没有上下文时,编译器会一致地给出默认值(0):

C+中的基元类型+;C中的vs 在C++中,具有原始类型( int >代码>双 > char < /C> >……未定义如此未定义的行为。基元类型没有默认值,因为它们没有构造函数。但是,当没有上下文时,编译器会一致地给出默认值(0):,c++,gcc,compiler-construction,C++,Gcc,Compiler Construction,在这里,相同的编译,但每次都会产生不同的结果: 21898, 22075, 22020, 21906, ... 未定义原语变量的gcc实现是什么 更奇怪的是,与C相比,我可以 #include <stdio.h> int main(){ int i; printf("%i\n",i); } #包括 int main(){ int i; printf(“%i\n”,i); } 并且编译器总是一致,默认值为0。因此,相同的编译器,但对于相同的基

在这里,相同的编译,但每次都会产生不同的结果:

21898, 22075, 22020, 21906, ...
未定义原语变量的gcc实现是什么

更奇怪的是,与C相比,我可以

#include <stdio.h>

int main(){
    int i;
    printf("%i\n",i);
}
#包括
int main(){
int i;
printf(“%i\n”,i);
}
并且编译器总是一致,默认值为
0
。因此,相同的编译器,但对于相同的基元类型,不同的语言会给出不同的结果。我很想知道C++库是如何处理非定义的原始变量的。 <> C++中的C VS中的原始类型有什么不同?我不是在问UB,而是问在这两种语言中如何定义这些类型以及它们之间的区别

编译器在给定默认值(0)时是一致的

也许吧,但这是你不能依赖的

未定义原语变量的gcc实现是什么

如果不查看源代码并跟踪执行以了解在特定情况下会发生什么(优化标志、编译器版本、输入代码…),很难说

编译器始终保持一致,默认值为0

尝试在周围添加代码,您可能也能看到C的“随机”值

因此,相同的编译器,但对于相同的基元类型,不同的语言会给出不同的结果

您使用的是同一个编译器这一事实并不能保证行为始终有效。即使您总是使用完全相同的编译器版本和相同的构建标志,行为也可能因不同的输入代码而改变

编译器在给定默认值(0)时是一致的

也许吧,但这是你不能依赖的

未定义原语变量的gcc实现是什么

如果不查看源代码并跟踪执行以了解在特定情况下会发生什么(优化标志、编译器版本、输入代码…),很难说

编译器始终保持一致,默认值为0

尝试在周围添加代码,您可能也能看到C的“随机”值

因此,相同的编译器,但对于相同的基元类型,不同的语言会给出不同的结果

您使用的是同一个编译器这一事实并不能保证行为始终有效。即使您总是使用完全相同的编译器版本和相同的构建标志,行为也可能因不同的输入代码而改变

在C++中,具有原始类型(<代码> int <代码> >代码>双<代码> > <代码> char < /代码>,……)未定义如此未定义的行为。< /P> 我想你指的是未初始化的——只是让它们未初始化并不是未定义的行为。事实上,在以后阅读它们之前,当您知道要为它们赋值时,这是很常见的

基元类型没有默认值,因为它们没有构造函数

获取具有静态或线程本地存储持续时间的对象

与C相比,我可以

您已经观察到程序可以具有的许多允许行为中的一个特定行为。C标准规定:

用C语言初始化(重点):

  • 如果没有明确初始化具有自动存储持续时间的对象,其值是不确定的

  • 如果没有显式初始化具有静态或线程存储持续时间的对象,则:

    -如果有指针类型,则初始化为空指针

    -如果它有算术类型,则初始化为(正或无符号)零

    -如果它是一个聚合,则根据这些规则(递归地)初始化每个成员,并将任何填充初始化为零位

    -如果它是一个并集,则根据这些规则(递归地)初始化第一个命名成员,并将任何填充初始化为零位

看来你的假设是错误的。编译器不需要一致。根据优化标志和一周中的哪一天等,它可能会在程序的不同部分执行不同的操作

在C++中,具有原始类型(<代码> int <代码> >代码>双<代码> > <代码> char < /代码>,……)未定义如此未定义的行为。< /P> 我想你指的是未初始化的——只是让它们未初始化并不是未定义的行为。事实上,在以后阅读它们之前,当您知道要为它们赋值时,这是很常见的

基元类型没有默认值,因为它们没有构造函数

获取具有静态或线程本地存储持续时间的对象

与C相比,我可以

您已经观察到程序可以具有的许多允许行为中的一个特定行为。C标准规定:

用C语言初始化(重点):

  • 如果没有明确初始化具有自动存储持续时间的对象,其值是不确定的

  • 如果没有显式初始化具有静态或线程存储持续时间的对象,则:

    -如果有指针类型,则初始化为空指针

    -如果它有算术类型,则初始化为(正或无符号)零

    -如果它是一个聚合,则根据这些规则(递归地)初始化每个成员,并将任何填充初始化为零位

    -如果它是一个并集,则根据这些规则(递归地)初始化第一个命名成员,并将任何填充初始化为零位

21898, 22075, 22020, 21906, ...
#include <stdio.h>

int main(){
    int i;
    printf("%i\n",i);
}