2.2.1 快速概要
本章节简述程序的每行代码的作用。
#include <stdio.h> <- 包含另一个文件
该行代码告诉编译器把stdio.h中的内容包含在当前程序中。stdio.h是C编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持。
int main(void) <-函数名
C程序包含一个或多个函数,它们是C的基本模块。程序清单2.1的程序中有一个名为main()的函数,圆括号表明main()是一个函数名。
int表明main()函数返回一个整数,void表明mian()不带任何参数。
/* 一个简单的C程序 */ <-注释
注释在/* 和 */两个符号之间,这些注释能提高程序的可读性。注意,注释只是为了帮助读者理解程序,编译器会忽略他们。
{ <- 函数体的开始
左花括号表示函数定义的开始,右花括号( } )表示函数定义结束。
int num; <- 声明
该声明表示,将使用一个名为num的变量,而且num是int(整数)类型。
num = 1; <- 赋值表达式语句
语句num = 1;把值1赋给名为num的变量。
printf("I am a simple "); <- 调用一个函数
该语句使用printf()函数,在屏幕上显示 I am a simple,光标停在同一行。printf()是标准的C库函数。在程序中使用也叫做调用函数。
printf("computer.\n") <- 调用另外一个函数
接下来调用的这个printf()函数在上条语句打印出来的内容后面加上“computer”。代码\n告诉计算机另起一行,即把光标移至下一行。
printf("My favorite number is %d because it is first.\n", num);
最后调用的printf()把num的值(1)内嵌在用双引号括起来的内容中一并打印。%d高告诉计算机以何种形式输出num的值,打印在何处。
return 0; <- return语句
C函数可以给调用方提供(或返回)一个数。
} <- 结束
必须以右花括号表示程序结束。
2.2.1 程序细节
本节将逐行分析程序中的代码,以每行代码为出发点,深入分析代码背后的细节,为更全面地学习C语言编程的特性夯实基础。
1、#include 指令和文件
#include <stdio.h>
这是程序的第一行。#include <stdio.h>的作用相当于把stdio.h文件中所有内容都输入该行所在的位置。实际上,这是一种“拷贝-粘贴”的操作。#include文件提供了一种方便的途径共享许多程序共有的信息。
#include这行代码是一条C预处理指令。通常,C编译器在编译前会对源码做一些准备工作,即预处理。
所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使用的输入和输出函数(如printf())信息。该文件名的含义是标准输入/标准输出头文件。通常,在C程序顶部的信息集合被称为头文件。
2、main函数
int main(void);
该函数名为main。的确,mian是一个极其普通的名称,但是这是唯一的选择。C程序一定从main()函数开始执行。除了main函数,你可以任意命名其他函数,而且main()函数必须是开始的函数。
圆括号的作用:用于识别main()是一个函数。 ·
int是main()函数的返回类型。这表明main()函数返回的值是整数。返回到哪里?返回给操作系统。
通常,函数名后面的圆括号中包含一些传入函数的信息。该例中没有传递任何信息。因此,圆括号内是单词void。
3、注释
/* 一个简单的程序 */
在程序中,被/**/两个符号括起来的部分是程序的注释。写注释能让他人(包括自己)更容易明白你所写的程序。
C语言注释的好处:
-
可将注释放在任意的地方,甚至是与要解释的内容在同一行。
-
较长的注释可单独放一行或多行。
-
在/* 和 */之间的内容都会被编译器忽略。
常见例子:
/* 这是一条C注释 */
/* 这也是一条注释,
被分成两行 */
/*
也可以这样写注释。
*/
/* 这条注释无效,因为缺少了结束标记。
C99新增了另一种风格的注释,这种新风格使用 // 符号创建注释,仅限于单行
// 这种注释只能写成一行
int rigue; // 这种注释也可置于此
因为一行末尾就标志着注释的结束,所以这种风格的注释只需在开始处标明 //符号即可。
为何需要 // 注释?
这种新形式的注释是为了解决旧形式注释存在的潜在问题。假设有以下代码:
/*
希望能运行。
*/
x = 100;
y = 200;
/* 其他内容已省略 */
接下来,假设你决定删除第4行,但不小心删除第3行(*/)。代码如下所示。
/*
希望能运行。
y = 200;
/* 其他内容已省略 */
现在编译器把第1行的/* 和第4行的*/配对,导致第4行代码全部变成注释。而 // 形式的注释只对单行有效,不会导致这种“消失代码”的问题
4、花括号、函数体和块
{
......
}
花括号把main()函数括起来。所有的C函数都使用花括号标记函数体的开始和结束。这是规定,不能省略。只有花括号能起这种作用,圆括号和方括号都不行。
5、声明
int num;
这行代码叫做声明。声明是C语言最重要的特性之一。在该例中,声明完成了两件事。1、在函数中有一个名为num的变量。2、int表明num是一个整数。int是一种数据类型。编译器使用这些信息为num变量在内存中分配存储空间。
在C语言中,所有变量都必须先声明才能使用。这意味着必须列出程序中用到的所有变量名及其类型。
以前的C语言,还要求把变量声明在块的顶部,其他语句不能在任何声明的前面。也就是说,main()函数体如下所示:
int main() // 旧规则
{
int doors;
int dogs;
doors = 5;
dogs = 3;
// 其他语句
}
C99和C11遵循C++的惯例,可以把声明放在块中的任何位置。尽管如此,首次使用变量之前一定要先声明它。上述例子可以改写为:
int main()
{
int doors;
doors = 5; // 第一次使用doors
// 其他语句
int dogs;
dogs = 3; // 第一次使用dogs
// 其他语句
}
数据类型
C语言可以处理多种类型的数据,如整数、字符和浮点数。把变量声明为整数或字符类型,计算机才能正确地存储、读取和解释数据。
命名
给变量命名时要使用有意义的变量名或标识符,如果变量名无法清楚地表达自身的用途,可在注释中进一步说明。
命名规则:
-
小写字母、大写字母、数字、下划线来命名
-
第一个字符必须是字符或者下划线,不能是数字
-
最长不要超过63个字符,编译器可能会省略掉过长的字符
示例:
有效的名称 | 无效的名称 |
---|---|
wiggles | $Z]** |
cat2 | 2cat |
Hot_Tub | Hot-Tub |
taxRate | tax Rate |
_kcab | don't |
操作系统和C库经常使用一个或两个下划线字符开始的标识符(如,_kcab),因此最好避免在自己的程序中使用这些名称。
C语言区分大小写,即把一个字母的大写和小写视为2个不同的字符:
starts和Starts和STARTS不是同一个变量。
6、赋值
num = 1;
这行代码是赋值表达式语句。赋值是C语言的基本操作之一。该行代码的意思是“把值1赋给变量num”,在执行int num;声明时,编译器在计算机内存中位变量num预留了空间,然后在执行这行赋值表达式语句时,把值存储在之前预留的位置。可以给num赋不同的值,这就是num之所以被称为变量的原因。
7、printf()函数
printf("I am a sample ");
printf("computer.\n");
printf("My favorite number is %d because it is first.\n", num);
8、return 语句
return 0;
return居于是函数的最后一条语句。int main(void)中的int表明main()函数应返回一个整数。有返回值的C函数要有return语句。该语句以return关键字开始,后面是待返回的值,并以分号结尾。
如果遗漏main()函数中的return语句,程序在运行至最外面的花括号时会返回0。,因此,可以省略main()函数末尾的return语句。但是不要在其他右返回值的函数中遗漏它。因此,强烈建议在main()函数中保留return语句的好习惯。