C++ 数学运算在全局变量初始化中,机器做什么?

C++ 数学运算在全局变量初始化中,机器做什么?,c++,runtime,compile-time,C++,Runtime,Compile Time,编译器在使用“=”符号右侧的数学运算初始化全局变量时做什么 例如: int global1=75; int global2=32+84; int global3=(global1+global2); int main(){ return global3; } 程序应该返回191=(75+(32+84)) 我不知道编译时或运行时< /P> < > >代码> 32 + 84 < /COD>是一个“常量表达式”,这是C和C++标准中的一个艺术术语,本质上是一个算术表达式,其值可以在不要求编译器知道

编译器在使用“=”符号右侧的数学运算初始化全局变量时做什么

例如:

int global1=75;
int global2=32+84;
int global3=(global1+global2);

int main(){
return global3;
}
程序应该返回191=(75+(32+84))

我不知道编译时或运行时< /P> < > >代码> 32 + 84 < /COD>是一个“常量表达式”,这是C和C++标准中的一个艺术术语,本质上是一个算术表达式,其值可以在不要求编译器知道任何变量的值的情况下计算出来。当使用常量表达式初始化全局变量时,如

int global2=32+84;
从技术上讲,C和C++标准都不需要在编译时对加法进行评估,但是很难找到一个没有这样做的编译器。(还有其他一些情况下,编译器确实必须在编译时计算常量表达式,因此它必须有代码来进行计算,所以它也可以一直这样做。)

global1+global2
不是一个“常量表达式”。在C语言中,这意味着它不能用于初始化全局变量;您将得到一个编译时错误。在C++中,它是允许的,并且未指定加法是否发生在编译时间或运行时。唯一的保证是
global3
将在
main
开始执行时具有正确的值;特别是,如果从全局对象的构造函数中观察到,它可能没有正确的值

(根据经验,g++6在运行时计算
global3
的值,而clang++3.9在编译时计算,这证实了这两种可能性在实践中都会发生。)

<>(在C++中,<代码> > GULAL1+GULAL2如果是 GULAL1和代码>已被声明为代码> const ,则将被认为是一个常量表达式。

< P> <代码> 32 +84 < /Cord>是一个“常量表达式”,这是C和C++标准中的一个艺术术语,基本上是一种算术表达式,其值可以在不要求编译器知道任何变量的值的情况下进行计算。当使用常量表达式初始化全局变量时,如

int global2=32+84;
从技术上讲,C和C++标准都不需要在编译时对加法进行评估,但是很难找到一个没有这样做的编译器。(还有其他一些情况下,编译器确实必须在编译时计算常量表达式,因此它必须有代码来进行计算,所以它也可以一直这样做。)

global1+global2
不是一个“常量表达式”。在C语言中,这意味着它不能用于初始化全局变量;您将得到一个编译时错误。在C++中,它是允许的,并且未指定加法是否发生在编译时间或运行时。唯一的保证是
global3
将在
main
开始执行时具有正确的值;特别是,如果从全局对象的构造函数中观察到,它可能没有正确的值

(根据经验,g++6在运行时计算
global3
的值,而clang++3.9在编译时计算,这证实了这两种可能性在实践中都会发生。)


<>(在C++中,< < > > > GULLAL1+GULAL2如果被认为是一个常量表达式,如果<代码> GULAL1和已经声明为代码> const ),P/> < P> >如果你是C++,我相信GULAL3是在运行时计算的,因为它需要执行实际代码。这叫做动态初始化,C不支持IS,但我相信C++。C和C++都允许静态初始化,这是GULLAR1和2的值,因为实际值存储在磁盘上。试想一下,如果有人给你一个食谱,上面说你需要糖和盐,你把它们混合,然后加面粉,你会把混合好的糖和盐放在周围等着用这个食谱吗?不,你在“运行时”进行混合。然而,你买糖和盐准备,你只是不混合他们。糖和盐是G1和2,混合物是Gual3.3./P>> P>如果你是C++,我相信GualAl3是在运行时计算的,因为它需要实际代码来执行。这叫做动态初始化,C不支持IS,但我相信C++。C和C++都允许静态初始化,这是GULLAR1和2的值,因为实际值存储在磁盘上。试想一下,如果有人给你一个食谱,上面说你需要糖和盐,你把它们混合,然后加面粉,你会把混合好的糖和盐放在周围等着用这个食谱吗?不,你在“运行时”进行混合。然而,你买糖和盐准备,你只是不混合他们。糖和盐是global1和2,混合物是global3。

这个。对不起。标签已更正。谢谢这个,对不起。标签已更正。谢谢这个答案更好:)这个答案更好:)