当前位置:文档之家› 第1章 C语言概述

第1章 C语言概述

第1章 C语言概述
第1章 C语言概述

第1章C语言概述

本章知识要点:

绪论 什么是C语言,简单介绍能够执行的软件。

最短的C语言源代码 如何写注释、函数声明、main函数、函数与堆栈、编码风格等问题的学习。 字符输出 包含文件、标准库函数、学习头文件是什么。

整数输入输出 变量类型、范围、标准库函数scanf()的简单介绍

字符输入输出 了解char型和数组、键盘输入字符、屏幕显示输入的字符。

浮点数输入输出 了解double型变量、输入2个浮点数、屏幕输出其平均值。

printf( )和scanf( )函数的返回值了解符号常量函数返回值标准库函数printf( )和scanf( )的函数返回值。 定义函数 定义函数的方法。输入一个整数,将其值的一半作为返回值。

变量的存储类型 了解变量的存储类型。静态变量与动态变量的区别

变量的取值范围了解不同数据类型的不同取值范围。

运算符学习自增、自减运算符及运算符的补充

赋值运算符了解赋值运算符(+=,*=,+=,-=,*=,/=,%=)。

变量和符号常量的类型声明 学习有关变量和符号常量的类型声明。

枚举常量 了解枚举常量。

1.1 绪论

C语言的产生与发展

C 语言是1972年由美国的Dennis Ritchie设计发明的, 并首次在UNIX操作系统的 DEC PDP-11 计算机上使用。它由早期的编程语言 BCPL( Basic Combind Programming Language) 发展演变而来。在1970年, AT&T 贝尔实验室的 Ken Thompson根据BCPL语言设计出较先进的并取名为 B的语言, 最后导了C语言的问世。 随着微型计算机的日益普及, 出现了许多C 语言版本。由于没有统一的标准, 使得这些C 语言之间出现了一些不一致的地方。为了改变这种情况, 美国国家标准 研究所(ANSI)为C 语言制定了一套ANSI标准, 成为现行的C语言标准。

C语言的特点

1.结构化语言

结构化语言的一个显著特点是代码和数据的分隔化,即程序的各部分除了必要的信息交流外彼此互不影响,相互隔离。C语言的主要结构成分是函数,函数是C语言的基本结构模块,所有的程序活动内容都包含在其中,函数在程序中被定义完成独立的任务,独立地编译成目标代码,这样可以实现程序的模块化。C 语言中,另一个实现程序结构化和分离化的方法是使用符合语句,复合语句是作为一个语句对待的,且具有逻辑联系的程序语句的组合,它是一个逻辑单元。

2.简洁、紧凑、灵活

Turbo C共有43个关键字,9种控制语句,程序书写自由,主要以小写字母表示,压缩了一切不必要的成分。C语言语法现在不太严格,程序设计自由度大,例如对数组边界不做检查,整型、字符型、逻辑型数据可以通用。

3.运算符丰富

C语言共有44种运算符,把括号、赋值、强制类型转换等都作为运算符处理从而使C语言的运算符类型极其丰富,表达式类型多样化,灵活使用各种运算符,可以实现在其他高级语言中难以实现的运算。

4.中级语言

C语言把高级语言的基本结构与低级语言的实用性结合起来。它可以像汇编语言一样对位、字节和地址进行操作,这三者是计算机最基本的工作单元,C语言可实现汇编语言的绝大部分功能。

5.移植性好

用C语言编写的程序移植性好,生成的目标代码质量高,程序执行速度快。

6.功能强大

C语言有丰富的库函数、强大的图形功能,有预处理能力,和其他语言如汇编语言、Pascal语言、数据库语言等的接口容易实现,C程序中还可以直接调用DOS命令。因此,C语言适合于编写各种系统软件、工具软件等大型软件。目前,在工业计算机控制系统开发中,越来越多的人都使用C语言来编写控制软件。

7.编译语言

C语言是编译语言,用C语言写的源程序必须经过编译后才能运行。

编译步骤

C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。整个代码的编译过程分为编译和链接两个过程。

编译过程又可以分成两个阶段:编译和汇编。

