一段经典的c代码

今天看了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中存放的是程序的返回值。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值