全局变量初始化中的数学运算,机器是做什么的?

Mathematical operations in global variable initialization, what does the machine do?

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

示例:

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

int main(){
return global3;
}

程序应该 return 191 = (75+(32+84))

不知道是编译时计算的结果还是运行时

32+84 是一个 "constant expression",它是 C 和 C++ 标准中的技术术语,本质上是一个算术表达式,其值可以在不需要编译器的情况下计算知道任何变量的值。当常量表达式用于初始化全局变量时,如您的

int global2=32+84;

从技术上讲,C 和 C++ 标准都不需要在编译时计算附加值,但您很难找到不这样做的编译器就那样(在其他情况下,编译器确实必须在编译时计算常量表达式,所以它必须有代码来做这件事,所以它也可以一直这样做。)

global1+global2 不是 "constant expression"。在 C 中,这意味着它不能用于初始化全局变量;你会得到一个编译时错误。在 C++ 中,这是允许的,并且未指定加法是在编译时还是 运行 时发生。唯一的保证是 global3main 开始执行时将具有正确的值;特别是,如果从全局对象的构造函数观察,它可能具有正确的值。

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

(在 C++ 中,但在 C 中 不是 ,如果 global1global2 都被定义,global1+global2 将被视为常量表达式声明 const.)

如果您指的是 C++,我相信 global3 是在运行时计算的,因为它需要实际代码才能执行。这称为动态初始化,c 不支持,但我相信 c++ 支持。 c 和 c++ 都允许静态初始化,这就是 global1 和 2,因为实际值存储在磁盘上。这样想,如果有人给你一份食谱,说你需要糖和盐,你把它们混合,然后加入面粉,你会把混合的糖和盐储存起来,等待使用食谱吗?不,你在 "runtime" 进行混音。但是,您确实会购买准备好的糖和盐,只是不要将它们混合。糖和盐是global1和2,混合物是global3。