云端书斋 -C语言程序设计及应用教程
本书资料更新时间:2025-01-19 17:57:20

C语言程序设计及应用教程 下载 pdf 百度网盘 epub 免费 2025 电子书 mobi 在线

C语言程序设计及应用教程精美图片
》C语言程序设计及应用教程电子书籍版权问题 请点击这里查看《

C语言程序设计及应用教程书籍详细信息

  • ISBN:9787302468165
  • 作者:暂无作者
  • 出版社:暂无出版社
  • 出版时间:2017-06
  • 页数:暂无页数
  • 价格:30.00
  • 纸张:胶版纸
  • 装帧:平装-胶订
  • 开本:16开
  • 语言:未知
  • 丛书:暂无丛书
  • TAG:暂无
  • 豆瓣评分:暂无豆瓣评分
  • 豆瓣短评:点击查看
  • 豆瓣讨论:点击查看
  • 豆瓣目录:点击查看
  • 读书笔记:点击查看
  • 原文摘录:点击查看
  • 更新时间:2025-01-19 17:57:20

寄语:

为零基础初学者循序渐进讲解C语言基础,教学体系合理,内容通俗易懂,例题经典,举例形象,讲解细致。结合科研竞赛,理论联系实际。


内容简介:

本书针对零基础初学者循序渐进地介绍了C语言知识及其程序设计方法,主要教学内容包括算法、数据类型、运算符、表达式、程序结构、数组、函数、指针、结构体、共用体、位运算、文件和实例分析。

本书根据初学者特点,在章节安排、内容讲解和例题分析方面做了精心策划。整书体系合理,教学内容由浅入深且通俗易懂,章节例题力求典型且讲解细致。为使读者放心参考,本书所有例程均在Visual C

6.0运行环境下进行了验证。

本书非常适合作为高等院校电类专业C语言程序设计课程的教材,也可作为广大C语言学习爱好者的自学和参考用书。


书籍目录:

目录

 

 

 

第1章C语言概述

 

1.1基础知识

 

1.2为什么要学C语言

 

1.3C程序结构分析

 

1.4C程序上机步骤

 

第2章算法

 

2.1算法的概念

 

2.2常见的算法描述方法

 

2.2.1用自然语言表示算法

 

2.2.2用传统流程图表示算法

 

2.2.3用结构化流程图表示算法

 

2.2.4用伪代码表示算法

 

2.2.5用计算机语言表示算法

 

2.3结构化程序设计方法

 

第3章数据类型、运算符和表达式

 

3.1数据类型

 

3.2常量与变量

 

3.2.1标识符

 

3.2.2常量和符号常量

 

3.2.3变量

 

3.3C语言的常用数据类型

 

3.3.1整型数据

 

3.3.2实型数据

 

3.3.3字符型数据

 

 

3.3.4为变量赋初值

 

3.4不同数据类型间的转换

 

3.4.1混合运算中的数据类型转换

 

3.4.2赋值运算中的数据类型转换

 

3.4.3强制转换

 

3.5运算符和表达式

 

3.5.1算术运算符和算术表达式

 

3.5.2赋值运算符和赋值表达式

 

3.5.3逗号运算符和逗号表达式

 

 

 

 

 

 

 

 

第4章程序结构

 

4.1顺序结构程序设计

 

4.1.1C语句

 

4.1.2赋值语句

 

4.1.3数据的输入与输出实现

 

4.1.4字符数据的输入与输出

 

4.1.5格式输入与格式输出

 

4.1.6顺序结构程序设计举例

 

4.2选择结构程序设计

 

4.2.1关系运算符和逻辑运算符

 

4.2.2if语句

 

4.2.3if语句的嵌套

 

4.2.4switch语句

 

4.2.5选择结构程序举例

 

4.3循环结构程序设计

 

4.3.1goto语句

 

4.3.2while语句

 

4.3.3do…while语句

 

4.3.4for语句

 

4.3.5循环的嵌套

 

4.3.6break语句和continue语句

 

4.3.7循环语句小结

 

4.3.8循环结构程序举例

 

第5章数组

 

5.1一维数组

 

5.1.1一维数组的定义

 

5.1.2一维数组的初始化

 

5.1.3一维数组的引用

 

5.1.4一维数组程序举例

 

5.2二维数组

 

5.2.1二维数组的定义

 

5.2.2二维数组的初始化

 

5.2.3二维数组的引用

 

5.2.4二维数组程序举例

 

5.3字符数组

 

5.3.1字符数组的定义、初始化和引用

 

5.3.2字符串

 

5.3.3字符串的输入与输出

 

5.3.4字符串处理函数

 

5.3.5字符串程序举例

 

第6章函数

 

6.1函数概述

 

6.2函数的类别

 

6.2.1库函数

 

6.2.2用户自定义函数

 

6.3函数的定义

 

6.3.1无参函数的定义

 

6.3.2有参函数的定义

 

6.3.3空函数

 

6.4函数声明

 

6.5函数的参数与函数的返回值

 

6.5.1函数的实际参数和形式参数

 

6.5.2数组作为函数参数

 

6.5.3函数的返回值

 

6.6函数的调用

 

6.6.1函数调用的一般形式

 

6.6.2函数调用的过程

 

6.6.3三种函数调用方式

 

6.6.4函数的嵌套调用

 

6.6.5函数的递归调用

 

6.7变量的作用域和存储类型

 

6.7.1局部变量和全局变量

 

6.7.2变量的存储类型

 

6.7.3变量定义和声明的区别

 

6.8内部函数和外部函数

 

6.8.1内部函数

 

6.8.2外部函数

 

6.9编译预处理

 

6.9.1宏定义

 

6.9.2文件包含

 

6.9.3条件编译

 

第7章指针

 

7.1指针概述

 

7.2指针变量和简单变量

 

7.2.1定义指针变量

 

7.2.2指针变量的初始化

 

7.2.3指针变量的引用

 

7.3指针变量与一维数组

 

7.3.1作为指针的数组名

 

7.3.2使用指针变量引用数组元素

 

7.3.3使用指针变量处理字符串

 

7.3.4指针运算

 

7.4指针变量与函数

 

7.4.1指针变量作为函数参数

 

7.4.2数组名作为函数参数

 

7.5指针的高级应用

 

7.5.1指针与多维数组

 

7.5.2指向函数的指针变量

 

7.5.3返回指针的函数

 

7.5.4指针数组

 

7.5.5指向指针的指针变量

 

第8章结构体与共用体

 

8.1结构体类型

 

8.1.1结构体类型的定义

 

8.1.2结构体变量的定义

 

8.1.3结构体变量的初始化和引用

 

8.2结构体数组

 

8.2.1结构体数组的定义

 

8.2.2结构体数组的初始化

 

8.2.3结构体数组的引用

 

8.3共用体数据类型

 

8.3.1共用体变量的定义

 

8.3.2共用体变量的引用

 

8.4枚举数据类型

 

8.4.1枚举类型及其变量的定义

 

8.4.2枚举变量的引用

 

8.5自定义类型

 

第9章位运算

 

9.1位运算符与位运算

 

9.1.1按位与运算符“&”

 

9.1.2按位或运算符“|”

 

9.1.3按位异或运算符“^”

 

9.1.4按位取反运算符“~”

 

9.1.5左移运算符“”

 

9.1.6右移运算符“”

 

9.2位段

 

第10章文件

 

10.1C文件的概念

 

10.1.1文件名

 

10.1.2文件的分类

 

10.2文件的打开与关闭

 

10.2.1文件类型指针

 

10.2.2文件的打开(fopen函数)

 

10.2.3文件的关闭(fclose函数)

 

10.3文件的读取和写入

 

10.3.1fgetc函数和fputc函数

 

10.3.2fgets函数和fputs函数

 

10.3.3fprint函数和fscanf函数

 

10.3.4fread函数和fwrite函数

 

10.4文件的定位

 

10.4.1rewind函数

 

10.4.2fseek函数

 

10.4.3ftell函数

 

10.4.4实例解析

 

第11章C语言在单片机编程中的实例解析

 

 

附录A常用字符与ASCII代码对照表

 

附录B关键字及其用途

 

附录C运算符和结合性

 

附录D常用的C语言库函数

 


作者介绍:

郭鹏,石家庄学院教师,多年来一直从事C语言程序设计、电路分析、单片机原理等课程的教学工作。科研方向为智能控制、嵌入式系统设计,曾主持参与河北省自然科学基金项目1项,河北省科技厅、教育厅课题7项,石家庄市级课题10项,横向课题1项,校级课题多项;发表电类专业论文20余篇,EI收录4篇,中文核心10篇,参编电气专业教材1部。作为省级优秀指导教师指导学生参加科研竞赛成绩优异,获全国及省市级奖励13项。


出版社信息:

