签到

05月06日
尚未签到

共有回帖数 0

    岁月流逝

    等级:
    在C语言中,main函数必须是int型的,而且正常退出时必须返回0。
    测试结果:
    [selian@ArchLinuxPC ~]$ printf "int main(){}"  main.c
    [selian@ArchLinuxPC ~]$ gcc -o main main.c
    [selian@ArchLinuxPC ~]$ ./main
    [selian@ArchLinuxPC ~]$ echo $?
    84 // 返回值不为0说明程序是异常退出的
    [selian@ArchLinuxPC ~]$ printf "int main(){return 0;}"  main.c
    [selian@ArchLinuxPC ~]$ gcc -o main main.c
    [selian@ArchLinuxPC ~]$ ./main
    [selian@ArchLinuxPC ~]$ echo $?
    0 // 正常退出
    但是在C++中:
    [selian@ArchLinuxPC ~]$ printf "int main(){}"  main.cpp
    [selian@ArchLinuxPC ~]$ g++ -o main main.cpp
    [selian@ArchLinuxPC ~]$ ./main
    [selian@ArchLinuxPC ~]$ echo $?
    0 // 正常退出
    [selian@ArchLinuxPC ~]$ printf "int main(){return 0;}"  main.cpp
    [selian@ArchLinuxPC ~]$ g++ -o main main.cpp
    [selian@ArchLinuxPC ~]$ ./main
    [selian@ArchLinuxPC ~]$ echo $?
    0 // 正常退出
    C语言版main(){}的反汇编:
    8048374: 55                   push   %ebp
    8048375: 89 e5                 mov    %esp,%ebp
    8048377: 5d                   pop    %ebp
    8048378: c3                   ret
    C++版main(){}的反汇编:
    8048454: 55                   push   %ebp
    8048455: 89 e5                 mov    %esp,%ebp
    8048457: b8 00 00 00 00       mov    $0x0,%eax
    804845c: 5d                   pop    %ebp
    804845d: c3                   ret
    可见C++为没有返回值的main自动加上了mov $0x0,%eax,即返回值设为0,而C++没有设置寄存器EAX的值,返回值为任意数。
    结论:在C语言中main函数必须写上return 0;而C++中可以不用写了。
    更正:4F的应该是 "C语言没有设置寄存器EAX的值,返回值为任意数" 。
    [selian@ArchLinuxPC ~]$ printf "int main(){}"  main.c
    [selian@ArchLinuxPC ~]$ gcc -o main main.c
    [selian@ArchLinuxPC ~]$ ./main
    [selian@ArchLinuxPC ~]$ echo $?
    84
    实际的返回值就不是0。
    而且反汇编main之前的代码也没有置eax为0的。

    楼主 2015-12-24 21:10 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知