一、变量声明在for循环外面
C代码如下:
#include <stdio.h>
int main() {
int i, p;
for (i = 0; i < 5; ++i) {
p = i;
printf("%d ", p);
}
return 0;
}
对应的汇编代码如下:
mov DWORD PTR [rbp-0x4],0x0
jmp 0x401581 <main+49>
mov eax,DWORD PTR [rbp-0x4]
mov DWORD PTR [rbp-0x8],eax
mov eax,DWORD PTR [rbp-0x8]
mov edx,eax
lea rcx,[rip+0x2a88] # 0x404000
call 0x402aa0 <printf>
add DWORD PTR [rbp-0x4],0x1
cmp DWORD PTR [rbp-0x4],0x4
jle 0x401566 <main+22>
mov eax,0x0
add rsp,0x30
pop rbp
ret
二、变量声明在 for循环里面
C代码如下:
#include <stdio.h>
int main() {
for (int i = 0; i < 5; ++i) {
int p = i;
printf("%d ", p);
}
return 0;
}
对应的汇编代码如下:
mov DWORD PTR [rbp-0x4],0x0
jmp 0x401581 <main+49>
mov eax,DWORD PTR [rbp-0x4]
mov DWORD PTR [rbp-0x8],eax
mov eax,DWORD PTR [rbp-0x8]
mov edx,eax
lea rcx,[rip+0x2a88] # 0x404000
call 0x402aa0 <printf>
add DWORD PTR [rbp-0x4],0x1
cmp DWORD PTR [rbp-0x4],0x4
jle 0x401566 <main+22>
mov eax,0x0
add rsp,0x30
pop rbp
ret
三、结论
两段C代码对应的汇编代码一模一样,没有任何区别。
因此推荐把变量声明在离使用最近的地方。
四、补充
早期的C语言代码都是在C90标准下编写的,变量是不允许声明for循环里面的,而必须声明在外面。久而久之,大家形成习惯了。
从2015发布的gcc5.1开始,默认的C语言标准已经是C11了,因此以后可以放心大胆地使用C99的标准了,也就是把变量声明在for循环里面。
全文完