int f (void) { static int mm=1; mm++; printf("%d\n",mm); }
int mm=1; int f (void) { mm++; printf("%d\n",mm); }
有的变量是在编译的时候初始化的,有的变量是在运行的时候初始化的。
[quote=引用 40 楼 sholber 的回复:] [quote=引用 37 楼 worldy 的回复:] [quote=引用 14 楼 sholber 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] 编译的时候没初始化,那代码段汇编指令中的常量是谁写上去的?
[quote=引用 37 楼 worldy 的回复:] [quote=引用 14 楼 sholber 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] 编译的时候没初始化,那代码段汇编指令中的常量是谁写上去的?
闲来无事去读读gcc或g++源代码killtime吧。
int a =10; 可以编译为 push eax mov eax,10 mov ebp[a],eax //自动变量 ,全局的话 一般是 mov a,eax .。。。。。 pop eax int a[]={10,9,8,7,6,5,4} : 就 很难 编译为这种代码 可能就成为 (全局数组 ) a dd 10,9,8,7,6 ,5,4 了 也可能编译为(自动数组) a_tmp dd 10,9,8,7,6 ,5,4 了//数据 然后 //代码 push esi push edi push ecx mov esi ,a_tmp lea edi,a[ebp] rep movsd 。。。。 pop ecx pop edi pop esi 常量(表达式),编译成 立即数是很平常的, 变量,某种情况下也可能优化成常量,最终编译成立即数 串字面值 整型,浮点型,数组初始化列表,经常编译成 全局数据 用DB,DW,DD,DF,DQ,TB等伪指令定义 结构,类,可能编译为 结构类型 这一类初始化表,可能用结构定义方式定义 也可能用宏(宏指令)来定义 另外,由于编译器的各种策略,编译选项不同,可以用很多种不同的方法 ,编译同样的C,C++代码
int a =10; 可以编译为 mov ebp[a],10 int a[]={10,9,8,7,6,5,4} : 就 很难 编译为这种代码 可能就成为 a dd 10,9,8,7,6 ,5,4 了 也可能编译为 a_tmp dd 10,9,8,7,6 ,5,4 了//数据 然后 //代码 push esi push edi push ecx mov esi ,a_tmp lea edi,a[ebp] rep movsd 常量(表达式),编译成 立即数是很平常的, 变量,某种情况下也可能优化成常量,最终编译成立即数 串字面值 整型,浮点型,数组初始化列表,经常编译成 全局数据 用DB,DW,DD,DF,DQ,TB等伪指令定义 结构,类,可能编译为 结构类型 这一类初始化表,可能用结构定义方式定义 也可能用宏(宏指令)来定义 另外,由于编译器的各种策略,编译选项不同,可以用很多种不同的方法 ,编译同样的C,C++代码
[quote=引用 29 楼 zhao4zhong1 的回复:] 盲人摸太阳 说是一物即不中
[quote=引用 14 楼 sholber 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] 编译的时候没初始化,那代码段汇编指令中的常量是谁写上去的?
[quote=引用 22 楼 learnc2015 的回复:] [quote=引用 20 楼 zhao4zhong1 的回复:] 别跟我说被编译器优化为立即数的取值不变的变量不是变量。
[quote=引用 20 楼 zhao4zhong1 的回复:] 别跟我说被编译器优化为立即数的取值不变的变量不是变量。
盲人摸太阳 说是一物即不中
[quote=引用 11 楼 zhao4zhong1 的回复:] 编译的时候没初始化,那代码段汇编指令中的常量是谁写上去的?
70,036
社区成员
243,244
社区内容
加载中
试试用AI创作助手写篇文章吧