C语言:for循环里的变量,在外面声明与在里面声明,在汇编层面上有区别吗?

!!!喜欢看视频的朋友请点这里!!!

一、变量声明在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循环里面。


全文完

猜你喜欢

转载自blog.csdn.net/h837087787/article/details/122143297