C语言入门经典 第2章 C语言概述.docx

上传人:b****3 文档编号:3650138 上传时间:2022-11-24 格式:DOCX 页数:25 大小:311.31KB
下载 相关 举报
C语言入门经典 第2章 C语言概述.docx_第1页
第1页 / 共25页
C语言入门经典 第2章 C语言概述.docx_第2页
第2页 / 共25页
C语言入门经典 第2章 C语言概述.docx_第3页
第3页 / 共25页
C语言入门经典 第2章 C语言概述.docx_第4页
第4页 / 共25页
C语言入门经典 第2章 C语言概述.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

C语言入门经典 第2章 C语言概述.docx

《C语言入门经典 第2章 C语言概述.docx》由会员分享,可在线阅读,更多相关《C语言入门经典 第2章 C语言概述.docx(25页珍藏版)》请在冰豆网上搜索。

C语言入门经典 第2章 C语言概述.docx

C语言入门经典第2章C语言概述

第2章C语言概述

本章介绍以下内容:

运算符:

=

函数:

main()、printf()编写一个简单的C程序创建整型变量,为其赋值并在屏幕上显示其值换行字符如何在程序中写注释,创建包含多个函数的程序,发现程序的错误什么是关键字

C程序是什么样子的?

浏览本书,能看到许多示例。

初见C程序会觉得有些古怪,程序中有许多{、cp->tort和*ptr++这样的符号。

然而,在学习C的过程中,对这些符号和C语言特有的其他符号会越来越熟悉,甚至会喜欢上它们。

如果熟悉与C相关的其他语言,会对C语言有似曾相识的感觉。

本章,我们从演示一个简单的程序示例开始,解释该程序的功能。

同时,强调一些C语言的基本特性。

2.1简单的C程序示例

我们来看一个简单的C程序,如程序清单2.1所示。

该程序演示了用C语言编程的一些基本特性。

请先通读程序清单2.1,看看自己是否能明白该程序的用途,再认真阅读后面的解释。

程序清单2.1first.c程序

#include 

intmain(void)        /*一个简单的C程序*/

{

intnum;         /*定义一个名为num的变量*/

num=1;         /*为num赋一个值*/

printf("Iamasimple"); /*使用printf()函数*/

printf("computer.\n");

printf("My favorite number is %d because it is first.\n",num);

return 0;

}

如果你认为该程序会在屏幕上打印一些内容,那就对了!

光看程序也许并不知道打印的具体内容,所以,运行该程序,并查看结果。

首先,用你熟悉的编辑器(或者编译器提供的编辑器)创建一个包含程序清单2.1中所有内容的文件。

给该文件命名,并以.c作为扩展名,以满足当前系统对文件名的要求。

例如,可以使用first.c。

现在,编译并运行该程序(查看第1章,复习该步骤的具体内容)。

如果一切运行正常,该程序的输出应该是:

Iamasimplecomputer.

Myfavoritenumberis1becauseitisfirst.

总而言之,结果在意料之中,但是程序中的\n和%d是什么?

程序中有几行代码看起来有点奇怪。

接下来,我们逐行解释这个程序。

程序调整

程序的输出是否在屏幕上一闪而过?

某些窗口环境会在单独的窗口运行程序,然后在程序运行结束后自动关闭窗口。

如果遇到这种情况,可以在程序中添加额外的代码,让窗口等待用户按下一个键后才关闭。

一种方法是,在程序的return语句前添加一行代码:

getchar();

这行代码会让程序等待击键,窗口会在用户按下一个键后才关闭。

在第

8章中会详细介绍getchar()的内容。

2.2示例解释

我们会把程序清单2.1的程序分析两遍。

第1遍(快速概要)概述程序中每行代码的作用,帮助读者初步了解程序。

第2遍(程序细节)详细分析代码的具体含义,帮助读者深入理解程序。

图2.1总结了组成C程序的几个部分[1],图中包含的元素比第1个程序多。

图2.1C程序解剖

2.2.1第1遍:

快速概要

本节简述程序中的每行代码的作用。

下一节详细讨论代码的含义。

#include   ←包含另一个文件

该行告诉编译器把stdio.h中的内容包含在当前程序中。

stdio.h是C编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持。

intmain(void)    ←函数名

C程序包含一个或多个函数,它们是C程序的基本模块。

程序清单2.1的程序中有一个名为main()的函数。

圆括号表明main()是一个函数名。

int表明main()函数返回一个整数,void表明main()不带任何参数。

这些内容我们稍后详述。

现在,只需记住int和void是标准ANSIC定义main()的一部分(如果使用ANSIC之前的编译器,请省略void;考虑到兼容的问题,请尽量使用较新的C编译器)。

/*一个简单的C程序*/   ←注释

注释在/*和*/两个符号之间,这些注释能提高程序的可读性。

注意,注释只是为了帮助读者理解程序,编译器会忽略它们。

{    ←函数体开始

左花括号表示函数定义开始,右花括号(})表示函数定义结束。

intnum;   ←声明

该声明表明,将使用一个名为num的变量,而且num是int(整数)类型。

num=1;   ←赋值表达式语句语句num=1;把值1赋给名为num的变量。

printf("Iamasimple");←调用一个函数

该语句使用printf()函数,在屏幕上显示Iamasimple,光标停在同一行。

printf()是标准的C库函数。

在程序中使用函数叫作调用函数。

printf("computer.\n");  ←调用另一个函数

接下来调用的这个printf()函数在上条语句打印出来的内容后面加上“computer”。

代码\n告诉计算机另起一行,即把光标移至下一行。

printf("Myfavoritenumberis%dbecauseitisfirst.\n",num);

最后调用的printf()把num的值

(1)内嵌在用双引号括起来的内容中一并打印。

%d告诉计算机以何种形式输出num的值,打印在何处。

return0;  ←return语句

C函数可以给调用方提供(或返回)一个数。

目前,可暂时把该行看作是结束main()函数的要求。

}    ←结束

