2.2 示例解释
典型的C程序
#include ---预处理指令
int main( void ) ---main()总是第1个被调用的函数
---语句 ---组成函数的语句
function a() ---语句
function b() ---语句
函数是C程序的构造块
C语言中的6中语句:
标号语句
复合语句
表达式语句
选择语句
迭代语句
跳转语句
C语句
关键字
标识符
运算符
数据
2.2.1 第1遍:快速概要
#include<stdio.h> <---包含另一个文件
该行告诉编译器把stdio.h中的内容包含在当前程序中。stdio.h是C编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持。
int main( void ) <---函数名
C程序包含一个或多个函数,它们是C程序的基本模块。圆括号main()表示一个函数名。int表明main()函数返回一个整数,
void表明main()不带任何参数。
/*一个简单的注释*/ <---注释
注释在/*和*/两个符号之间,这些注释能提高程序的可读性。注释只是为了帮助读者理解程序,编译器会忽略它们。
{ <---函数体开始
左花括号表示函数定义开始,右花括号表示函数定义结束。
int num; <---声明
该声明表明,将使用一个名为num的变量,而且是num是int(整数)类型。
num = 1; <---赋值表达式语句
语句num = 1;把值1赋给名为num的变量。
printf( "I am a simple " ); <---调用一个函数
调用printf()函数,在屏幕上显示I am a simple,光标停在同一行。printf()是标准的C库函数。在程序中使用函数叫作调用函数。
代码\n告诉计算机另起一行,即把光标移至下一行。
%d告诉计算机以何种形式输出num的值,打印在何处。
return 0; <---return语句
C函数可以给调用方提供(或返回)一个数。目前,可暂时把该行看作是结束main()函数的要求。
} <---结束
必须以右花括号表示程序结束。
2.2.2 第2遍:程序细节
1.#include指令和头文件
#include<stdio.h>
#include<stdio.h>的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上,这是一种“拷贝---粘贴”的操作。#include文件提供了一种方便的途径共享许多程序共有的信息。
#include这行代码是一条C预处理器指令(preprocessor directive)。通常,C编译器在编译前会对源代码做一些准备工作,即预处理(preprocessing)。
所有的C编译器软件包都提供stdio.h文件。该文件名的含义是标准输入/输出头文件。
在大多数情况下,头文件包含了编译器创建最终可执行程序要用到的信息。
ANSI/ISO C规定了编译器必须提供那些头文件。特定C实现的文档中应该包含对C库函数的说明。这些说明确定了使用哪些函数需要包含哪些头文件。
注意 为何不内置输入和输出
原因之一是,并非所有的程序都会用到I/O(输入/输出)包,轻装上阵表现了C语言的哲学。正是这种经济使用资源的原则,使得C语言称为流行的嵌入式编程语言。
#include中的#符号表明,C预处理器在编译器接受之前处理这条指令。
2.main()函数
C程序一定从main()函数开始执行(目前不必考虑例外的情况)。除了main()函数,你可以任意命名其他函数。而且main()函数必须是开始的函数。
main()函数的返回的值返回给操作系统。
通常,函数名后面的圆括号中包含一些传入函数的信息。圆括号内是单词void表明没有传递任何信息。
3.注释
/*一个简单的注释*/
C语言注释的好处之一是,可将注释放在任意的地方,甚至是与要解释的内容在同一行。较长的注释可单独放一行或多行。
/*这是一条C注释*/
/*这也是一条注释,
被分成两行。*/
/*
也可以这样写注释。
*/
/*
/*这条注释无效,因为缺少了结束标记。
*/
C99新增了另一种风格的注释,普遍用于C++和Java。这种风格使用//符号创建注释,仅限于单行。
//这种注释只能写成一行。
int rigue; //这种注释也可置于此。
因为一行末尾就标志着注释的结束,所以这种风格的注释只需在开始标明//符号即可。
这种新形式的注释是为了解决旧形式注释存在的潜在问题。假设有下面的代码:
/*
希望能运行。
*/
x = 100;
y = 200;
/* 其他内容已省略 */
接下来,假设你决定删除第4行,但不小心删掉了第3行(*/)。代码如下所示:
/*
希望能运行。
y = 200;
/* 其他内容已省略 */
现在第1行的/*和第4行的*/配对,导致4行代码全都成了注释。而//形式的注释只对单行有效,不会导致“消失代码”的问题。
4.花括号、函数体和块
{
...
}
一般而言,所有的C函数都使用花括号标记函数体的开始和结束。这是规定,不能省略。只有花括号({})能其这种作用。
花括号还可用于把函数中的多条语句合并为一个单元或块。
5.声明
int num;
这行代码叫作声明(declaration)。声明是C语言最重要的特性之一。
int是一种数据类型(即,没有小数点或小数部分的数)。编译器使用这些信息为num变量在内存中分配存储空间。分号在 C语言中是大部分语句和声明的一部分。
int是C语言的一个关键字(keyword)。关键字是语句定义的单词,不能用于其他用途。
示例中的num是一个标识符(identifier),也就是一个变量、函数或其他实体的名称。因此,声明把特定标识符与计算机内存中特定位置联系起来,同时也确定了存储在某位置的信息类型或数据类型。
在C语言中,所有变量都必须先声明才能使用。这意味着必须列出程序中用到的所有变量名及其类型。
以前的C语言,还要求把变量声明在块的顶部,其他语句不能在任何声明的前面。也就是说,main()函数体如下所示:
int main() //旧规则
{
int doors;
int dogs;
doors = 5;
dogs = 3;
//其他语句
}
C99和C11遵循C++的惯例,可以把声明放在块中的任何位置。尽管如此,首次使用变量之前一定要先声明它。
int main() //目前的C规则
{
int doors;
doors = 5; //第1次使用doors
int dogs;
dogs = 3; //第1次使用dogs
//其他语句
}
数据类型
C语言可以处理多种类型的数据,如整数、字符和浮点数。
命名
给变量名命名时要使用有意义的变量名或标识符。如果变量名无法清楚地表达自身的用途,可在注释中进一步说明。这是一种良好的编程习惯和编程技巧。
C90和C11允许使用更长的标识符名,但是编译器只识别前63个字符。对于外部标识符只允许31个字符。实际上,你可以使用更长的字符,但是编译器会忽略超出的字符。
可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第1个字符必须是字母或下划线,不能是数字。
操作系统和C库经常使用以一个或两个下划线开始的标识符,因此最好避免在自己的程序中使用这种名称。标准标签都以一个或两个下划线开始,如库标识符。这样的标识符都是保留的。这意味着,虽然使用它们没有语法错误,但是会导致名称冲突。
C语言的名称区分大小写。
为了让C语言更加国际化,C99和C11根据通用字符名(即UCN)机制扩展字符集。其中包含了除英文字母以外的部分字符。
声明变量的4个理由
*把所有的变量放在一起,方便读者查找和理解程序的用途。
*声明变量会促使你在编写程序之前做一些计划。程序在开始时要获得哪些信息?希望程序如何输出?表示数据最好的方式是什么?
*声明变量有助于发现隐藏在程序中的小错误,如变量名拼写错误。
*如果事先未声明变量,C程序无法通过编译。
C99之前的标准要求把声明都置于块的顶部,这样规定的好吃是:把声明放在一起更容易理解程序的用途。C99允许在需要时才声明变量,这样做的好处是:在给变量赋值之前声明变量,就不会忘记给变量赋值。
6.赋值
num = 1;
这行代码是赋值表达式语句。C语言是通过赋值运算符而不是赋值语句完成赋值操作。赋值是C语言的基本操作之一。可以给num赋不同的值,这就是num之所以被称为变量(variable)的原因。
7.printf()函数
printf( "I am a simple " );
printf( "computer.\n" );
printf( "My favorite number is %d because it is first.\n", num );
圆括号表明printf是一个函数名。圆括号中的内容是从main()函数传递给printf()函数的信息。该信息被称为参数,或者更确切地说,是函数的实际参数(actual argument)。在C语言中,实际参数(简称实参)是传给函数的特定值,形式参数(简称形参)是函数中用于存储值的变量。printf函数会查看双引号中的内容,并将其打印在屏幕上。
当程序运行到这一行时,控制权被转给已命名的函数。函数执行结束后,控制权被返回至主调函数(calling function)。双引号中的\n字符并未输出。这是因为\n的意思是换行。\n组合(依次输入这两个字符)代表一个换行符(newline character)。对于printf()而言,它的意思是“在下一行的最左边开始新的一行”。也就是说,打印换行符的效果与在键盘按下Enter键相同。为何不再键入printf()参数时直接使用Enter键?因为编译器可能认为这是直接的命令,而不是存储在源代码中的命令。换句话说,如果直接按下Enter键,编辑器会退出当前行并开始新的一行。但是,换行符仅会影响输出的显示格式。
换行符是一个转义序列(escape sequence)。转义序列用于代表难以表示或无法输入的字符。\t代表tab键,\b代表Backspace键(退格键)。每个转义序列都以反斜杠字符(\)开始。
%d相当于是一个占位符,其作用是指明输出num值的位置。
%提醒程序,要在该处打印一个变量,d表明把变量作为十进制整数打印。printf函数名中的f提醒用户,这是一种格式化打印函数。
8. return语句
return 0;
C标准要求main()函数返回一个整数。有返回值的C函数要有return语句。该语句以return关键字开始,后面是待返回的值,并以分号结尾。如果遗漏main()函数中的return语句,程序在运行至最外面的右花括号(})时会返回0。因此,可以省略main()函数末尾的return语句。但是,不要在其他有返回值的函数中漏掉它。因此,强力建议读者养成main()函数中保留return语句的好习惯。对于某些操作系统(包括Linux和UNIX),return语句有实际的用途。