编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段:

第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。如#include指令就是一个预处理指令,它把头文件的内容添加到.c文件中。这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。

第二个阶段编译、优化阶段,经过预编译得到的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字。

必要的软件及c语言编译器

如果计算机使用的是windows系统的话,可以使用自带的记事本软件编写程序。以文本文件的形式保存C语言源文件,其文件扩展名为.C 。编译时使用一个

C语言编译系统(如TurboC 2.0 ,VC++6.0等)对C语言源程序进行语法检查和翻译,生成同名的“.OBJ”目标文件。链接时将目标文件和系统提供的标准库函数等连接在一起,生成一个同名的“.EXE”可执行文件。 执行时若脱离C 语言编译系统,可在操作系统下键入文件名直接运行。本书是以TurboC 2.0为基础来介绍的。

1.2简单的C语言源程序

前面说过C语言是一种程序语言,程序中包含函数和注释,下面来对C语言中的注释以及相关函数进行详细说明。

1.2.1 释

/* 注释*/

上面一行表示注释。注释以'/* '开始、以' */'结束。

编译程序忽略注释开始符到注释结束符间的任何文本,注释可出现在程序的任何位置,但它不能出现在关键字或标识符中间。这种注释可以包含多行内容。编译系统发现一个/*后,就开始找注释结束符*/,把两者之间的内容作为注释。

重点:注释以'/* '开始以' */'结束。

注释不能嵌套使用,即一个注释内不能含有另一个注释。

其他形式的注释

C++中可以用//注释。现在C语言中也可以采用这种注释方式。如果有//则表明本行结束是注释,这种注释可以单独占一行,也可以出现在一行中其他内容的右侧。此种注释以//开始以换行符结束。也就是说这种注释不能跨行。如果一行内容写不下,可以用多个单行注释。

重点:编译器不同允许的注释方式也不同。

/*

* 可以这写注释。

*

*/

/**********************************

* 这样的写法*

* 尝试 *

***********************************/

1.2.2 C语言源程序

/* 程序例1.1是最简单的C语言程序,在C语言编译器内即可编译执行。 */

例1.1

/* 源程序开始*/

void main(void); /* 函数声明 */

void main(void) /* main 函数 */

{

;

}

/* 源程序结束*/

函数声明

/* 函数声明是对编译系统的说明,说明函数的类型,参数个数及类型。

重点:函数声明使源程序变得更清晰。

函数

函数就是功能。每一个函数用来实现一个特定功能。函数名应反映其代表的功能。

计算机有栈(stack)的一种特殊的内存位置。其中存储的数据,取出的时候会先取出后放进的数据,也就是LIFO(后进先出)的存储方式。

函数的参数是用来指定参数的名字和类型,以便在调用函数时向它们传递数据,参数之间用;隔开。对无参数函数不需要这项。

函数名后面的括号中为void或者为空的,则表示函数没有参数。上面程序中main函数中的void表示没有参数。

函数的定义是为了调用此函数。在调用有参函数是,主调函数与被调函数之间有数据传递关系。在定义函数时函数名括号中的变量名称为“形式参数”(简称形参),在主调函数中函数调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称实参)。在调用函数过程中,系统会把实参的值传递给被调用函数的形参。

main函数

上面的程序中的main函数是必需的。C程序的执行是从main函数开始的。

重点:C语言中只能有一个main函数。

第4行的'{'表明main函数本体的开始,6行第'}'表示main函数本体的结束显示。这样'{'和'}'中夹着的部分是主函数的函数体。

第5行的”;”用来表明语句的结束。main()函数既可以是无参函数,也可以是有参的函数。对于有参的形式来说,就需要向其传递参数。但是其它任何函数均不能调用main()函数。*/

1.3 字符输出

C语言源程序可以实现各种功能,如程序1.2所示,能够将字符在屏幕上显示。编译源程序,屏幕将显示Hallow World字符。

例1.2

/* 源程序开始*/

#include /*编译预处理指令 */

void main(void); /* 定义主函数 */

void main(void)

{

printf("Hallow World!\n"); /* 标准输出函数 */

}

/* 源程序结束*/