必须以右花括号表示程序结束。

2.2.2第2遍:

程序细节

浏览完程序清单2.1后,我们来仔细分析这个程序。

再次强调,本节将逐行分析程序中的代码,以每行代码为出发点,深入分析代码背后的细节,为更全面地学习C语言编程的特性夯实基础。

1.#include指令和头文件

#include

这是程序的第1行。

#include的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。

实际上,这是一种“拷贝-粘贴”的操作。

include文件提供了一种方便的途径共享许多程序共有的信息。

#include这行代码是一条C预处理器指令(preprocessordirective)。

通常,C编译器在编译前会对源代码做一些准备工作,即预处理

(preprocessing)。

所有的C编译器软件包都提供stdio.h文件。

该文件中包含了供编译器使用的输入和输出函数(如,printf())信息。

该文件名的含义是标准输入/输出头文件。

通常,在C程序顶部的信息集合被称为头文件(header)。

在大多数情况下,头文件包含了编译器创建最终可执行程序要用到的信息。

例如,头文件中可以定义一些常量,或者指明函数名以及如何使用它们。

但是,函数的实际代码在一个预编译代码的库文件中。

简而言之,头文件帮助编译器把你的程序正确地组合在一起。

ANSI/ISOC规定了C编译器必须提供哪些头文件。

有些程序要包含stdio.h,而有些不用。

特定C实现的文档中应该包含对C库函数的说明。

这些说明确定了使用哪些函数需要包含哪些头文件。

例如,要使用printf()函数,必须包含stdio.h头文件。

省略必要的头文件可能不会影响某一特定程序,但是最好不要这样做。

本书每次用到库函数,都会用#include指令包含

ANSI/ISO标准指定的头文件。

注意为何不内置输入和输出

读者一定很好奇,为何不把输入和输出这些基本功能内置在语言中。

原因之一是,并非所有的程序都会用到I/O(输入/输出)包。

轻装上阵表现了C语言的哲学。

正是这种经济使用资源的原则,使得C语言成为流行的嵌入

式编程语言(例如,编写控制汽车自动燃油系统或蓝光播放机芯片的代

码)。

#include中的#符号表明,C预处理器在编译器接手之前处理这条指

令。

本书后面章节中会介绍更多预处理器指令的示例,第16章将更详细地讨论相关内容。

2.main()函数

intmain(void);

程序清单2.1中的第2行表明该函数名为main。

的确,main是一个极其普通的名称,但是这是唯一的选择。

C程序一定从main()函数开始执行(目前不必考虑例外的情况)。

除了main()函数,你可以任意命名其他函数,而且main()函数必须是开始的函数。

圆括号有什么功能?

用于识别main()是一个函数。

很快你将学到更多的函数。

就目前而言,只需记住函数是C程序的基本模块。

int是main()函数的返回类型。

这表明main()函数返回的值是整数。

返回到哪里?

返回给操作系统。

我们将在第6章中再来探讨这个问题。

通常,函数名后面的圆括号中包含一些传入函数的信息。

该例中没有传递任何信息。

因此,圆括号内是单词void(第11章将介绍把信息从main()函数传回操作系统的另一种形式)。

如果浏览旧式的C代码,会发现程序以如下形式开始:

