C语言中变量初始化与算术操作的执行时机技术问询
嘿,我来帮你把这些C语言里的初始化和表达式执行时机讲明白~
问题1:初始化操作何时执行?(变量初始化相关)
变量的初始化时机主要取决于它的存储类别,简单来说分两种情况:
- 全局变量/静态局部变量(带
static修饰):- 如果是用常量表达式初始化(比如
int global_x = 5;),这个初始化动作在程序启动前的编译、链接阶段就完成了——程序加载到内存时,这些变量已经带着初始值了。 - 如果是用非常量表达式初始化(比如
int global_y = rand();),这属于动态初始化,会在main函数执行之前的程序初始化阶段完成。
- 如果是用常量表达式初始化(比如
- 局部自动变量(不带
static的局部变量):
不管初始化器是常量还是变量,都会在每次进入该变量的作用域(比如进入函数、进入代码块),执行到变量定义的那一行时,才会执行初始化操作。
问题2:三个算术操作的执行时机
咱们逐个分析:
1+1(对应int x = 1+1;):这是个常量表达式——编译器在编译代码的时候就能算出结果是2,根本不用等到程序运行。所以这个算术操作是在编译阶段执行的,最终代码里直接用2来初始化x。1+2(对应const int b = 1 +2;):和上面一样,1+2是常量表达式,编译器编译时就会算出3,然后用这个值初始化b。哪怕b是局部的const变量,也不影响——这个算术操作还是在编译阶段完成。a+1(对应const int c = a + 1;):这里的a是函数参数,它的值只有在程序运行、调用foo函数传入实参的时候才能确定。所以这个加法操作没办法在编译阶段求值,必须在**函数启动(进入foo函数作用域,执行到c的定义行时)**的时候计算,然后把结果赋值给c。
内容的提问来源于stack exchange,提问作者Takuto Yoshioka