/* 运行下面的程序,没有出现运行结果。

void main(void); // 函数声明

void main(void) // main 函数

{

;

}

比较例1.2以及上面的程序两者之间有2个方面差异。

标准库函数

main函数本体里面有这样一行函数:

printf("Hallow World!\n"); // 标准输出函数

主函数调用了一个printf函数,函数参数是Hallow World!\n。其中\n表示换行,是换行符。

printf函数是屏幕输出函数,这个功能是是由ANSI(美国国家标准协会)规范的函数。此函数包含在标准库函数中。

重点:标准库函数由ANSI规范。

printf( )函数中“”之间的格式控制的内容将会标准输出。标准输出是由屏幕输出,标准输入是由键盘输入。标准输入或者输出的程序也将被视为文件。

包含文件

main函数的函数声明和上面函数声明相同(void main(void );),但是printf 函数的函数声明与main函数声明不同,其声明如下:

#include // 引用文件

这是编译预处理命令。编译预处理以#开始。

重点:编译预处理以#开始,行末不加;

include命令是说明<>中包含的文件。

“stdio.h中'是标准库函数的头文件。如printf()的函数声明写在“stdio.h”中。所谓的头文件,该文件的扩展名为“h”。所有的头文件都是“.h”扩展。在#的头文件include 语句,使用的是“<>”。也可以用'“”'自己编写头文件。例如,你会是这样的#include“my.h”。

重点:头文件是’.h’扩展。

在编辑器里可以看到stdio.h的内容,在以后的学习中将会遇到各种各样的头文件,但是头文件里的内容不能改写。

重点:绝对不能改写头文件里的内容。 */

1.4整数的输入输出

上一节讲述了字符的输出,接下来学习怎样在屏幕显示键盘输入的整数。下面通过程序来举例说明。

/*例1.3程序功能是:屏幕显示“请输入以个整数”,然后从键盘输入一个整数,屏幕输出所输入的整数,换行结束。*/

例1.3

/*源程序开始*/

#include

void main(void);

void main(void)

{

int n; /*声明一个整型变量 */

printf("请输入一个整数");

scanf("%d", \n);

printf("您输入的整数为%d。\n", n);

}

/* 源程序结束*/

/* 下面来学习变量声明以及标准输入函数scanf()。

变量名

在源程序中的功能可以在以下说明

int n; // 声明一个int 型变量

所声明的变量的变量名为n。

变量的作用域

上面的变量n 是在main 函数中声明的,所以它的作用范围为{ }内,这就是所谓的局部变量或者自动变量的声明。

重点:函数中{ }声明的变量称为局部变量或自动变量。

重点:自动变量作用在{ }中。

变量类型

变量声明的位置不同,它作用的范围也不同,后面将会对变量的作用域进行详细说明

变量n 前面有个int ,表明声明的变量是一个整型数据,int 型数据编译系统将会分配2个字节或者4个字节的内存(由具体的C 编译系统自行决定)。

int n;

1个字节是8位。

每1位用0或1表示。

八位全为1则表示2的8次方即256。

如果是2个字节则表示是65536。

实际上n 也可以取负值,其取值范围为-32768--32767(-1-2

15 --152 )

当运行一个程序时,如果输入一个整数,超出这个范围,程序将无法运行。取值范围可以通过程序实验来验证。例如,如果你输入32768如果正确,将被存入内存,如果错误则程序无法正常运行。

重点:两个字节int 类型整数取值范围为-32768——32767数。

变量声明要指定变量的名称和变量的存储类型。

重点:变量是通过指定名称和存储类型来声明。

标准库函数scanf( )

上一节我们讲了printf()函数的调用,这一节介绍scanf()函数的调用.scanf()函数。scanf()函数也包含头文件'stdio.h’中。scanf()标准输入(stdin),从键盘输入的数据的。

scanf()函数中的d%表明输入参数的类型为int型。其中的'&n'表示输入的参数是n,'& n '变量' n '的地址,变量' n '的内存。C是高级语言,所以不需要指定地址的实际值。

scanf()可把输入数据转换为int型数据,从键盘输入数据,并得到变量的地址。

重点:地址符&在变量名前面。

main函数的{ }中的最后,再一次使用printf(),如下所示。

printf("你输入的数字是% d。\n", n);

在scanf()在“”中同样有一个'%d'。这是将参数n转换为int类型,printf()将在屏幕上显示所输入的整数。%d为格式控制,控制输入和输出的方式。编程语言学习应该从基本的输入输出开始 。*/