main()

C90标准勉强接受这种形式,但是C99和C11标准不允许这样写。

因此,即使你使用的编译器允许,也不要这样写。

你还会看到下面这种形式:

voidmain()

一些编译器允许这样写,但是所有的标准都未认可这种写法。

因此,编译器不必接受这种形式,而且许多编译器都不能这样写。

需要强调的是,只要坚持使用标准形式,把程序从一个编译器移至另一个编译器时就不会出什么问题。

3.注释

/*一个简单的程序*/

在程序中,被/**/两个符号括起来的部分是程序的注释。

写注释能让他人(包括自己)更容易明白你所写的程序。

C语言注释的好处之一是,可将注释放在任意的地方,甚至是与要解释的内容在同一行。

较长的注释可单独放一行或多行。

在/*和*/之间的内容都会被编译器忽略。

下面列出了一些有效和无效的注释形式:

/*这是一条C注释。

*/

/*这也是一条注释,

被分成两行。

*/

/*

也可以这样写注释。

*/

/*这条注释无效,因为缺少了结束标记。

C99新增了另一种风格的注释,普遍用于C++和Java。

这种新风格使用//符号创建注释,仅限于单行。

//这种注释只能写成一行。

intrigue;//这种注释也可置于此。

因为一行末尾就标志着注释的结束,所以这种风格的注释只需在注释开始处标明//符号即可。

这种新形式的注释是为了解决旧形式注释存在的潜在问题。

假设有下面的代码:

/*

希望能运行。

*/

x= 100;

y= 200;

/*其他内容已省略。

*/

接下来,假设你决定删除第4行,但不小心删掉了第3行(*/)。

代码如下所示:

/*

希望能运行。

y = 200;

/*其他内容已省略。

*/

现在,编译器把第1行的/*和第4行的*/配对,导致4行代码全都成了注释(包括应作为代码的那一行)。

而//形式的注释只对单行有效,不会导致这种“消失代码”的问题。

一些编译器可能不支持这一特性。

还有一些编译器需要更改设置,才能支持C99或C11的特性。

考虑到只用一种注释风格过于死板乏味,本书在示例中采用两种风格的注释。

4.花括号、函数体和块

{

...

}

程序清单2.1中,花括号把main()函数括起来。

一般而言,所有的C函数都使用花括号标记函数体的开始和结束。

这是规定,不能省略。

只有花括号

({})能起这种作用,圆括号(())和方括号([])都不行。

花括号还可用于把函数中的多条语句合并为一个单元或块。

如果读者熟悉Pascal、ADA、Modula-2或者Algol,就会明白花括号在C语言中的作用类似于这些语言中的begin和end。

5.声明

intnum;

程序清单2.1中,这行代码叫作声明(declaration)。

声明是C语言最重

要的特性之一。

在该例中,声明完成了两件事。

其一,在函数中有一个名为num的变量(variable)。

其二,int表明num是一个整数(即,没有小数点或小数部分的数)。

int是一种数据类型。

编译器使用这些信息为num变量在内存中分配存储空间。

分号在C语言中是大部分语句和声明的一部分,不像在

Pascal中只是语句间的分隔符。

int是C语言的一个关键字(keyword),表示一种基本的C语言数据类型。

关键字是语言定义的单词,不能做其他用途。

例如,不能用int作为函数名和变量名。

但是,这些关键字在该语言以外不起作用,所以把一只猫或一个可爱的小孩叫int是可以的(尽管某些地方的当地习俗或法律可能不允许)。

示例中的num是一个标识符(identifier),也就一个变量、函数或其他实体的名称。

因此,声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了储存在某位置的信息类型或数据类型。

在C语言中,所有变量都必须先声明才能使用。

这意味着必须列出程序中用到的所有变量名及其类型。

以前的C语言,还要求把变量声明在块的顶部,其他语句不能在任何声明的前面。

也就是说,main()函数体如下所示:

intmain()//旧规则

{int doors;int dogs;doors = 5;dogs = 3;

//其他语句

}

C99和C11遵循C++的惯例,可以把声明放在块中的任何位置。

尽管如此,首次使用变量之前一定要先声明它。

因此,如果编译器支持这一新特性,可以这样编写上面的代码:

intmain()      //目前的C规则

{

//一些语句

int doors;doors=5;//第1次使用doors

//其他语句

int dogs;dogs=3;//第1次使用dogs//其他语句

}

为了与旧系统更好地兼容,本书沿用最初的规则(即,把变量声明都写在块的顶部)。

现在,读者可能有3个问题:

什么是数据类型?

如何命名?

