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