1.5字符的输入输出

前面两节讲述了屏幕显示字符以及键盘输入整数的显示,键盘输入字符并在屏幕上显示与之类死。

/* 运行下面例1.4源程序,将出现:请输入一些字符,然后从键盘输入字符,屏幕显示“您所输入的字符是”显示所输入的字符,换行结束。 */

例1.4

/* 源程序开始*/

#include

void main(void);

void main(void)

{

char str[256]; /*声明char类型的变量数组*/

printf("请输入一些字符");

scanf("%s", str);

printf("您输入的字符是您的%s。\n", str);

}

/* 源程序结束 */

/* 下面来了解字符串的输入和输出。

char类型的数据

在源程序的main函数中,有以下语句。

char str[256]; //声明char类型的变量数组

这里的 str [ 256 ]局部变量声明。' str [ 256 ]'的char ' '表明这个变量char型数据。char类型是1字节的整数。

1个字节是8位。

每1位用0或1来表示。

八位全为1则表示2的8次方即256。

char类型可以表示0-255的数。

重点:char类型可以表示从0到255的数。

数组‘str[256]’中的256表示给256个char类型数分配内存的含义。保证数据连续保存在内存中。这种存储方式,称为数组,存储连续的相同类型数据。数组中的每个数据称为数组元素。'[ ]'中的数字是下标。在C语言中,数组的下标字是从0开始。在上述例子中,访问数组的第一个元素(数据写入或读取时),是' str [ 0 ]'。由于下标从0开始,所以最后一个元素是' str [ 255 ]'的事,特别要注意 str [ 256 ]'值写入的话,程序上的其他数据将会被损坏。最坏的情况,系统被破坏,程序会出错。

数组是同类型数据的集合,并且拥有共同的名字。数组可以是基本数据类型的数组,也可以是指针、结构、联合等数据类型的数组。数组中的每个特定的元

素都是用下标来访问。数组由一段连续的存储空间构成。存储区首址,即最低的地址,对应第一个数组元素。数组名就是该数组在存储区的首地址。数组可以是一维的也可以是多维的,多维数组可以降维处理。数组也要先定义后使用。

数组的定义

数组的定义格式为

[存储属性][类型修饰符] 数据类型 数组名[常量表达式]

[[常量表达式]...]

说明:

(1)数组必须在使用前先定义。存储属性和数据类型相同的数组和变量可以混合在一起定义,中间以逗号分隔。

(2)和变量一样,数组的存储属性也是根据存储属性关键字和所定义的物理位置决定其存在性和可见性。

(3)数组的数据类型即该数组的每一个元素的数据类型。数组的数据类型可以是整型、浮点型、字符型、指针型以及结构和联合。

(4)数组名和变量名相同,也是用标志符命名的。数组名是一个地址常量,它是该数组在存储区的首地址,也就是数组元素的第一个地址。在编译时,系统根据所定义的数组元素个数、数据类型和存储属性开辟相应的存储空间,数组名就是这个存储空间的首地址。不能对数组名赋值,也不能对其进行取地址运算。

(5)常量表达式表示元素的个数,即数组长度,它是一个正整数值。例如,int a[10]中10个元素。常量表达式中可以包括常量和符号常量,但不能包括变量,C语言不允许对数组的大小做动态定义。常量表达式是用方括号括起来,而不是用圆括号,方括号是下标运算符,这和别的语言不同。常量表达式的个数表示该数组的维数。

(6)多维数组的存储顺序是按右维变化最快的原则存放的。

例如:

int a[3][4];

a数组有12个元素,存放顺序为

a[0][0],a[0][1],a[0][2],a[0][3]

a[1][0],a[1][1],a[1][2],a[1][3]

a[2][0],a[2][1],a[2][2],a[2][3]

数组的引用

数组的引用格式为

数组名[下标表达式][[下标表达式]...]

说明:

(1)下标表达式的值是一个非负整数,可以是任意的数值表达式。

(2)数组都是以0作为第一个元素的下标,例如a[10]中有10个元素:a[0] - a[9],不能使用a[10]。

(3)一维字符型数组一般是用来存放字符串的,系统自动给字符串加上终止符‘\0’,所以定义的数组长度要比最大使用长度至少大1。例如,定义char str[80];当把str字符数组用来存放字符串时,它最多允许存放79个字符。

(4)C语言中,只有基本的数据类型才能参加数据处理。因此数组不能以整体的形式参加数据处理,参加数据处理的只能是数组元素,若是结构或联合类型数组,则只能是最底层的属于基本数据类型的分量。

(5)由于C语言提供了printf()和scanf()函数的%s格式字符串,字符数组可以按字符串形式输入/输出。

(6)数组可以降维处理。例如,定义一个二维数组:inta[3][4];则可以认为定义了3个一维数组:a[0]、a[1]和a[2],这3个一维数组的长度都是4个元素。这3个一维数组的存储区首地址分别是a[0]、a[1]和a[2]。

a[0]、a[1]和a[2]可以认为是3个数组名而不是3个元素,因为不存在a[0]、a[1]和a[2]元素。以此类推,三维数组可以降为二维数组或一维数组。数组的这种可以降维处理的特点,使得用指针处理数组时更为灵活,因为可以让指针指向数组的某个元素或数组的某一维。

数组的初始化

和变量一样,数组可以在定义时初始化,有关变量初始化的说明也适用

于数组的初始化。数组的初始化还有它自己的特点。

1.一维数组的初始化

(1)定义时可以对数组赋以初值。例如:

Int a[10]={0,1,2,3,4,5,6,7,8,9};

(2)可以只给一部分元素赋初值。例如:

int a[10]={0,1,2,3,4};

a[0] - a[4]的值分别是0-4,而a[5] - a[9]没有赋初值。

(3)数组若在定义时没有赋初值则对于存储在固定存储区的数值数组各元素自动赋0值,字符串数组的各元素自动赋空字符;对于存储在动态存储区的数组各元素的值不确定。

(4)在对全部数组元素赋初值时,可以不指定数组的长度,系统会自动根据数组的初始化确定数组的长度,若定义的数组长度与提供的初值个数不等,则不能省略数组的长度。例如:

int a[5]={1,2,3,4,5};

可以写成int a[]={1,2,3,4,5};

多维数组的初始化

(1)多行给多维数组赋初值。例如:

char c[10]={‘I’,‘ ’,‘a’,‘m’,‘ ’,‘h’,‘a’‘p’,‘p’,‘y’};

(2)可以在定义时用字符串常量给字符数组赋值。例如:

Char c[11]=“I am happy”;

注意(1)和(2)两种赋初值的方法略有不同,即后一种赋值方法其字符数组的长度比前一种大 1.原因是系统自动给字符串常量加一终止符“\0”。为了统一起来可以将(1)写成

char c[10]={‘I’,‘ ’,‘a’,‘m’,‘ ’,‘h’,‘a’‘p’,‘p’,‘y’,‘\0’};

(3)多维数组可以逐个赋值或者按行赋值。例如:

char c[2][6]={‘B’,‘ A’,‘S’,‘A’,‘C’,‘ ’,‘P’

‘a’,‘s’,‘c’,‘a’,‘l’};

char c[2][6]={{‘B’,‘ A’,‘S’,‘A’,‘C’},{‘P’‘a’,

‘s’,‘c’,‘a’,‘l’}};

char c[2][7]={“BASIC”,”Pascal”};

请注意它们的区别。

(4)在系统能确定各维长度时,所定义的字符数组长度也可以省略最左

维的长度。

例如:

char c[][7]={“BASIC”,”Pascal”};

重点:数组是用来连续存储相同类型的数据。

重点:数组内的数据为元素。

重点:访问数组元素要用下标。

在main函数中,用scanf()输入。如下所示。

scanf("%s", str);

字符串

scanf()的()中有两个参数。"% s”。这是“从键盘输入字符串”。字符串存放在数组中。C语言的文字符串,0个以上字符,空字符(NULL)结束。NULL 表示字符的值'\ 0 '。

重点:C语言中遇到NULL字符字符串结束。

数名

这次的参数str ' '。上次整数的输入的时候,变量的前有'&',这是显示变量地址。这次输入时str前没有’&’。这是因为C语言中,str表明了首元素的地址,没有必要再加地址符。

重点:数组名代表数组首元素的地址。

运行程序scanf()函数,键盘输入字符转换为字符串,可以存放在str[256]中。它提供详细的将多个数据变量分配内存。这种情况下数据不能用空格隔开。因为字符串遇到’\0’输入结束。在输入数据的时候要注意保证输入的数据都存入到str[256]中。

main函数中{ }的最后一行又使用到printf()函数。如下:

printf("您输入的字符串是%s。\n", str);

printf()中有一个与scanf()中相同的%s,该功能就是将scanf()中输入法字符串在屏幕上显示出来。

到目前为止,已经看到了一些C的源程序printf()的范围内。由于计算机只能处理数字,所以字母由数字表示。 7位,也就是说字母表示已经由从0号管127。出于这个原因,在60年代初期的内存是昂贵的,一个7位的电脑可存储一个字节。后来,IBM的建议,1个字节是统一的8位。这些数字可以用一个字节表示高达0-255。

C语言中使用的字符不仅有英文字母和数字还有换行符制表符等字符。*/

