练习1.1:编译并运行一个仅含main的程序,main中仅return 0
我采用gcc编译器,cmd命令运行如下:
执行完程序后可以通过echo命令得到程序的返回值
UNIX系统获得状态的命令为:echo $?
Windows系统查看状态的命令为:echo %ERRORLEVEL%
练习1.2:改写程序,让其返回-1,重新编译并运行,观察系统如何处理main的返回值。
cmd命令运行如下:
本身程序返回值为-1,系统显示为-1.
但实际上如果这段程序在linux中编译运行,系统会显示255.
那么这是为什么呢?
实际上这是计算机硬件和操作系统共同作用的结果。
计算机采用补码的方式存储数据,linux系统采用8bit的无符号数标识返回值
而有符号整数-1的补码形式为11111111,linux系统将其转换为无符号整数即为255
在windows批处理中,bat脚本通常用%errorlevel%表达上一条命令的返回值,而这个值是可以为负数的,因此在windows系统下编译运行该程序并查询程序返回值时会返回-1
到这里本次test部分就告一段落了,不过还有一个很有意思的点。我在编译文件时并没有采用gcc -o命令进行重命名而是一直采用默认名称,当1.c编译完成时,会生成a.exe文件供用户运行,而当我们在此基础上编译运行2.c时,并不会生成b.exe,而是直接生成新的a.exe覆盖了之前的内容。