为何要声明变量?

请往下看。

数据类型

C语言可以处理多种类型的数据,如整数、字符和浮点数。

把变量声明为整型或字符类型,计算机才能正确地储存、读取和解释数据。

下一章将详细介绍C语言中的各种数据类型。

命名

给变量命名时要使用有意义的变量名或标识符(如,程序中需要一个变量数羊,该变量名应该是sheep_count而不是x3)。

如果变量名无法清楚地表达自身的用途,可在注释中进一步说明。

这是一种良好的编程习惯和编程技巧。

C99和C11允许使用更长的标识符名,但是编译器只识别前63个字符。

对于外部标识符(参阅第12章),只允许使用31个字符。

〔以前C90只允许

6个字符,这是一个很大的进步。

旧式编译器通常最多只允许使用8个字

符。

〕实际上,你可以使用更长的字符,但是编译器会忽略超出的字符。

也就是说,如果有两个标识符名都有63个字符,只有一个字符不同,那么编译器会识别这是两个不同的名称。

如果两个标识符都是64个字符,只有最后一个字符不同,那么编译器可能将其视为同一个名称,也可能不会。

标准并未定义在这种情况下会发生什么。

可以用小写字母、大写字母、数字和下划线(_)来命名。

而且,名称的第1个字符必须是字符或下划线,不能是数字。

表2.1给出了一些示例。

表2.1有效和无效的名称

操作系统和C库经常使用以一个或两个下划线字符开始的标识符(如,_kcab),因此最好避免在自己的程序中使用这种名称。

标准标签都以一个或两个下划线字符开始,如库标识符。

这样的标识符都是保留的。

这意味着,虽然使用它们没有语法错误,但是会导致名称冲突。

C语言的名称区分大小写,即把一个字母的大写和小写视为两个不同的字符。

因此,stars和Stars、STARS都不同。

为了让C语言更加国际化,C99和C11根据通用字符名(即UCN)机制添加了扩展字符集。

其中包含了除英文字母以外的部分字符。

欲了解详细内容,请参阅附录B的“参考资料VII:

扩展字符支持”。

声明变量的4个理由

一些更老的语言(如,FORTRAN和BASIC的最初形式)都允许直接使用变量,不必先声明。

为何C语言不采用这种简单易行的方法?

原因如下。

把所有的变量放在一处,方便读者查找和理解程序的用途。

如果变量名都是有意义的(如,taxtate而不是r),这样做效果很好。

如果变量名无法表述清楚,在注释中解释变量的含义。

这种方法让程序的可读性更高。

声明变量会促使你在编写程序之前做一些计划。

程序在开始时要获得哪些信息?

希望程序如何输出?

表示数据最好的方式是什么?

声明变量有助于发现隐藏在程序中的小错误,如变量名拼写错误。

例如,假设在某些不需要声明就可以直接使用变量的语言中,编写如下语句:

RADIUS1=20.4;

在后面的程序中,误写成:

CIRCUM=6.28*RADIUSl;

你不小心把数字1打成小写字母l。

这些语言会创建一个新的变量

RADIUSl,并使用该变量中的值(也许是0,也许是垃圾值),导致赋给

CIRCUM的值是错误值。

你可能要花很久时间才能查出原因。

这样的错误在C语言中不会发生(除非你很不明智地声明了两个极其相似的变量),因为编译器在发现未声明的RADIUSl时会报错。

如果事先未声明变量,C程序将无法通过编译。

如果前几个理由还不足以说服你,这个理由总可以让你认真考虑一下了。

如果要声明变量,应该声明在何处?

前面提到过,C99之前的标准要求把声明都置于块的顶部,这样规定的好处是:

把声明放在一起更容易理解程序的用途。

C99允许在需要时才声明变量,这样做的好处是:

在给变量赋值之前声明变量,就不会忘记给变量赋值。

但是实际上,许多编译器都还不支持C99。

6.赋值

num=1;

程序清单中的这行代码是赋值表达式语句[2]。

赋值是C语言的基本操作之一。

该行代码的意思是“把值1赋给变量num”。

在执行intnum;声明时,编译器在计算机内存中为变量num预留了空间,然后在执行这行赋值表达式语句时,把值储存在之前预留的位置。

可以给num赋不同的值,这就是num之所以被称为变量(variable)的原因。

注意,该赋值表达式语句从右侧把值赋到左侧。

另外,该语句以分号结尾,如图2.2所示。

图2.2赋值是C语言中的基本操作之一

7.printf()函数

printf("Iamasimple");

printf("computer.\n");

printf("Myfavoritenumberis%dbecauseitisfirst.\n",num);