1.6浮点数的输入输出

键盘输入浮点数并在屏幕上显示与整数的输入输出以及字符的输入输出也是类似的。下面通过例程序进行详细说明。

/* 输入及屏幕输出浮点数*/

/* 例1.5程序是输入2个浮点数,并以浮点形式输出二者之和及其平均数。*/

例1.5

/* 源程序开始 */

#include

void main(void);

void main(void)

{

double x1, x2, total; /* 声明double 型的浮点数 */

printf("请输入一个浮点数。 ");

scanf("%lf", &x1);

printf("\n请输入一个浮点数。 ");

scanf("%lf", &x2);

printf("\n\n"); /* 换行换2行 */

total = x1 + x2; /*计算x1和x2的和 */

/* 用和来表示平均数*/

printf("和 = %lf 平均 = %lf\n", total, total / 2.0);

}

/* 源程序结束 */

/* 浮点数的声明如下。

double x1, x2, total; // 声明double 型的浮点数

现在声明了三个double类型的局部变量,并分配内存。以这种方式可以声明多个变量。前面学过int和char型也是这样声明的。

浮点型数据是用来表示具有小数点的实数的。在C语言中实数是以指数形式存放在内存单元中的。一个实数表示为指数可以有不止一种形式。小数点的位置可以在几个数字之间和之前或之后浮动,只要在小数点位置浮动的同时改变指数的值,就可以保证它的值不会改变。由于小数点位置可以浮动,所以实数的指数形式称为浮点数。浮点数的类型包括float(单精度浮点型)、double(双精度浮点型)、long double(长双精度浮点型)。

从键盘输入一个double型变量

scanf("%lf", &x1);

“% lf”是格式控制,表示键盘输入的值转换成double型”。"% lf”中的lf是格式说明符。'%'后面加格式说明符指定输入数据的格式。' l ' '是long的简写,指定数据的范围,最后的' f'表示浮点数。

类似于int类型的整数输入的情况,在X1的'&'表示X1某处存在在计算机的内存中。这是表示其位置的地址。&X1将指向X1的地址。这里的X1将会得到从键盘输入一个double类型的浮点数。

在调用scanf()时如果您忘记了'&',输入的变量在存储器中将得不到正确存储。在最坏的情况下,可能使系统被破坏。这不仅限于浮点数,也适用于整数。

重点:当用scanf()函数输入一个浮点数或整数,变量的开头要加'&'。

printf("\n\n"); // 换行换2行

上面程序代码没有严格的格式说明,只是两个换行符表示换行换2行。

算术运算符

total = x1 + x2; // 把X1和X2的和赋值给total

注意上面源程序中的上述的代码,。'='和'+'的算术运算符的使。'+'算术运算符和数学运算的用法相同。'='是数学上等号,表示左边和右边相等,C语言中是赋值运算符,将右边的数值代入左部上,与数学运算不同,所以要注意。

例如,n整数,下面的代码是n的值1增加

n = n + 1;

重点:'='是赋值运算符,将右边的值代入给左边。

后面将会遇到各种各样的运算符,运算符在程序代码中将更容易理解。

屏幕显示浮点数,如下:

printf("%lf\n", x1);

这里的%lf与scanf()时的"% lf”很相似。但是,意思有点不同。屏幕显示将x 1转换成的浮点数。这里不需要运算符&。

main函数的{ }中的最后两行。

// 用和来表示平均值

printf("和 = %lf 平均 = %lf\n", total, total / 2.0);

这里的printf()与之前相比是比较的复杂结构,需要加以说明。“”中的和平均等号都原样输出,但是“”中,有两个格式控制。这样格式控制中参数的数量必须与后面的参数数量保持一致。另外格式控制指定了参数的输出类型。上述代码是控制输出两个double型的变量。

printf( )的最后一个参数如下:

total / 2.0

'/'是算术运算符,在double型的变量来除2。'/'和数学中除法有同样的用法。不仅在参数变量中可以使用,在函数运算中也可以使用。

上面式子中如果把2.0写成2。在进行编译时可能没有什么问题。但是为了保证输出是双精度,需要把变量都用double型来表示。

printf()函数是经常使用的一个标准库函数,从上面例子可以看出,在调用的时候参数可以是变量。

1.7 printf( )和scanf( )的返回值

/* Last in First Out */

