深入理解C语言

发表于:2011-11-07 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陈皓    来源:51Testing软件测试网采编

  导读:Dennis Ritchie过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言。一门经历40多年的到今天还长盛不训的语言,今天很多语言都受到C的影响,C++,Java,C#,Perl,PHP,Javascript等等。但是,你对C了解吗?相信你看过本站的《C语言的谜题》还有《谁说C语言很简单?》。这里,我再写一篇关于深入理解C语言的文章,一方面是缅怀Dennis,另一方面是告诉大家应该如何学好一门语言。(顺便注明一下,下面的一些例子来源于这个slides)。

  文章内容如下:

  首先,我们先来看下面这个经典的代码:

  1. int main()  
  2. {  
  3. int a = 42;  
  4. printf(“%d\n”, a);  
  5. }

  从这段代码里你看到了什么问题?我们都知道,这段程序里少了一个#include <stdio.h> 还少了一个return 0;的返回语句。

  不过,让我们来深入的学习一下,

  这段代码在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(…),也就是说其可以有任意多的参数。

  我们再来看一段代码:

  1. #include <stdio.h> 
  2. void f(void)  
  3. {  
  4. static int a = 3;  
  5. static int b;  
  6. int c;  
  7. ++a; ++b; ++c;  
  8. printf("a=%d\n", a);  
  9. printf("b=%d\n", b);  
  10. printf("c=%d\n", c);  
  11. }  
  12. int main(void)  
  13. {  
  14. f();  
  15. f();  
  16. f();  
  17. }

  这个程序会输出什么?

  我相信你对a的输出相当有把握,就分别是4,5,6,因为那个静态变量。

  对于c呢,你应该也比较肯定,那是一堆乱数。

  但是你可能不知道b的输出会是什么?答案是1,2,3。为什么和c不一样呢?因为,如果要初始化,每次调用函数里,编译器都要初始化函数栈空间,这太费性能了。但是c的编译器会初始化静态变量为0,因为这只是在启动程序时的动作。

  全局变量同样会被初始化。

  说到全局变量,你知道 静态全局变量和一般全局变量的差别吗?是的,对于static 的全局变量,其对链接器不可以见,也就是说,这个变量只能在当前文件中使用。

  我们再来看一个例子:

  1. #include <stdio.h> 
  2. void foo(void)  
  3. {  
  4. int a;  
  5. printf("%d\n", a);  
  6. }  
  7. void bar(void)  
  8. {  
  9. int a = 42;  
  10. }  
  11. int main(void)  
  12. {  
  13. bar();  
  14. foo();  
  15. }

  你知道这段代码会输出什么吗?A)一个随机值,B)42。A 和 B都对(在“在函数外存取局部变量的一个比喻”文中的最后给过这个例子),不过,你知道为什么吗?

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号