第二章主要通过分析一个简单的实例来介绍C语言。
一、程序细节内容
1 #include <stdio.h>
此语句的作用相当于在文件中该行所在的位置键入了文件stdio.h的完整内容。实际上是一种剪切和粘贴操作。
#include语句是C预处理器指令(preprocessor directive)的一个例子。stdio.h文件作为所有C编译包的一部分提供,它包含了有关输入和输出函数的信息供编译器使用。这个名字代表标准输入输出头文件。
最重要的是头文件中包含了建立最终可执行程序时编译器需要用到的信息,如说明函数名以及该函数如何使用。要注意,函数的实际代码被包含在一个预编译代码的库文件中,而不是在头文件中。
头文件是用来指引编译器将程序正确结合在一起的。
最后,#include并不是C语言语句。# 表明这一行是由C预处理器处理的语句。
1 int main(void)
一般情况下,C程序从main()函数开始执行。这里圆括号()表明main()是一个函数。
建议不要使用
1 main()
或者
1 void main()
以上第一种C99标准不允许了,第二种目前没有任何标准考虑接受它。
请坚持使用标准形式,这样程序从一个编译器移到另一个编译器也不会出问题。
二、注释,花括号,程序体和代码块
一般包含在/**/之间的部分是程序注释。有时候也会用 //符号,但是这种注释被限制在一行里。
在编程时,尽量两种注释方法都使用,避免单一的注释风格。
通常,所有的C函数都使用花括号来表示函数的开始和结束。仅有花括号{}能起到这种作用。
三、声明
1 int num;
1.声明在函数中有一个名为num的变量;
2.int说明num是一个整数;
编译器使用这个信息给变量num在内存中分配一个合适的存储空间。
在C语言中,所有变量都必须在使用前定义。声明变量被认为是一个很好的编程技术。
C99遵循C++惯例,允许把声明放在代码块中的任何位置。
变量的命名:可供使用的字符有小写字母、大写字母、数字和下划线(_),第一个字符必须是字母或者下划线。
需要注意,操作系统和C库通常使用一个或者两个下划线开始的名字,所以在编程时,尽量避免这种用法。So,建议第一个字符是字母。
C语言的名字是区分大小写的。
声明变量的好处:
1.将所有变量放在一起,并且赋予变量有意义的名称,会使得程序可读性更高;
2.声明变量会对整个程序的架构有初步的计划;
3.声明变量可以避免程序中发生变量名错误拼写的情况;
4.如果没有声明变量,无法编译C程序。
强烈建议将所有变量声明分组放置在一起。
四、return语句
1 return 0;
在int main(void)中int表示main()函数的返回值应该是个整数。C标准要求main()这样做:带有返回值的C语言函数要使用一个return语句,该语句需要包括关键字return,后面紧跟着要返回的值,然后是分号。
后续读到11章时,再来补充这里的内容。
五、可读性的技巧
1.选择有意义的变量名称;
2.使用注释;
3.使用空行分隔一个函数的该脸上的多个部分;
4.尽量每个语句一行;
六、多个函数
例子如下:
1 /*即使是简单的例子,也要一个个敲出来*/ 2 /*程序清单2.3*/ 3 #include <stdio.h> 4 void butler(void) 5 int main(void) 6 { 7 printf("I will summon the butler function.\n"); 8 butler(); 9 printf("Yes.Bring me some tea.\n"); 10 return 0; 11 } 12 13 void butler(void) 14 { 15 printf("You rang,sir?\n"); 16 }
butler()在程序中出现了三次。
第一次是在原型中,通知编译器要用到的该函数。原型是一种声明方式,用于告诉编译器C程序正在使用一个特殊的函数,指明了函数的属性。
1 void butler(void);
第一个void说明butler()函数不返回值,第二个void表明butler()函数没有参数。
第二次是在main()函数中以函数调用的形式出现。
第三次是在最后给出了函数的定义,即函数本身源代码;
七、调试
语法错误:C的语法错误是将正确的C符号放在了错误的位置。
如何检测程序中的语法错误?
1.编译之前浏览程序的源代码,寻找明显错误;
2.查看由编译器发现的错误。
注意:编译器也会发生错误。某个位置上的一个真正的语法错误可能导致编译器误认为它发现了其他错误,另外,发现错误的位置比真正的错误要滞后一行。
语义错误:在意思上的错误。一般体现在变量名称与实际想要表达的变量不一致。
查找语义错误的方法1:一步一步执行程序并得到结果与实际想要得到的结果进行比较。当然,这个方法比较繁琐,但是却能很好地发现程序中的错误。自然,对于需要迭代10000次的程序......请不要轻易尝试,不过可以选择跟踪其中一部分代码进行分析;
方法2:在程序的关键点出加入打印,用来监视程序运行的情况。
学会如何使用编译器中的调试器是十分重要的。
八、关键字与保留标识符
- auto/break/case/const/continue/default/do/double/else/enum/extern/float/for/goto/if/inline/int
- long/register/restrict/return/short/signed/sizeof/static/struct/switch/typedef/union/unsigned/void/volatifle/while/_Bool/_Complex/_Imaginary
九、关键概念
1.编译器是负责完成将所写的程序转化成机器语言的工作;
2.认真写代码,不得懈怠。
另,复习题和编程练习均已OK,在此不表。