今天看了CoolShell的一篇“深入理解C语言”的博文,受益匪浅,简单的写下自己的理解。
1
int main()
{
int a= 42;
printf("%d\n",a);
}
关于这代码,需注意以下几点:
- 这段代码在C++下无法编译,因为C++需要明确声明函数
- 这段代码在C的编译器下会编译通过,因为在编译期,编译器会生成一个printf的函数定义,并生成.o文件,链接时,会找到标准的链接库,所以能编译通过
- 但是,你知道这段程序的退出码吗?在ANSI-C下,退出码是一些未定义的垃圾数。但在C89下,退出码是3,因为其取了printf的返回值。为什么printf函数返回3呢?因为其输出了’4′, ’2′,’\n’ 三个字符。而在C99下,其会返回0,也就是成功地运行了这段程序。你可以使用gcc的 -std=c89或是-std=c99来编译上面的程序看结果
- 另外,我们还要注意main(),在C标准下,如果一个函数不要参数,应该声明成main(void),而main()其实相当于main(…),也就是说其可以有任意多的参数
关于第三点,简单的验证了下:
以C89标准编译运行,显示程序的返回值:
可以看出返回值的确是3.
再以C99的标准来运行:
返回值是0.
如果从汇编的层次来看的话就更明显了:
gcc -std=c89 -S -o c89.s float.c
gcc -std=c99 -S -o c99.s float.c
查看下c89.s
在看一下c99.s
从两张图可看出,唯一不同的是c99.s在 call printf 这条语句后面多了这样一条语句
movl $0,%eax
而eax中存放的是程序的返回值。