/* 与前面提到的一样,函数调用方面的堆栈值(参数),是从装载函数堆栈参数取出,进行处理。处理的结果(返回值)函数是堆装。函数功能的调用的时候取出数据进行处理,处理过后再存储。

堆栈是后进先出(LIFO)的内存管理的方式。

理解函数,需要了解参数的返回值。后面将会学习各种各样的标准库函数。下面举些简单的例子进行说明。

#include <包含文件名>

返回值类型函数名(参数列表);

例:函数使用的例子

函数的执行结果返回值

如果成功成功情况下的返回值

如果失败失败情况下的返回值

具体例子如下标准库函数printf()所示。

#include

int printf(const char *format, ...);

例:printf(format, ...);

函数执行结果返回值

执行成功输出字符

执行失败 EOF

第一行printf()使用stdio . h包含有必要显示。

在这个阶段完全解释第二行是困难的。现在先不解释,如果不懂可以跳过。

第二行的printf()的返回值是int型整数。它是控制字符输。如' format '类型是const char 型。'const ' 字,它限定一个变量不允许被改变。如果改变的话将会出现编译错误,编译中止,错误内容输出编译器处理中止。前面已经学习了char型,char后面的*表示取char型的变量的地址的意思即读取字符串的地址。

这里的参数是可变个参数,参数可变个就是说可以有零个以上未定的参数。

printf()能够控制字符输出,如果执行成功将返回字符的个数。如果失败,将返回名为'EOF'特殊值。文件结尾'EOF是'文件结束。'EOF'由操作系统的不同代表值也不同,它可以是0或-1。

重点:'EOF '(End Of File)是文件的结束的意思

符号常量

'EOF'是一个符号常量。在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。在C语言中,或更精确地说成C标准函式库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。根据系统的不同可以是0或-1,因此可以用EOF作为文件结束标志。

重点:源程序中数字本身尽可能用符号代替。

scanf()和printf()相似都可以通过返回值来判断程序的执行情况。执行成功的话,返回参数值。

#include

int scanf(const char *format, ...);

函数执行结果返回值

执行成功返回参数数量

执行失败 EOF

例1.6程序用scanf()从键盘输入多个字母,然后用printf()显示函数的返回值。*/

例1.6

/* 源程序开始 */

#include

void main(void);

void main(void)

{

相关主题
文本预览
相关文档 最新文档