VC 中 for循环初始化变量


VC6.0 编写如下程序,但后缀名分别改为.c和.cpp:

#include<stdio.h>
int main(void)
{ 
 for(int i=0; i<3; i++)
 {
  printf("%d\n", i);
 }
} 

编译后发现:后缀名为.c的程序无法通过编译,而改为.cpp后则顺利通过并能链接和运行。但是,如果将.c中的文件改成如下形式:

#include<stdio.h>
int main(void)
{ 
 int i;        
 for(i=0; i<3; i++)
 {
  printf("%d\n", i);
 }
} 

  则可以顺利编译 。 显然,这是c和c++编译器不同造成的。在c89中规定for循环中的变量必须先声明后赋值,既如上所述,且局部变量的声明必须放在所在函数的最前面。在c99中则可以像int i =0 这样直接声明赋值一起。在Vc编译器中同样支持,程序二以.c后缀命名编译后查看得到的汇编源代码和程序一以.cpp后缀命名编译后得到汇编代码一致,如下:

1:    #include<stdio.h>
2:    int main(void)
3:    {
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,44h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-44h]
0040101C   mov         ecx,11h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
4:        int i;
5:        for(i=0; i<3; i++)
00401028   mov         dword ptr [ebp-4],0
0040102F   jmp         main+2Ah (0040103a)
00401031   mov         eax,dword ptr [ebp-4]
00401034   add         eax,1
00401037   mov         dword ptr [ebp-4],eax
0040103A   cmp         dword ptr [ebp-4],3
0040103E   jge         main+43h (00401053)
6:        {
7:            printf("%d\n", i);
00401040   mov         ecx,dword ptr [ebp-4]
00401043   push        ecx
00401044   push        offset string "%d\n " (0042201c)
00401049   call        printf (00401080)
0040104E   add         esp,8
8:        }
00401051   jmp         main+21h (00401031)
9:    }
00401053   pop         edi
00401054   pop         esi
00401055   pop         ebx
00401056   add         esp,44h
00401059   cmp         ebp,esp
0040105B   call        __chkesp (00401100)
00401060   mov         esp,ebp
00401062   pop         ebp
00401063   ret


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值