这3行都使用了C语言的一个标准函数:

printf()。

圆括号表明printf是一个函数名。

圆括号中的内容是从main()函数传递给printf()函数的信息。

如,上面的第1行把Iamasimple传递给printf()函数。

该信息被称为参数,或者更确切地说,是函数的实际参数(actualargument),如图2.3所示。

〔在C语言中,实际参数(简称实参)是传递给函数的特定值,形式参数(简称形参)是函数中用于储存值的变量。

第5章中将详述相关内容。

〕printf()函数用参数来做什么?

该函数会查看双引号中的内容,并将其打印在屏幕上。

图2.3带实参的printf()函数

第1行printf()演示了在C语言中如何调用函数。

只需输入函数名,把所需的参数填入圆括号即可。

当程序运行到这一行时,控制权被转给已命名的函数(该例中是printf())。

函数执行结束后,控制权被返回至主调函数

(callingfunction),该例中是main()。

第2行printf()函数的双引号中的\n字符并未输出。

这是为什么?

\n的意思是换行。

\n组合(依次输入这两个字符)代表一个换行符(newline

character)。

对于printf()而言,它的意思是“在下一行的最左边开始新的一

行”。

也就是说,打印换行符的效果与在键盘按下Enter键相同。

既然如此,为何不在键入printf()参数时直接使用Enter键?

因为编辑器可能认为这是直接的命令,而不是储存在在源代码中的指令。

换句话说,如果直接按下Enter键,编辑器会退出当前行并开始新的一行。

但是,换行符仅会影响程序输出的显示格式。

换行符是一个转义序列(escapesequence)。

转义序列用于代表难以表示或无法输入的字符。

如,\t代表Tab键,\b代表Backspace键(退格键)。

每个转义序列都以反斜杠字符(\)开始。

我们在第3章中再来探讨相关内容。

这样,就解释了为什么3行printf()语句只打印出两行:

第1个printf()打印的内容中不含换行符,但是第2和第3个printf()中都有换行符。

第3个printf()还有一些不明之处:

参数中的%d在打印时有什么作用?

先来看该函数的输出:

Myfavoritenumberis1becauseitisfirst.

对比发现,参数中的%d被数字1代替了,而1就是变量num的值。

%d相当于是一个占位符,其作用是指明输出num值的位置。

该行和下面的BASIC语句很像:

PRINT"Myfavoritenumberis";num;"becauseitisfirst."

实际上,C语言的printf()比BASIC的这条语句做的事情多一些。

%提醒程序,要在该处打印一个变量,d表明把变量作为十进制整数打印。

printf()函数名中的f提醒用户,这是一种格式化打印函数。

printf()函数有多种打印变量的格式,包括小数和十六进制整数。

后面章节在介绍数据类型时,会详细介绍相关内容。

8.return语句

return0;

return语句[3]是程序清单2.1的最后一条语句。

intmain(void)中的int表明main()函数应返回一个整数。

C标准要求main()这样做。

有返回值的C函数要有return语句。

该语句以return关键字开始,后面是待返回的值,并以分号结尾。

如果遗漏main()函数中的return语句,程序在运行至最外面的右花括号(})时会返回0。

因此,可以省略main()函数末尾的return语句。

但是,不要在其他有返回值的函数中漏掉它。

因此,强烈建议读者养成在main()函数中保留return语句的好习惯。

在这种情况下,可将其看作是统一代码风格。

但对于某些操作系统(包括Linux和UNIX),return语句有实际的用途。

第11章再详述这个主题。

2.3简单程序的结构

在看过一个具体的程序示例后,我们来了解一下C程序的基本结构。

程序由一个或多个函数组成,必须有main()函数。

函数由函数头和函数体组成。

函数头包括函数名、传入该函数的信息类型和函数的返回类型。

通过函数名后的圆括号可识别出函数,圆括号里可能为空,可能有参数。

函数体被花括号括起来,由一系列语句、声明组成,如图2.4所示。

本章的程序示例

中有一条声明,声明了程序使用的变量名和类型。

然后是一条赋值表达式语句,变量被赋给一个值。

接下来是3条printf()语句[4],调用printf()函数3次。

最后,main()以return语句结束。

图2.4函数包含函数头和函数体简而言之,一个简单的C程序的格式如下:

#include int main(void)

{

语句

return 0;

}

(大部分语句都以分号结尾。

2.4提高程序可读性的技巧

编写可读性高的程序是良好的编程习惯。

可读性高的程序更容易理解,以后也更容易修改和更正。

提高程序的可读性还有助于你理清编程思路。

前面介绍

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1