暂无出版社相关信息,正在全力查找中!


书籍摘录:

第3章数据类型、运算符和表达式

根据所执行任务的不同,C语言程序经常要用到各种类型的数据,如整数、实数、字符等。不同类型的数据作为C语言程序的基本组成部分都是以特定的形式存储在计算机内存中的,其所占的存储空间和运算性质也不尽相同。为方便理解数据类型的概念,这里需要先简单介绍一下计算机内存的相关知识。计算机内存是依次逐字节排列的,一个字节(Byte,简写为B)包含8位(Bit)。C语言程序在经过编译器的编译、连接之后终会以二进制序列的形式存储在计算机内存当中,如图3.1所示。

图3.1C程序在内存中的存储示意图

可以看到,在图3.1中C语言程序是按照内存的结构逐字节存储的,因此C语言的基本存储单位是字节。图3.1中的每一个小方格都代表计算机内存中的一个小存储单位——“位(Bit)”。每一位能且仅能存储一个二进制数,即“1”或“0”。在计算机中,一般用高电平代表二进制数“1”,用低电平代表二进制数“0”。为方便用C语言程序对计算机内存进行数据的读写,计算机对内存进行了逐字节编址,即以字节(B)为单位,计算机内存中的个字节的地址是0,之后计算机内存地址按字节递增1,直至内存的后一个字节。需要注意的是,计算机内存地址都是从0开始,但内存地址的值由计算机内存容量决定(不同的计算机,内存容量可能不同)。计算机内存地址的作用有点类似于教室的房间号,学生可以通过教室的房间号找到上课教室。同样,C语言程序可以通过内存地址找到存储在该内存单元的数据。除了字节(B)和位(Bit)之外,常见的内存计量单位还有字(Word,简写为W)、千字节(KB,简写为K)、兆字节(MB,简写为M)、千兆字节或吉字节(GB,简写为G)、太字节(1TB,简写为T)等。各种单位的换算关系如下: 1B=8Bit; 1W=4B=32Bit; 1KB=210B=1024B; 1MB=220B=1024KB; 1GB=230B=1024MB; 1TB=240B=1024GB。一个汉字一般占两个字节,假设硬盘有500GB的存储空间,那么可以存储的汉字个数x是多少呢?x=500×1024×1024×1024÷2=268435456000个。3.1数 据 类 型按照数据结构中的定义,数据类型是指一个值的集合以及定义在这个值集上的一组操作。在C语言中,一个值的数据类型决定了这个值在计算机中的存储形式以及允许对这个值进行的操作种类。这里,以VC 6.0开发环境为例(不同的开发环境,相同数据类型的存储空间可能不同),一个整型数据(int型)占4个字节的存储空间,允许对其进行加、减、乘、除、取余等运算; 一个双精度浮点型数据(double型)占8个字节的存储空间,允许对其进行加、减、乘、除运算,不允许进行取余运算。为方便理解数据类型的必要性,抛开数据类型允许的操作不提,只考虑其存储情况,读者就可以明白数据类型的重要。因为C语言程序运行时需要的数据都以字节为单位存储在内存中,而计算机的内存是有限的,所以为了有效地利用和管理内存,系统必须根据数据的类型给它分配内存单元,即不同类型数据所占的内存空间不尽相同。这就好比归纳物品时为节约空间,大的物品要放到大盒子里,小的物品要放到小盒子里一样。C语言中常见的数据类型如图3.2所示。

图3.2C语言的数据类型

如图3.2所示,C语言中常见的数据类型有以下4种。(1) 基本类型: 基础的简单数据类型,其值无法再分解为其他类型。(2) 构造类型: 顾名思义是根据已定义的一个或多个数据类型用构造的方法来定义。构造数据类型是由多个其他数据类型组合而成的,所以一个构造类型的值可以分解成若干个“成员”或“元素”,其中每个成员要么是基本数据类型,要么是又一个构造类型。(3) 指针类型: C语言中比较重要、比较难理解的内容,在后面会详细讲解。(4) 空类型: 表示没有类型,常与函数、指针等相关内容结合使用。3.2常量与变量按照取值是否可变,基本数据类型有常量和变量两种形式。在程序执行过程中其值不变的量称为常量,其值可变的量称为变量。常量和变量一般要与数据类型结合使用,如整型常量、整型变量、实型常量、实型变量、字符常量、字符变量等。在程序中常量是可以不经说明而直接引用的。变量必须先定义后使用。例如: 

int a; /*定义了一个整型变量a*/

a=5; /*将整型常量5赋给整型变量a*/

在上例中,整型常量5不用说明可以直接引用,整型变量a必须先定义再使用。如果对变量a不加说明直接使用,则程序编译时会报错,因为系统不知道a是什么。3.2.1标识符标识符在C语言中的作用与人的姓名类似,是用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。C语言规定标识符只能由字母、数字和下画线三种字符组成,且个字符必须为字母或下画线。C语言对标识符有以下分类。(1) 关键字: C语言已经预先定义了一批标识符,它们在程序中都代表着固定的含义,不能另作他用,这些标识符称为关键字,如用来说明变量类型的关键字int、double、char及if语句中的if、else等,它们作为C语言的关键字不能再用作变量名或函数名,否则程序编译时会报错。(2) 预定义标识符: 指在C语言中预先定义并具有特定含义的标识符,如C语言提供的库函数名称(printf、scanf等)和预编译处理命令(define、include等)。C语言允许把这类标识符重新定义另作他用,但这将使这些标识符失去预先定义的原意,因此为避免误解,建议用户不要把这些预定义标识符另作他用。(3) 用户标识符: 由用户根据需要自定义的标识符称为用户标识符,又称自定义标识符。例如: 

a、sum、_pointer、Array123、point_a1; /*合法自定义标识符*/

1b、string.a、#89、totala、int。/*非法自定义标识符*/

在使用自定义标识符时有以下几点需要注意: (1) C语言区分大小写,同一字母的大写字母和小写字母对C编译器而言是两个不同的字符。为了与日常习惯保持一致,增加程序的可读性,变量名一般用小写字母表示。(2) ANSIC未规定标识符的长度,但为了提高程序的可移植性和阅读方便,变量名不宜过长(不同的编译器有自己的规定,一般不超过32个字符)。(3) 如果用户标识符与关键字相同,则程序编译时系统报错。如果用户标识符与预定义标识符相同,系统不报错,只是预定义标识符将失去原定含义,代之以用户确认的含义,这可能会引发一些程序运行错误。(4) 在自定义标识符时要尽量做到“见名知意”,建议优先使用有含义的英文单词或缩写作为标识符。3.2.2常量和符号常量常量作为数据的一种,从字面形式上即可判别,因此也叫字面常量。常量也分数据类型,如整型常量、实型常量、字符常量和字符串常量等。例如: 整型常量: -3、0、3; 实型常量: -0.33、4.56; 字符常量: 'a' 'b' 'c' 'd'; 字符串常量: "aBcdEfg""Hello"。除以上形式外,在C语言中还允许用一个标识符来表示一个常量,称为符号常量。符号常量在使用之前必须先定义,其定义格式如下: 

#define 标识符常量

其中,define是一条预处理命令(以“#”开头),称为宏定义命令(第6章将详细介绍),其功能是用标识符表示后面的常量。例如: 

#define PI 3.14

在符号常量PI定义后,程序中出现的所有PI都表示常量3.14。为方便与变量标识符区分,符号常量的标识符习惯使用大写字母,变量标识符使用小写字母。在使用符号常量时一定要注意符号常量与字符常量、字符串常量的区别。例如: 

#define PI 3.14

  /*PI为符号常量,代表3.14*/

printf("PI");

  /*"PI"为字符串常量,表示一串字符*/

例3.1符号常量的使用,计算半径为2的圆的面积。程序如下: 

#define PI 3.14

  /*定义符号常量PI,代表3.14*/

#include<stdio.h>

int main(void)

{

int r=2;

  /*定义int型变量r,表示圆的半径*/

float area;

  /*定义float型变量area,表示圆的面积*/

area=PI*r*r;

  /*计算圆面积*/

printf("半径为2的圆面积area=%d\n",area);/*输出圆面积*/

return 0;

}

程序运行结果如下: 

程序第1行用宏定义#define定义了符号常量PI,用于代表常量3.14(圆周率π),之后本程序中出现的PI都表示常量3.14,它可以像常量一样直接参与运算。使用符号常量的优点及注意事项如下: (1) 含义清楚,见名知意。如例3.1的程序中一看PI就可以知道它代表圆周率π。(2) 一改全改,在需要改变某个常量时只需修改其对应的符号常量,程序中所有用到它的地方也就做了相应修改。在例3.1中,如果需要改变圆周率π(由3.14变为31415926),使计算结果更精确,只需修改符号常量的定义即可。

#define PI 3.1415926/*修改符号常量的定义,将π改为3.1415926*/

(3) 符号常量与变量不同,符号常量一经定义就不能再对其进行赋值操作。例如: 

#define PI 3.1415

PI=5;/*错误,符号常量不可赋值*/

3.2.3变量顾名思义,变量就是可以改变的量。在程序运行期间,变量的值是可以改变的。变量存储于内存当中,因此变量其实就是内存中的一个具有特定属性的存储单元,用于存放数据,而这个数据就是变量的值。在C语言中,所有的变量都必须“先定义,后使用”。在定义变量时需要给变量指定一个名称(变量名),以便程序引用该变量。此外,变量的定义还要指定变量的数据类型,明确所定义的变量用于存储什么类型的数据。例如: 

int x;/*基本整型变量的定义*/

上述语句定义了一个变量,变量名为x,变量的数据类型是基本整型(int型),这说明变量x对应的内存单元可存储int型数据。若假设x的值为1,则变量x的存储情况如图3.3所示。

图3.3变量存储示意图

如图3.3所示,x是变量名,1是变量的值,2000H是该变量对应的存储单元在内存中的地址(H表示2000是十六进制数。内存地址常用十六进制或十进制表示)。C编译器在对C程序进行编译、连接时会给每一个变量都分配一个内存单元,用于存储变量的值,而这个内存单元的地址就是变量名。这样,从变量中取值的过程实际上就是通过变量名得到内存地址,并从该内存单元读取数据的过程。简单来说,变量名其实就是以一个名字代表一个内存地址。因此,对程序而言,变量名就是该变量在内存中的地址。程序通过变量名可以在内存中找到并引用该变量的值。变量的定义一般放在函数体的开头部分。通过变量定义(也叫变量声明)编译器就建立了变量符号表。在此之后,程序会用到哪些变量,每个变量在哪里,它们都是什么数据类型,编译器就都掌握了。如果某个变量未定义就使用,编译器就无法了解该变量的信息,在程序编译时会报错。对于变量的使用有以下几点需要注意: (1) 变量在定义时必须指定数据类型,以便编译器为其分配适合的存储空间。以VC 6.0为例,int型数据占4个字节的内存,char型数据占一个字节的内存,float型数据占4个字节的内存,double型数据占8个字节的内存。(2) 不同数据类型的变量,其运算性质是不同的。例如,C语言允许对整数进行取余运算,如果x和y都是整型变量,则“x%y”是正确的; 如果x和y都是或其中之一是实型变量,则“x%y”是错误的,程序在编译时会报错。(3) 对于未定义的变量,编译器无法识别。(4) 变量名和变量的值是不同的概念。例如: 

int x;

x=10;

在上述语句中,x是变量名,代表变量的内存地址,10是变量值,是保存在变量中的数据。3.3C语言的常用数据类型3.3.1整型数据1. 整型常量整型常量就是整常数,包括正整数、负整数和0。正整数可以在前面加“ ”,也可以不加。负整数要在前面加“-”。在C语言中,整型常量可以用八进制、十六进制和十进制三种形式表示。为方便识别,C语言对整型常量做了以下分类。(1) 十进制整型常量: 无前缀,数码取值为0~9。例如: 

237、-568、65535、1627; /*正确的十进制整型常量表示*/

023、23D。/*错误的十进制整型常量表示*/

(2) 八进制整型常量: 必须以“0”开头,即以“0”作为八进制数的前缀,数码取值为0~7。八进制数通常是无符号数。例如: 

015、0101、0177777;/*正确的八进制整型常量表示*/

256、03A2、-0127./*错误的八进制整型常量表示*/

(3) 十六进制整型常量: 前缀为“0X”或“0x”,数码取值为0~9、A~F或a~f。例如: 

0X2A、0XA0、0XFFFF; /*正确的十六进制整型常量表示*/

5A、0X3H。/*错误的十六进制整型常量表示*/

C语言程序是根据前缀来区分进制的,因此用户在书写常数时不要把前缀弄错,以免结果不正确。2. 整型变量根据在内存中所占存储空间的不同,整型变量可分为基本整型、短整型、长整型和无符号型。其中,无符号整型变量只能存放不带符号的正整数,不能存放负数。无符号整型变量又可分为无符号基本整型、无符号短整型和无符号长整型。各种整型变量的类型符号、所占存储空间、取值范围以及可表示的数据个数如表3.1所示(以VC 6.0为例)。

表3.1整型变量分类情况表

数据类型类型符号所占字

节数

(位数) 取值范围可表示的数据个数

基本整型int4(32)-2147483648~2147483647,

即(-231) ~ (231-1)232=4294967296=1GB短整型short2(16)-32768~32767,

即(-215)~ (215-1)216=65536长整型long [int]4(32)-2147483648~2147483647,

即(-231) ~ (231-1)232=4294967296=1GB无符号

基本整型unsigned[int]4(32)0~4294967295232=4294967296=1GB续表

数据类型类型符号所占字

节数

(位数) 取值范围可表示的数据个数

无符号

短整型unsigned short [int]2(16)0~65535216=65536无符号

长整型unsigned long [int]4(32)0~4294967295232=4294967296=1GB

在表3.1中,用中括号“[]”括起来的内容表示可以省略,即long int可简写为long,unsigned int可简写为unsigned,unsigned short int可简写为unsigned short,unsigned lont int可简写为unsigned long。整型变量的一般定义格式如下: 

类型说明符变量名;

其中,类型说明符用于说明整型变量的具体类型,后面跟变量名,如果同时定义多个变量,则多个变量名之间需要用“,”隔开。例3.2整型变量定义示例。

int x, y, z;

  /*定义基本整型变量x、y、z*/

short a;

  /*定义短整型变量a*/

long b;

  /*定义长整型变量b*/

unsigned c;

  /*定义无符号基本整型变量c*/

unsigned short d;

  /*定义无符号短整型变量d*/

unsigned long e;

  /*定义无符号长整型变量e*/

例3.3整型变量的使用。程序如下: 

#include<stdio.h>

int main(void)

{

int a,b,sum;

  /*定义基本整型变量a、b、sum*/

unsigned c;

  /*定义无符号基本整型变量c*/

a=3;

  /*分别给a、b、c赋值*/

b=-4;

c=5;

sum=a b c;

  /*对a、b、c三值求和,并赋给变量sum*/

printf("a、b、c之和为: \n%d\n",sum);

  /*输出计算结果*/

return 0;

}

程序运行结果如下: 

在使用整型变量和整数变量时有以下几点需要注意: (1) 整型常量后面可以加后缀,以表示常量的数据类型,如235L或2351,表示常量235为长整型数据; 345U或345u,表示345为无符号型数据。(2) 给一个整型变量赋的值不应超过该整型变量规定的取值范围,否则会溢出。例如: 

short x; /*定义一个短整型变量x*/

x=66656; /*非法,数据溢出,短整型取值范围为-32768~32767*/

(3) 整型数据在内存中是以补码形式表示的,一个正整数的补码和它的原码(即该数的二进制表达形式)相同。一个负整数的补码是将该数的值的二进制形式按位取反再加1。在整型数据的存储单元中,左边的一位(位)是符号位,“0”表示正、“1”表示负。例如: 

(4) 无符号整型数据没有符号位,它的存储单元的位也用于存储数据。3.3.2实型数据在C语言中只使用十进制的实型数据(实数),也叫浮点型数据。在C语言中浮点型数据有以下两种表示形式。 小数形式: 如0.0、27.0、5.89、4.13、-5.2、300.、-267.8230等。在使用这种方式表示浮点型数据时可以没有整数部分或小数部分,但必须有小数点,如1.25、1.0、.14、3.都是正确形式。 指数形式: 即利用科学记数法表示实数,如3.65e3表示3.65×103(即3650),-1.35e-2表示-1.35×10-2(即-0.0135)。在使用这种方式表示浮点型数据时e(或E)之前必须有数字,且e(或E)后面的指数必须为整数,不能写成e3或1e.5等形式。整数在计算机中的存储比较简单,而浮点型数据在计算机中的存储却相对麻烦。在计算机中,浮点型数据都是以指数形式存储在内存中的。以实数1.23456为例,其在内存中的存储情况如下。

.1234561符号位小数部分指数

.123456×101即1.23456

为方便读者理解,这里使用十进制数描述了浮点型数据在内存中的存储情况,而在实际的计算机中小数部分是用二进制数表示的,指数部分是用2的幂次表示的。对浮点型数据的存储而言,C语言的标准并未规定,小数部分应占多少位,指数部分应占多少位,不同编译环境的规定可能不同。但在大多数的编译环境中,小数部分(包括符号位)占24位,指数部分占8位。小数部分占的位数越多,实数的有效数字越多,精度越高。指数部分占的位数越多,实数的取值范围就越大。1. 浮点型变量C语言中的浮点型变量可分为单精度(float型)、双精度(double型)和长双精度(long double型)。浮点型数据所占的字节数、有效数字和取值范围在不同的编译环境中可能不同。在多数编译环境中,单精度浮点型数据占4个字节,有效数字为7位,取值范围为-3.4×1038~3.4×1038; 双精度浮点型数据占8个字节,有效数字为16位,取值范围为-1.7×10308~1.7×10308; 长双精度浮点型数据所占的字节数可能是8字节、10字节、12字节或16字节,有效数字从15到19位不等,取值范围为-1.2×104932~1.2×104932。由于long double型数据很少应用,故不做详述。例如: 

float x;/*定义单精度浮点型变量x*/

double y;/*定义双精度浮点型变量y*/

需要注意,因为浮点型变量是由有限的存储单元组成的,所以它能提供的有效数字是有限的。在计算时,有效位以外的数字将被舍去,这可能会产生一些计算上的误差,即舍入误差。2. 浮点型常量在C语言中,系统一般将浮点型常量按双精度浮点数处理。例3.4浮点型数据的舍入误差示例。程序如下: 

#include<stdio.h>

int main(void)

{

float x;

  /*定义单精度变量x*/

double y;

  /*定义双精度变量y*/

x=1.234*3.23456;

  /*将两个浮点型常量的乘积赋给x*/

y=1.234*3.23456;

  /*将同样的乘积赋给y*/

printf("x=%f\ny=%.10f\n",x,y);  /*分别输出x和y*/

return 0;

}

程序运行结果如下: 

在上例中,系统先把两个浮点型常量123.456和2.3456当成双精度浮点数相乘,乘积(3.99144704)也是一个双精度浮点数,然后将乘积分别赋给变量x和y。由于单精度变量只能接收7位有效数字,所以系统从乘积中取7位有效数字(3.991447)赋给变量x,乘积的后两位“04”被舍去,导致舍入误差。而y是双精度变量,可接收的有效数字为16位,所以y可以接收整个乘积(3.99144704)。需要注意,浮点型常量按双精度浮点数处理虽然精度高,但运算速度较慢。为了提高运算速度,可以在浮点型常量后面加后缀f或F,此时系统会将其当成单精度浮点数处理。例如: 

x=1.234f*3.23456f;/*将两个单精度浮点型常量的乘积赋给变量x*/

3.3.3字符型数据1. 字符常量在C语言中,字符常量是指用单引号括起来的一个字符。凡是键盘可以正常输入的字符均可作为字符常量,如'a' 'b' ' ' '=' '?' '0'等。如果没有单引号",系统会将其当成变量或其他有名字的对象。在C语言中字符常量有以下特点: (1) 字符常量只能用单引号括起来,不能用双引号或其他括号,例如'a'是字符常量,而"a"是一个字符串(后面会介绍)。(2) 字符常量只能是单个字符,如'abc'是非法的。(3) 字符可以是字符集中的任意字符。(4) 数字被定义为字符型之后不宜参与算术运算,否则其运算结果和预期结果会截然不同,如'6'是字符常量,它如果参与算术运算('6' 6),其结果不是12而是60,因为'6'在进行加法运算时使用的值是它的ASCII码值54,所以('6' 6)相当于54 6,详见例3.5。(5) 大写字母和小写字母代表不同的字符常量,如'A'和'a'是不同的字符常量。(6) 单引号中的空格也是一个字符常量,但不能写成''(中间没有空格)的形式。(7) 字符常量在内存中占一个字节,存放的是字符的ASCII码值。在C语言中,所有的字符型常量(变量)和整型常量(变量)是通用的,其ASCII码值就是对应的整数值。例3.5字符型常量和整型常量示例。程序如下: 

#include<stdio.h>

int main(void)

{

char x,y;

  /*定义两个字符型变量x和y*/

int z;

  /*定义int型变量z*/

x='M';

  /*分别给x和y赋值*/

y='m';

z='6' 6;

printf("x=%c,y=%c\n",x,y);

  /*以字符形式输出x和y*/

printf("x=%d,y=%d\n",x,y);

  /*以整数形式输出x和y*/

printf("z=%c\n",z);

  /*以字符形式输出z*/

printf("x=%d\n",z);

  /*以整数形式输出z*/

return 0;

}

程序运行结果如下: 

在上例中,程序第6行和第7行分别给字符型变量x和y赋值为'M'和'm',因为字符型数据和整型数据是通用的,所以字符型数据也可以进行算术运算,参与运算的操作数为字符型数据的ASCII码值。程序第8行将'6' 6的和赋给了变量z,在这个加法运算中,第1个操作数是字符'6'的ASCII码值54,第2个操作数是整型常量6,两者之和为60。程序第9行以字符形式输出了变量x和y的值。程序第10行以整数形式输出了变量x和y的值,其值为对应的字符型数据'M'和'm'的ASCII码值。同一个字母(仅限26个英文字母)的小写形式的ASCII码值比大写形式的ASCII码值大32。程序第11行以字符形式输出的变量z是字符'<',其ASCII码值为60。程序第12行以整数形式输出的是变量z的ASCII码值60。2. 转义字符除了上述普通的字符常量之外,C语言还允许使用转义字符。转义字符是一种特殊形式的字符常量,是以反斜线“\”开头的字符序列,如\n、\t、\f等。转义字符具有特定的含义,主要用来表示用一般字符不便于表示的控制代码,如表3.2所示。

表3.2C语言常用的转义字符及其含义

转义字符含义ASCII码值

\n按回车键换行10\t水平制表(横向跳到下一制表位置)9\v竖向制表(竖向跳到下一制表位置)9\b退格8\r按回车键13\f走纸换页12\\代表一个反斜杠字符92\'代表一个单引号字符39\"代表一个双引号字符34\0代表空字符(NULL)0\ddd1~3位八进制数代表的字符\xdd1~2位十六进制数代表的字符

在使用转义字符时需要注意以下几点: (1) 转义字符是常量,只能用小写字母表示,且每个转义字符只代表一个字符,如'\n' '\101'只代表一个字符。(2) 反斜线后的八进制数可以不用0开头,如'\101'。(3) 反斜线后的十六进制数只可由小写字母x开头,不允许用大写字母X,也不能用0x开头,如'\x41'。(4) C语言中的任何一个字符均可用转义字符来表示,表3.2中的\ddd和\xhh就是为此提出的。比如'\101'表示的是ASCII码值为八进制数101的字符,因为八进制数101对应十进制数65,因此'\101'相当于ASCII码值为65的字符'A',即'\101'与'A'等价。再如'\x41'表示的是ASCII码值为十六进制数41的字符,因为十六进制数41对应的十进制数也是65,所以'\x41'也相当于ASCII码值为65的字符'A',即'\x41'也与'A'等价。换而言之,'\101' '\x41' 'A'三者等价。(5) 部分转义字符操作的屏幕显示结果和打印机显示结果不同,如\v和\f对屏幕无影响,而打印机则会执行相应操作。3. 字符串常量C语言允许使用字符串常量。字符串常量是由双引号括起来的一串字符,如"Hello!" "My name is Henry!" "a" "3.15"等。在字符串常量的双引号中允许插入任何转义字符,如"I am \097 boy.\n" "\\abc"等。例3.6输出字符串常量。程序如下: 

#include<stdio.h>

int main(void)

  

{

printf("I am a boy!\n");

  /*字符串中包含转义字符\n*/

printf("I am \141 boy!\n");

  /*字符串中包含转义字符\141和\n*/

printf("I am \x61 boy!\n");

  /*字符串中包含转义字符\x61和\n*/

return 0;

}

程序运行结果如下: 

上述程序包含三个字符串输出语句。每个语句的内容都不同,但输出结果相同,请读者自行分析原因。C语言规定以字符'\0'作为字符串常量的结束标志,即系统会在每个字符串的后自动加入一个字符'\0'作为字符串的结束标志。这里以字符串"Welcome"为例,它在内存中的存储情况如下。

Welcome\0

因此,字符常量和字符串常量是不同的,两者主要存在以下不同: (1) 表达形式不同,字符常量用单引号括起来,而字符串常量用双引号括起来,如'a'是字符常量,而"a"是字符串常量。(2) 存储长度不同,字符常量固定占用一个字节的存储空间,而字符串常量占用的字节数为字符串中的字符个数加1。如上例中,字符串常量"Welcome"有7个字符,但是它占用8个字节的存储空间,因为后一个字节要用于存储字符串结束标志"\0"。(3) 单纯的一对双引号" "也是一个字符串常量,称为空串,它也要用一个字节的存储空间存放字符串结束标志'\0'。(4) 可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋给一个字符变量。在C语言中没有字符串变量的概念,这和BASIC语言是不同的。C语言是用字符数组来存放字符串常量的,这部分内容将在第5章中详细介绍。4. 字符变量字符变量用于存储字符常量,能且仅能存放一个字符。字符变量的类型说明符是“char”,字符变量的定义格式和书写规则与整型、浮点型变量相同。例如: 

char x, y;

  /*定义字符变量x和y*/

x='a';

  /*给字符变量x赋值*/

y='A';

  /*给字符变量y赋值*/

上述语句定义了字符变量x和y并进行了赋值。变量x和y能且仅能存放一个字符。变量x被赋予'a',其值为字符'a'的ASCII码值; 变量y被赋予'A',其值为字符'A'的ASCII码值。前面说过,在C语言中字符型数据和整型数据是通用的,字符变量可以进行任何整型变量允许的运算。在编程时可以给整型变量赋字符值,也可以给字符变量赋整型值(ASCII码值)。在变量输出时可以把字符变量当成整型数据输出,输出字符的ASCII码值,也可以把整型值(ASCII码值)当成字符数据输出,输出该ASCII码值对应的字符,见下例。例3.7字符变量示例。程序如下: 

#include<stdio.h>

int main(void)

{

char x,y,z;

  /*定义三个字符型变量x、y、z*/

x='A';

  /*将字符常量A赋给变量x*/

y=x 32;

  /*计算x 32的结果并将其赋给字符变量y*/

z=65;

  /*将十进制数65赋给字符变量z*/

printf("x=%c,y=%c,z=%c\n",x,y,z);  /*以字符形式输出x、y和z*/

return 0;

}

程序运行结果如下: 

请读者结合前面的内容认真分析程序,思考程序的运行结果。3.3.4为变量赋初值在C语言中有时需要给一些变量赋初值,C语言允许在定义变量的同时为其赋初值。例如: 

int x=5, y=6;

  /*定义基本整型变量x和y,并分别给它们赋初值5和6*/

float m=3.0;

  /*定义单精度变量m,初值为3.0*/

char ch1='A';

  /*定义字符变量ch1,初值为'A'*/

C语言允许为定义的一部分变量赋初值。例如: 

int x, y, z=3;/*定义基本整型变量x、y和z,但仅对z赋初值3*/

如果想把一个数同时赋给多个变量,应写成以下形式: 

int x=1, y=1, z=1;/*将变量x、y、z的初值均赋为1*/

注意,上述语句绝不能写成以下形式: 

int x=y=z=1;/*非法*/

需要说明的是,给变量赋初值的操作不是在程序编译阶段完成的,而是在程序运行阶段完成的,即在程序编译时编译器知道整型变量x的存在,但此时变量x没有变量值。变量x的初值是在程序运行时赋予的。例如: 

int x=1;

其实相当于: 

int x;

x=1;

3.4不同数据类型间的转换3.4.1混合运算中的数据类型转换C语言允许整型、单精度型、双精度型和字符型数据进行混合运算。当不同类型的数据进行混合运算时,需要先按照一定的顺序(如图3.4所示)将不同类型的数据转换成同一种类型的数据,然后再进行运算。具体的数据转换工作由编译器自动完成,转化规则如下: 

图3.4不同数据类型混合运算时的

转换顺序

(1) 混合运算时首先进行水平方向的转换,这种水平方向的转换是必须进行的,如图3.4所示,char和int处于同一水平。如果两个char(short)变量想进行运算,必须先转换成int型的变量,然后再运算。同理,float型数据的运算也要先转换成double型数据再运算。(2) 在进行水平方向的转换后,若仍存在不同类型数据,则按照垂直方向由低到高继续转换,直至所有数据类型一致。例如,int型数据和double型数据进行运算,需要先把int型数据按从低到高的方向转换成double型数据,然后再运算。int型数据和float型数据进行运算,均需转换成double型数据才能运算。例3.8C语言混合计算示例。程序如下: 

#include<stdio.h>

int main(void)

{

int a=1;

float b=2.0;

double c=3.0,y;

long d=6;

y=1 'm' a*b-d/c;

printf("%f\n",y);

return 0;

}

程序运行结果如下: 

上例在求y值时,编译器对表达式“1 'm' a*b-d/c”的执行是从左到右的,具体运算过程如下: (1) 先计算1 'm','m'转换成整数109,求得两者之和为110。(2) 因为“*”比“ ”的优先级高,所以先计算a*b,因为a为int型、b为float型,所以a和b都要转换成double型,两者之积也为double型。(3) 将110与a*b的积相加,计算“110 a*b”,其结果为double型。(4) 因为c为double型,所以要将变量d转换成double型之后再计算d/c,其结果也是double型。(5) 将“110 a*b”与“d/c”相减,计算结果为double型。需要注意的是,上述运算过程中的转换都是系统自动完成的。3.4.2赋值运算中的数据类型转换C语言规定,在赋值运算中若赋值运算符“=”两边的数据类型不一致,且都是数值型或字符型,将进行数据类型转换,此时会将赋值运算符右边的数据类型转换成左边的数据类型。具体规则如下: (1) 浮点型数据赋予整型变量,浮点型数据的小数部分将被舍去,而不是四舍五入。例如,x为整型变量,执行x=3.98的赋值运算,赋值结果为x=3,浮点数3.98的小数部分被舍去(注意不是四舍五入)。(2) 整型数据赋予浮点型数据,数值不变,但将以浮点数的形式存放,即增加小数部分,且小数部分的值为0。例如,x为float型变量(7位有效数字),将整数10赋给x,则先转换成10.00000,然后再赋给变量x,x=10.00000。(3) float型数据赋给double型变量,数值不变,但有效位由7位扩至16位,占据的存储空间也由4字节扩至8字节。(4) double型数据赋给float型变量时会产生舍入误差,系统取double型数据的前7位有效数字存入float型变量(前提是取值范围不能溢出),其余数字舍去。例如: 

float x=1e20;/*正确*/

floaty=1e100;/*非法,数据溢出*/

(5) 在将char型数据赋予int型变量时,将char型数据的ASCII码值以二进制的形式放入int型变量的低8位中,左侧高位均为0。(6) 在将int、short、long型数据赋给char型变量时,只将数据的低8位作为ASCII码值存入char型变量,剩余高位的内容都舍去。(7) 在将short型数据赋给int、long型变量时(以VC 6.0为例)需进行符号扩展。先将short的16位二进制数送入int、long型变量的低16位,然后进行符号扩展,若short型数据为正,则int、long型变量的高位补0,否则补1。(8) 在将unsigned short型数据赋给int、long型变量时不存在符号扩展问题,只需将高位补0即可。(9) 在将非unsigned型数据赋给长度相同的unsigned型变量时也是原样赋值,即符号位也作为数值一起传送。以上转换规则看起来有些烦琐,其实总结起来就是一点,即赋值时的类型转换其实就是按存储单元中的存储形式直接传送。3.4.3强制转换前面两种数据转换是由编译器自动完成的。除此之外,C语言还允许对数据进行强制转换。强制转换的作用是利用强制转换运算符“( )”把一个表达式强制转换成需要的数据类型,一般格式如下: 

(类型说明符)  (表达式)

例如: 

(float) a/*把变量a强制转换为float型*/

(int) (x y)/*把x y的结果强制转换为整型*/ 

在使用强制转换时应注意以下两点: (1) 类型说明符和表达式都必须加括号,单个变量可以不加括号。若把(int)(x y)写成(int)x y,则相当于把x转换成int型后再与y相加。(2) 强制转换只是为了运算需要对数据进行的临时性转换。在强制转换后,程序会得到一个所需数据类型的临时变量,而原有变量的数据类型并未改变。例3.9强制转换示例。程序如下: 

int main(void)

{

float x=3.14;

printf("(int)x=%d\n",(int)x);    /*float型变量x被强制转换后得到一个int型临时变量*/

printf("x=%f\n",x);

    /*被强制转换的float型变量x本身并未改变*/

return 0;

}

程序运行结果如下: 

由上例可知,float型变量x在程序的第4行中被强制转换,得到一个临时的int型数据并输出,而x原有的数据类型并未改变,仍为float型,如程序运行结果的第2行所示。3.5运算符和表达式除控制语句和输入输出以外,C语言几乎把所有的基本操作都作为运算符处理。因此,C语言具有极为强大的运算功能,运算符种类很多,如算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、强制类型转换运算符、分量运算符、下标运算符等。各种运算符的数量及作用分别如下。(1) 7种算术运算符: 用于各类数值运算,包括加“ ”、减“-”、乘“*”、除“/”、求余“%”、自增“ ”、自减“--”。(2) 6种关系运算符: 用于比较运算,包括大于“>”、小于“<”、等于“==”、大于等于“>=”、小于等于“<=”和不等于“!=”。(3) 3种逻辑运算符: 用于逻辑运算,包括与“&&”、或“‖”、非“!”。(4) 6种位运算符: 对参与运算的数据按二进制位进行运算,包括按位与“&”、按位或“|”、按位取反“~”、按位异或“^”、左移“<<”、右移“>>”。(5) 11种赋值运算符: 用于赋值运算,包括简单赋值运算符“=”,复合算术赋值运算符“ =” “-=”“*=” “/=”“%=”,复合位运算赋值符“&=” “|=” “^=” “>>=” “<<=”。(6) 条件运算符“?:”: C语言中的三目运算符,用于条件求值。(7) 逗号运算符“,”: 用于把两个表达式连在一起构成一个表达式。(8) 指针运算符: 包括取内容运算符“*”和取地址运算符“&”。(9) 求字节数运算符“sizeof”: 用于计算数据类型所占的字节数。(10) 强制类型转换运算符“()”: 用于将表达式的值强制转换成需要的数据类型。(11) 分量运算符“.->”: 用于结构指针指向成员名的操作,也叫指向结构体成员运算符。(12) 下标运算符“[]”: 用于引用数组元素。(13) 其他: 如函数调用运算符“()”等。在C语言中使用运算符时需要考虑运算符的优先级和结合性问题。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约。这种结合性是其他高级语言的运算符所没有的,这也增加了C语言的复杂性。在C语言中,表达式的涵盖范围非常广,它可以是任何计算结果为数值的东西,包括简单表达式和复杂表达式。简单变量、常量、符号常量都是简单表达式,也叫小表达式,是表达式求值的小单位。例如,简单变量x、整型常量5、字符常量'a'、符号常量PI等都是简单表达式。表达式的值就是该表达式的运算结果。所有表达式都有一个值及其类型,如算术表达式的值为整型或浮点型常量; 关系或逻辑表达式的值为逻辑值“1”(表示“真”)或“0”(表示“假”); 赋值表达式的值是表达式左侧变量的值; 函数调用也是一种表达式,叫函数表达式,它的值是函数的返回值。简单表达式的值是其本身的值或程序赋给它的当前值。复杂表达式由多个简单表达式组成,各个简单表达式之间用运算符相连,因此复杂表达式的值是该表达式的运算结果。例如,x y-z、4 5/6-7、x=5、a&&b‖c、m=n=5 7等都是复杂表达式,它们各自运算的结果就是各表达式的值。有的读者可能会奇怪“m=n=5 7”怎么会是表达式呢?这里一定要把C语言中表达式的概念与数学中表达式的概念加以区分。在C语言中,“m=n=5 7”是一个复杂表达式,该表达式的值就是它终的运算结果,因此表达式“m=n=5 7”的值的求解过程如下: (1) 对表达式“5 7”进行加法运算,计算结果就是该表达式的值,即表达式“5 7”的值为12。(2) 在表达式“n=5 7”中,将表达式“5 7”的值12赋给变量n,且表达式“n=5 7”的值也是12。(3) 在表达式“m=n=5 7”中,将表达式“n=5 7”的值12赋给变量m,且表达式“m=n=5 7”的值也是12。综上所述,复杂表达式的值的求解过程相对复杂,有时还需要考虑运算符的优先级和结合性问题,后面会结合具体内容详细讲解。3.5.1算术运算符和算术表达式1. 算术运算符本章重点要介绍的是算术运算符和赋值运算符。在C语言中,基本算术运算符有以下5种。(1) 加法运算符“ ”: 双目运算符,即应有两个数参与加法运算,如a b、4 8等。(2) 减法运算符“-”: 双目运算符,但“-”也可作为负值运算符使用。此时,负值运算符“-”为单目运算,如-x、-5。(3) 乘法运算符“*”: 双目运算符。(4) 除法运算符“/”: 双目运算符。需要注意的是,当参与除法运算的两个数都是正整数时,其结果也是整数。例如,7/2的结果不是3.5而是3,小数部分0.5被舍去。若参与除法的两个数中有一个是负数,则不同的编译系统计算结果不同。大多数编译系统(如VC 6.0、TC等)遵循“向零凑整”的原则。例如,-7/2的计算结果为-3,-8/3的计算结果为-2,因为除法运算的运算结果应取整后向0靠拢。(5) 取余运算符“%”: 双目运算符,%两侧都应是整数,如5%3的运算结果为2,-5%3的运算结果为-2,6%1的运算结果为0。对于 、-、*、/这4种基本算术运算,若两个参与运算的数中有一个是float型或double型,则计算结果为double型,因为对于不同数据类型混合运算而言,必须按照C语言的转换规则将参与运算的数转换成相同的类型,相关类型转换规则在3.4节中已详细讲解,这里不再赘述。2. 算术表达式算术表达式就是用算术运算符和括号将运算对象(操作数)连接起来的符合C语言语法规则的式子,其中运算对象包括常量、变量、函数等。算术表达式的值就是该表达式终的运算结果,是一个算术值。例如,a b/c、1 5、x%2、x*y-3.1 'C'等都是算术表达式。对于包含多种运算符的算术表达式的值的求解必须遵循一定的顺序进行,这种顺序称为运算符优先级。C语言对运算符的优先级有严格的规定,每种运算符都有一个优先级。在计算表达式时首先执行优先级高的运算符,然后执行优先级低的运算符。若表达式中出现了多个优先级相同的运算符,则按照运算符的结合方向进行运算。下面以算术表达式为例说明复杂表达式的值的求解过程: (1) 在求算术表达式的值时先按算术运算符的优先级别从高到低执行。例如,对算术表达式“x-y*z”而言,因为“*”和“/”的优先级别高于“ ”和“-”,所以“x-y*z”相当于“x-(y*z)”。(2) 若一个运算对象两侧的运算符的优先级别相同,则需按照C语言规定的“结合方向”进行运算。仍以基本算术运算为例,C语言规定除负值运算符“-”之外,其他基本算术运算符的结合方向是“从左到右”,或者说“先左后右”。例如,在求解算术表达式“x y-z”时,“ ”和“-”的优先级相同,所以按照“从左到右”的结合方向先执行“x y”的运算,再执行减z的运算。(3) 如果一个运算符两侧的数据类型不同,则先自动进行类型转换,之后再对相同的数据类型进行运算。(4) C语言也有一些右结合性的运算符,如赋值运算符“=”、自增运算符“ ”、自减运算符“--”、按位取反运算符“~”等,在后面会陆续讲到。(5) 在C语言中,为了使运算顺序的表达更清楚,可以用圆括号来改变运算顺序。例如,在求解表达式“(1 5)*3”时,需要先计算圆括号中的算术表达式“1 5”的值,在得到算术表达式的值6之后再进行乘法运算“6*3”。(6) 在复杂表达式中圆括号可以嵌套,当出现圆括号嵌套的情况时从内向外进行运算。例如表达式“24/(1*(3*(2 2)))”,在运算时先算“2 2”,再算“3*4”,然后算“1*12”,后算“24/12”,得到表达式的值为2。对初学者而言,为了使表达式更清晰,可以适当使用圆括号。3. 自增和自减运算符自增运算符“ ”和自减运算符“--”是C语言中使用非常多的算术运算符。自增运算符“ ”的作用是使操作数加1; 自减运算符“--”的作用是使操作数减1。自增和自减运算符可以放在操作数前面(前置)构成表达式,如 x、--y等; 也可放在操作数后面(后置)构成表达式,如x 、y--等。在不同的程序中,自增和自减运算符前置与后置所起的作用可能不同。例如,假设变量x和y均为int型变量,x的初值为3。

从变量x的角度来看, x和x 的作用是相同的,都相当于将变量x的值加1,即对变量x来说, x和x 都等价于“x=x 1”,自增运算符前置和后置的作用相同。但在表达式1“y= x”和表达式2“y=x ”中,对于变量y而言, x和x 的作用是不同的。在表达式1中,系统先将x的值加1,x的值由3变为4,之后将x的值4作为“ x”的值赋给变量y,终y的值为4、x的值为4。在表达式2中,系统先将x的值3作为“x ”的值赋给变量y,即y的值为3,然后再将x的值加1,终y的值为3、x的值为4。综上所述,对变量x而言, x和x 的作用相同,但对变量y而言, x和x 的作用不同。例3.10自增运算符前置与后置在表达式中的应用。程序如下: 

#include<stdio.h>

int main(void)

{

int x=3,y=3,i,j;

i=x ;

  /*自增运算符后置*/

j= y;

  /*自增运算符前置*/

printf("x=%d,i=%d,y=%d,j=%d\n",x,i,y,j);

/*分别输出x、i、y和j*/

return 0;

}

程序运行结果如下: 

在上例中求解程序第5行的表达式“i=x ”的值时,因为自增运算符“ ”置于变量x之后,所以根据自增运算符后置的说明可知,程序先将变量x的值3作为“x ”的值赋给变量i(即i=3),之后再执行“x=x 1”的自增运算,使x的值变为4。在求解程序第6行的表达式“j= y”的值时,因为自增运算符“ ”置于变量y之前,所以根据自增运算符前置的说明可知,程序先执行“y=y 1”的自增运算,使y的值变为4,并将其作为“ y”的值赋给变量j,即j=4。通过上例可以看到,对于变量x和变量y而言,自增运算符前置与后置的作用一样,都是使变量的值加1,即x 相当于x=x 1、 y相当于y=y 1。但是对于表达式“i=x ”和表达式“j= y”而言,自增运算符前置与后置的效果是不一样的。自减运算符的使用与自增运算符类似,也可分为前置和后置。仍以整型变量x为例,假设x的初值为5。对变量x而言,--x和x--的作用相同,都相当于执行“x=x-1”的操作。但在表达式1“y=--x”和表达式2“y=x--”中,对变量y而言,--x和x--的作用不同。在表达式1中,系统先将x的值减1(此时x的值为4),然后将其作为“--x”的值赋给变量y,终y的值为4、x的值为4。在表达式2中,系统先将x的值5作为“x--”的值赋给变量y,即y的值为5,然后再将x的值减1,终y的值为5、x的值为4。对于自增和自减运算符有以下几点需要注意: (1) 自增和自减运算符只能用于变量,不能用于常量或表达式。例如: 表达式3 、--3、(x y) 、--(x 5)都是不合法的。因为常量和表达式的值是不能改变的,或者说常量与表达式无法为自增或自减运算后的值提供存储空间。例如,对于表达式(x y) 而言,假设x=1、y=3,(x y)的值等于4,那么(x y)自增之后的值5放在哪里呢?无处可放。(2) 自增运算符“ ”、自减运算符“--”的优先级与负号“-”相同,且运算符的结合方向都是自右至左。例如: 假设整型变量x的值为3,则表达式“-x ”相当于“-(x )”,先利用自增运算符后置得到“x ”的值为3,因此表达式“-(x )”的值为-3,然后再将x的值加1,即x的值变为4。而表达式“- x”相当于“-( x)”,先利用自增运算符前置,将变量x的值加1变为4,得到“x ”的值为4,然后再利用负号进行取反运算得到表达式“-( x)”的值为-4。(3) 由于自增和自减运算符在表达式中前置或后置的作用不同,初学者在使用时容易理解错误。例如: 

printf("%d,%d\n",x,x );

上述语句容易使初学者产生疑问,建议改成: 

y=x ; 

printf("%d,%d\n",x,y);

或直接改为: 

printf("%d,%d\n",x,x 1);

3.5.2赋值运算符和赋值表达式在C语言中,赋值运算符包括简单赋值运算符和复合赋值运算符。1. 赋值运算符在C语言中,将赋值符号“=”称为简单赋值运算符(一般简称为赋值运算符),其作用是将一个值赋给一个变量。例如: 

int x; 

x=5; 

在上例中,在定义了整型变量x之后利用赋值运算符“=”将整数5赋给了变量x。赋值运算符也可将表达式的值赋给变量。例如: 

double x;

x=6.0/3.0;

在上例中,将表达式6.0/3.0的值0.5赋给了变量x。对于赋值运算符有以下几点需要注意: (1) 赋值运算符的结合方向为自右至左。(2) C语言中的赋值运算符“=”和数学中的等号“=”是不一样的。数学中的等号“=”是一种逻辑判断,常用于判断等号两边是否相等,类似于C语言后面要学的关系运算符中的“==”。C语言中的赋值运算符“=”的作用是将一个值赋给一个变量,也就是说它是一种运算或者一种操作。例如: 在数学中可以写“3 3=4 2”,表示等号两边相等,而C语言中赋值运算符的左边必须是一个变量,不允许出现常量。(3) 在数学中,“x=y”表示x和y相等。在C语言中,“x=y”则是将y的值赋给x,即将y的值放入x的内存单元取代其原有的值。在C语言中,如果想表示变量x和变量y两者相等,应写为“x==y”,在后面介绍关系运算符时会详细讲解。(4) 在使用赋值运算符时要根据变量定义时的数据类型明确其取值范围,若所赋的值超过变量的取值范围,编译器会报错。(5) 如果赋值运算符两侧的类型不一致,但又都是数值型或字符型数据,那么赋值时要进行类型转换,具体规则详见3.4.2节,这里不再赘述。2. 复合赋值运算符为方便编程,除了赋值运算符“=”之外,C语言还提供了复合赋值运算符。在赋值运算符的前面加上其他运算符就构成了复合赋值运算符。C语言规定凡是双目运算符(10种)都可以和赋值运算符一起构成复合赋值运算符,包括 =、-=、*=、/=、%=、<<=、>>=、&=、^=和|=。上述10种复合赋值运算符的结合方向都是自右至左,前5种用于算术运算,后5种用于位运算(详见第9章)。例如: x =5等价于x=x 5; x*=5等价于x=x*5; x%=5等价于x=x%5; x/=y 3等价于x=x/(y 3)。上述语句都是对复合赋值运算符的运用。

下面以x =5为例说明复合赋值运算符的运算过程: (1) 计算表达式“x 5”的值。(2) 将表达式“x 5”的值重新赋给变量x。因此,表达式“x =5”与表达式“x=x 5”是等价的。表达式x*=5、x%=5和x/=5的运算过程与“x =5”类似,这里不再赘述。需要注意的是,如果复合赋值运算符右侧的表达式中还有其他运算符,那就需要结合运算符的优先级和结合方向进行运算。例如,对于表达式“x/=y 3”而言,因为加法运算符“ ”的优先级高于复合赋值运算符“/=”,所以要先计算表达式“y 3”的值,然后再进行“/=”的复合赋值运算,即表达式“x/=y 3”等价于“x=x/(y 3)”。

在C语言中,使用复合赋值运算符的目的一是用于简化程序; 二是用于提高程序的编译效率,使编译器生成的目标代码质量更高。3. 赋值表达式用赋值运算符把一个变量和一个表达式连起来构成的式子叫赋值表达式,其一般形式如下: 

变量 赋值运算符 表达式

赋值表达式的值同样是赋值运算的结果,其值的求解过程如下: (1) 计算赋值运算符右侧表达式的值。(2) 将表达式的值赋给赋值运算符左侧的变量。(3) 左侧变量的值即整个赋值表达式的值。例如,在求解赋值表达式“x=3”的值时先计算赋值运算符“=”右边表达式的值,右边的表达式是一个常量,其值为3; 之后将表达式的值3赋给变量x; 后,变量x的值就是表达式“x=3”的值。简单来说,“赋值表达式的值”就是“赋值表达式左侧的变量的值”。赋值运算符“=”左侧的标识符也叫左值,只能是变量; 赋值运算符“=”右侧的表达式也叫右值,可以是简单表达式,也可以是复杂表达式。请结合下例分析赋值表达式的值的求解过程。例3.11分析赋值表达式的值。程序如下: 

#include<stdio.h>

int main(void)

{

int x,y,z;

x=y=z=5 7;

  /*利用赋值表达式给变量x、y和z赋值*/

printf("%d,%d,%d\n",x,y,z);

return 0;

}

程序运行结果如下: 

对于上例,由前面的介绍可知,赋值运算符的结合方向是自右至左的,所以程序第5行的表达式相当于“x=(y=(z=(5 7)))”,其值的求解过程如下: (1) 先求表达式“5 7”的值,其值为12。(2) 将表达式“5 7”的值12赋给变量z,且变量z的值12就是赋值表达式“z=(5 7)”的值。(3) 将赋值表达式“z=(5 7)”的值12赋给变量y,且变量y的值12就是赋值表达式“y=(z=(5 7))”的值。(4) 将赋值表达式“y=(z=(5 7))”的值12赋给变量x,且变量x的值12就是赋值表达式“x=(y=(z=(5 7)))”的值。综上所述,虽然变量x、y、z的值都是12,但它们的值是由不同的赋值表达式的值赋予的。这一点与数学中等号的使用有很大的不同。请读者结合以下表达式分析并练习赋值表达式的值的求解。

x=3 (y=2);/*y的值为2、x的值为5,整个表达式的值为5*/

x=(y=6)/(z=3);/*z的值为3、y的值为6、x的值为2,整个表达式的值为2*/

同样,在赋值表达式中也可以使用复合赋值运算符,假设变量y的初值为20。

x=2 (y-=3*5);/*y的值为5、x的值为7,整个表达式的值为7*/

3.5.3逗号运算符和逗号表达式为方便程序设计,C语言还提供了一种特殊的运算符——逗号运算符“,”,其作用是将两个表达式连接起来构成一个表达式。例如: 

x=3,3*2/*逗号运算符“,”将表达式“x=3”和表达式“3*2”相连*/

利用逗号运算符可以将多个表达式连接在一起构成逗号表达式,其一般形式如下: 

表达式1,表达式2,表达式3,…,表达式n

逗号表达式的结合方向是自左至右的,所以逗号表达式的求解是先求解表达式1,再求解表达式2,再求解表达式3,……,后求解表达式n,且整个逗号表达式的值就是右侧的表达式n的值。例如: 

y=(x=3*4,6/3);

在上述语句中“x=3*4,6/3”是一个逗号表达式,且整个逗号表达式的值为表达式“6/3”的值2。因此,该语句的作用是先将12赋给变量x,然后将2赋给变量y。又例如: 

x=(y ,z );

上述语句的运算过程如下: 首先使变量y自增1; 然后将变量z的值作为“z ”的值赋给逗号表达式“y ,z ”; 之后将逗号表达式的值赋给变量x; 后使变量z自增1。若变量y和z的初值均为1,则上述语句运行后x值为1、y值为2、z值为2。请注意,上面两个例子中都使用了圆括号“()”,这是因为逗号运算符的优先级在所有运算符中是的。如果想实现上面所说的编程目的,必须用圆括号指定运算顺序。在C语言中,逗号表达式其实就是用逗号运算符把若干个表达式连起来,其目的一般是希望分别得到各个表达式的值,整个逗号表达式的值有时反而不会用到。逗号表达式在C语言中应用多的情况是在“for循环语句”中(详见第4章)。后需要强调的是,在C语言程序中并非所有使用的逗号都是逗号运算符。在后面介绍函数调用时(详见第6章)多个函数参数之间要用逗号隔开,例如“sum(3,5)”; 格式输入函数scanf和格式输出函数printf在使用时也会用到逗号,例如“printf("%d,%d,%d\n",x,y,z);”和“scanf("%d,%d",&x,&y);”。例3.12逗号表达式的应用。程序如下: 

int main(void)

{

int a=2,b=4,c=6,x,y;

y=(x=a b),(b c);

  /*利用逗号表达式给变量x和y赋值*/

printf("y=%d,x=%d",y,x);

return 0;

}

程序运行结果如下: 


在线阅读/听书/购买/PDF下载地址:


原文赏析:

暂无原文赏析,正在全力查找中!


其它内容:

编辑推荐

精心策划,专为零基础初学者循序渐进地讲解C语言基础。


书摘插图


前言

前言

      自1972年诞生以来,由于数据类型丰富、运算方便、表达方式灵活、兼具高级语言和低级语言的优点且能够直接对计算机硬件进行操作,C语言迅速成为一种在全世界范围内被广泛使用的程序设计语言。

在实际应用中,从网络后台程序到计算机操作系统,各种各样的应用程序和游戏均可使用C语言进行开发设计,用其编写的程序普遍具有执行效率高、代码紧凑、可移植性好等优点。鉴于C语言在工业领域中的重要性,很多高职院校和普通高等院校都将其作为电类专业学生的程序设计基础语言课程,其目的是使学生在了解并掌握程序设计思想和方法的基础上,培养计算机程序设计的实践能力。C语言的优秀教材很多,但能够将C语言与电类专业应用联系在一起,并让零基础初学者欣然接受的却并不多。因此,本书针对初学者的学习特点,通过内容整合、示例精讲、实例分析等方式,重新整理安排了电类专业C语言教学内容,力图使其更加简洁明确、通俗易懂,更具专业针对性。

本书以ANSI C为标准(美国国家标准协会推出的C语言标准),以Visual C 6.0为集成开发环境,全面系统地介绍了C语言及其程序设计思想和方法,主要特点如下: 

(1) 教学内容由浅入深、循序渐进,符合初学者零基础的特点。前4章作为基础部分,各章节知识点讲解简单明了,示例丰富,能够帮助读者尽快掌握C语言基础。第5~10章作为进阶部分,在介绍知识点的同时更注重知识点的综合运用。第11章作为高级部分,通过专业编程实例向读者展示了电类专业C语言编程常用知识点的实际使用情况。(2) 章节安排合理。在循序渐进安排教学内容的同时,本书对部分章节的知识点讲解顺序进行了调整,使整个教学内容更富条理,更符合初学者的学习节奏,学习效率更高。(3) 避免知识点的简单罗列,避免细枝末节的语法干扰。因为C语言的知识点多且散,初学者很难全部掌握,所以本书根据C语言在电类专业的实际应用情况,对知识点进行了必要的区分。常用知识点均辅以经典实例详细讲解,使读者对知识点的掌握更深入透彻。偏僻知识点的讲解则力求简洁,以免过多的语法细节干扰读者的学习进度。(4) 示例经典,注释详细。书中的重点教学内容均附有典型示例,对相关知识点的注释讲解极为详细,方便读者直观了解和分析知识点的应用情况。(5) 结合科研竞赛内容,理论联系实际,注重实战能力培养。在计算机、电气、电子、通信等电类专业实际应用中,C语言的编程应用极为广泛。因此,借助作者所在单位——石家庄学院物电学院近年来在全国电子设计大赛、全国智能车竞赛、河北省挑战杯等科研竞赛中的经验积累,本书专门整理搜集了多个基于C语言的科研竞赛实例。通过实例分析让读者更好地感受和实践C语言编程的乐趣。本书由石家庄学院郭鹏、康元元、孙宏强、孙建起编写,其中,第1~3章、第5~7章和第9章由郭鹏编写,第8章、第10章及附录由康元元编写,第11章由孙宏强编写,第4章由孙建起编写。全书由郭鹏主编并统稿。此外,石家庄学院张玉丰和张勇杰同学也参与了本书的部分实例整理工作。本书在编写过程中参阅了大量的参考文献,在此对它们的作者表示衷心的感谢。由于编者水平有限,书中难免有错误和疏漏之处,恳请广大读者批评指正。

作者2017年3月



书籍真实打分

  • 故事情节:5分

  • 人物塑造:5分

  • 主题深度:8分

  • 文字风格:7分

  • 语言运用:8分

  • 文笔流畅:7分

  • 思想传递:6分

  • 知识深度:9分

  • 知识广度:4分

  • 实用性:6分

  • 章节划分:9分

  • 结构布局:7分

  • 新颖与独特:9分

  • 情感共鸣:6分

  • 引人入胜:5分

  • 现实相关:3分

  • 沉浸感:9分

  • 事实准确性:4分

  • 文化贡献:5分


网站评分

  • 书籍多样性:9分

  • 书籍信息完全性:6分

  • 网站更新速度:3分

  • 使用便利性:6分

  • 书籍清晰度:7分

  • 书籍格式兼容性:9分

  • 是否包含广告:3分

  • 加载速度:6分

  • 安全性:6分

  • 稳定性:8分

  • 搜索功能:8分

  • 下载便捷性:9分


下载点评

  • txt(82+)
  • 好评多(97+)
  • 藏书馆(477+)
  • 推荐购买(626+)
  • 实惠(476+)
  • 赞(345+)
  • 博大精深(347+)
  • 书籍完整(670+)
  • 速度慢(575+)
  • 还行吧(290+)
  • 在线转格式(197+)
  • azw3(470+)
  • 简单(305+)

下载评价

  • 网友 曾***玉: ( 2024-12-21 04:13:46 )

    直接选择epub/azw3/mobi就可以了,然后导入微信读书,体验百分百!!!

  • 网友 利***巧: ( 2025-01-19 09:53:34 )

    差评。这个是收费的

  • 网友 印***文: ( 2024-12-24 00:02:22 )

    我很喜欢这种风格样式。

  • 网友 益***琴: ( 2025-01-09 21:46:10 )

    好书都要花钱,如果要学习,建议买实体书;如果只是娱乐,看看这个网站,对你来说,是很好的选择。

  • 网友 温***欣: ( 2025-01-01 21:26:09 )

    可以可以可以

  • 网友 步***青: ( 2024-12-23 07:22:33 )

    。。。。。好

  • 网友 相***儿: ( 2025-01-12 00:37:31 )

    你要的这里都能找到哦!!!

  • 网友 隗***杉: ( 2024-12-31 19:16:42 )

    挺好的,还好看!支持!快下载吧!

  • 网友 权***波: ( 2025-01-14 09:36:11 )

    收费就是好,还可以多种搜索,实在不行直接留言,24小时没发到你邮箱自动退款的!

  • 网友 蓬***之: ( 2025-01-04 22:26:12 )

    好棒good

  • 网友 宓***莉: ( 2024-12-19 20:51:18 )

    不仅速度快,而且内容无盗版痕迹。

  • 网友 薛***玉: ( 2025-01-15 16:26:37 )

    就是我想要的!!!


随机推荐