第2章 数据类型、运算符和表达式_第1页
第2章 数据类型、运算符和表达式_第2页
第2章 数据类型、运算符和表达式_第3页
第2章 数据类型、运算符和表达式_第4页
第2章 数据类型、运算符和表达式_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言的数据类型语言的数据类型常量、变量常量、变量3C语言的运算符和表达式语言的运算符和表达式41 1 2C语言的字符集语言的字符集: 关键字、标识符关键字、标识符1第二章第二章 数据类型、运算符和表达式数据类型、运算符和表达式第二章第二章 数据类型、运算符和表达式数据类型、运算符和表达式第二章第二章 数据类型、运算符和表达式数据类型、运算符和表达式C C语言字符集及常规分类:语言字符集及常规分类:字母:小写字母az共26个,大写字母AZ共26个。数字:09共10个。空白符:空格符、制表符和换行符等统称为空白符。下划线:_。标点符号、特殊字符:+、-、*、/、%、=、(、)、!、&、#

2、、?、,、.、;、:、。 2.1 C2.1 C语言的字符集语言的字符集C语言定义了32个关键字 2.2.1 关键字关键字2.2 C语言的关键字和标识符语言的关键字和标识符 所谓标识符(又称用户自定义标识符),是指用来表示变量名、符号常量名、函数名、数组名、类型名、文件名的字符序列。 C语言的标识符必须满足以下规则:标识符只能由英文字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。大小写英文字母被认为是不同的字符。例如,A和a、stud和Stud是不同的标识符。标识符不能与关键字和保留标识符重名。在一个标识符中,各个字符之间不允许出现空格。标识符的长度可以为任意,它随编译系统的不同

3、而不同。2.2.2 标识符标识符2.2 C语言的关键字和标识符语言的关键字和标识符正确的标识符命名:正确的标识符命名: smart _decision high3 Area 不正确的标识符命名:不正确的标识符命名: 5smart(以数字开头) Bomb?(含有特殊字符?) High.balance(把下划线“_”与“.”混淆了) float(不能用C语言中的关键字) 定义标识符时应尽量做到“见名知意”,以提高程序的可读性。 例如,可用sum表示求和,name表示姓名,max表示最大值等。 保留标识符系统保留的一部分标识符,通常用于系统定义标准库函数的名字。 例如,正弦函数名sin( )、打印函

4、数名printf( )、预编译命令#define等。2.2.2 标识符标识符2.2 C语言的关键字和标识符语言的关键字和标识符2.3 C语言的数据类型语言的数据类型C语言的数据类型语言的数据类型 所谓常量,是指在程序运行的整个过程中,其值始终不变的量。 常量可以有不同的类型,可分为直接常量和符号常量。 直接常量也就是日常所说的常数,包括数值常量和字符型常量两种。 数值常量又包括整型常量和实型常量; 字符型常量可分为字符常量和字符串常量;2.4 常常 量量2.4 常常 量量 整型常量就是整常数。 在C语言中,整型常量有十进制、八进制、十六进制3种表示形式。 1. 十进制整型常量十进制整型常量 十

5、进制整型常量的表示与数学上的整数表示相同,十进制整型常量没有前缀,由09的数字组成。 以下各数是合法的十进制整型常量: 237,-568,65535,1623 以下各数不是合法的十进制整型常量: 023(不能有前导0),23D(含有非十进制数码D)2.4.1 整型常量整型常量 2.4 常常 量量 2. 八进制整型常量八进制整型常量 八进制整型常量的表示形式是以数字0开头,即以0作为八进制数的前缀,由07的数字组成。 以下各数是合法的八进制常数:以下各数是合法的八进制常数: 015(十进制为13),0101(十进制为65),0177777(十进制为65535) 以下各数不是合法的八进制常数:以下

6、各数不是合法的八进制常数: 255(无前缀0),03B2(包含了非八进制数码B),0129(出现了非八进制数码9) 2.4.1 整型常量整型常量 2.4 常常 量量 3. 十六进制整型常量十六进制整型常量 十六进制整型常量的表示形式以0 x或0X开头,即以0 x或0X作为前缀(注意:十六进制数的前缀字符0 x,x前面是数字0而不是字母o),由数字09、字母AF或af组成。 以下各数是合法的十六进制整型常量:以下各数是合法的十六进制整型常量: 0X2A(十进制为42),0XA0(十进制为160),0XFFFF(十进制为65535) 以下各数不是合法的十六进制整型常量:以下各数不是合法的十六进制整

7、型常量: 5A(无前缀0X),0X3H(含有非十六进制数码H)2.4 常常 量量2.4.1 整型常量整型常量 2.4 常常 量量2.4 常常 量量 在C语言中,实型常量只能用十进制形式表示。它有两种形式:小数形式和指数形式。 1. 小数形式小数形式 由正负号、09的数字和最多一个小数点组成(必须有小数点)。例如,-1.85、0.3456、120.0、.426、-11.都是十进制小数形式实数。小数点前面和后面可以没有数字(不能同时省略)。 2. 指数形式指数形式 由十进制数加上阶码标志e或E以及阶码组成。其一般形式为aEn。 其中a为十进制数,n为十进制整数(n为正数时“+”可以省略),其值为a

8、10n。 例如,1.236e+12表示1.2361012、0.27e-8表示0.2710-8。 2.4.2 实型常量实型常量 2.4 常常 量量 以下是合法的实数:以下是合法的实数: 1.236e12(表示1.2361012),3.5E-2(表示3.510-2), 2.36e+8(表示2.36108) 以下是非法的实数:以下是非法的实数: 569(无小数点),e-5(阶码标志e之前无数字),-5(无阶码标志) 58.+e5(符号位置不对),2.7E(无阶码),6.4e+5.9(阶码为实数)2.4.2 实型常量实型常量 2.4 常常 量量2.4 常常 量量 字符常量是用单引号括起来的一个字符。

9、例如:a、b、=、+、?都是合法字符常量。 在语言中,字符常量有以下特点:在语言中,字符常量有以下特点: (1) 字符常量只能用单引号括起来,不能用双引号或其他括号。 (2) 字符常量只能是单个字符,不能是字符串。 (3) 字符可以是字符集中任意字符。但数字被定义为字符型之后就以ASCII码值参与数值运算。如5和5是不同的常量。5是字符常量,而5是整型常量。2.4.3 字符常量字符常量 2.4 常常 量量 除了以上形式的字符常量以外,C语言还定义了一些特殊的字符常量,是以反斜杠“”开头的字符序列,称为转义字符。 转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。2.4.3 字符常

10、量字符常量 2.4 常常 量量【例2.1】 分析下面程序的运行结果。程序运行结果:程序运行结果: China A 2.4.3 字符常量字符常量 2.4 常常 量量#include /* 程序需要使用程序需要使用C语言提供的标准库函数语言提供的标准库函数 */ void main( ) /* 主函数主函数 */ printf(China n101tn); /* 调用库函数调用库函数printf( )显示字符串显示字符串 */ 2.4 常常 量量在在C语言中,字符串常量是用双引号括起来的字符序列。语言中,字符串常量是用双引号括起来的字符序列。 例如,以下是合法的字符串常量:ChinaThis is

11、 my first C program. 502754 +?ab*“ :表示一个空格串。:表示什么字符也没有的字符串。n:表示一个具有换行功能的字符串。2.4.4 字符串常量字符串常量 2.4 常常 量量字符串常量和字符常量是不同的量。它们之间主要有以下区别:字符串常量和字符常量是不同的量。它们之间主要有以下区别: (1) 字符常量由单引号括起来,字符串常量由双引号括起来。(2) 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。(3) 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。但是可以用一个字符数组来存放一个字符串变量

12、。这将在第6章数组中予以介绍。(4) 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符0 (ASCII码为0)。这是字符串结束的标志。因此,长度为n个字符的字符串常量在内存中要占用n+1个字节的空间。2.4.4 字符串常量字符串常量 2.4 常常 量量 例如,字符串“ C program ”的长度为9(即字符的个数),但在内存中所占的字节数为10,即存放 “ C program0”。其在内存中的存储形式如图所示。 2.4.4 字符串常量字符串常量 2.4 常常 量量 字符常量A与字符串常量“A”虽然都只有一个字符,但在内存中的存储方式是不同

13、的。A在内存中占一个字节,而“A”在内存中占二个字节 2.4 常常 量量2.4.4 字符串常量字符串常量 2.4 常常 量量2.4 常常 量量 在程序中,如果某个常量多次被使用,则可以使用一个符号来代替该在程序中,如果某个常量多次被使用,则可以使用一个符号来代替该常量,这种相应的符号称为符号常量。常量,这种相应的符号称为符号常量。 例如,数学运算中的圆周率常数(3.14159),如果使用一个符号PI来表示,在程序中使用到该常量时,就不必每次输入“3.14159”,可以用PI来代替它。 C语言中,用编译预处理命令#define定义符号常量。 例如:#define PI 3.14159#defin

14、e NUM 45 格式是在#define后面跟一个标识符和一个字符串,之间用空格隔开。它不是C语句,故末尾不加分号。 2.4.5 符号常量符号常量 2.4 常常 量量【例2.2】 编写求一个半径r为3.0的球的体积和表面积的程序。运行结果:运行结果:v=113.097237,s=113.0972402.4.5 符号常量符号常量 2.4 常常 量量#include #include / /* * 程序需要使用程序需要使用C C语言提供的标准函数库语言提供的标准函数库 * */ /#define PI 3.14159#define PI 3.14159 / /* * 定义定义PIPI为符号常量,其

15、值为为符号常量,其值为3.14159 3.14159 * */ /void main( )void main( )/ /* * 主函数主函数 * */ / float float r,v,sr,v,s;/ ;/* * 定义实型变量定义实型变量r r、v v、s s分别表示球的半径、体积和表面积分别表示球的半径、体积和表面积 * */ /r=3.0; r=3.0; / /* * 将将3 3赋值给半径赋值给半径r r * */ /v=4.0/3.0v=4.0/3.0* *PIPI* *r r* *r r* *r; r; / /* * 求球的体积求球的体积v v * */ /s=4.0s=4.0*

16、*PIPI* *r r* *r; r; / /* * 求球的表面积求球的表面积s s * */ /printfprintf(v=%(v=%f,sf,s=%f=%fn,v,sn,v,s); );/ /* * 输出球的体积输出球的体积v v和表面积和表面积s s * */ / 2.5 变变 量量 所谓变量是指在程序运行过程中,其值可以改变的量。所谓变量是指在程序运行过程中,其值可以改变的量。 例如,计算圆周长的C语句:c=2*3.14159*r; c和r都是变量,其中,r可以有不同的值,c的值因r的值不同而不同。 变量的特征变量的特征: 1.它有一个变量名,变量名的命名方式应符合标识符的命名规则。

17、例如,可以用name、sum作为变量名。 2.变量有类型之分,因为不同类型的变量占用的内存单元(字节)数不同,因此每个变量都有一个确定的类型,例如整型变量、实型变量、字符型变量等。 3.变量可以存放值,在C语言中,要求对所有用的变量作强制性定义,也就是“先定义,后使用”,否则,在编译时会指出有关出错信息。 2.5.1 常量的概念常量的概念 2.5 变变 量量2.5 变变 量量 变量名和变量值的区别 在程序运行过程中,从变量x中取值,实际上是通过变量名x找到相应的内存地址,从其存储单元中取出其中的数15。 2.5.1 常量的概念常量的概念 2.5 变变 量量2.5 变变 量量1. 变量的定义变量

18、的定义变量定义的一般格式为:数据类型标识符 变量名1,变量名2,变量名3,变量名变量名n;其中, 表示可选项。例如:int a; /* 定义a为整型变量 */int m,n;/* 定义m和n为整型变量 */float x,y,z; /* 定义x、y、z为单精度实型变量 */char ch;/* 定义ch为字符型变量 */ 2.5.2 变量的定义与初始化变量的定义与初始化 2.5 变变 量量2.5 变变 量量进行变量定义时,应注意以下几点:进行变量定义时,应注意以下几点:(1) 允许在一个数据类型标识符后说明多个相同类型的变量,各变量名之间用逗号隔开。(2) 数据类型标识符与变量名之间至少用一个

19、空格隔开。(3) 最后一个变量名之后必须以分号“;”结尾。(4) 变量说明必须放在变量使用之前,一般放在函数体的开头部分。(5) 在同一个程序中变量不允许重复定义。例如,以下是不合法的定义:int x, y, z; /* 定义x、y、z为整型变量 */int a, b, x; /* 变量x被重复定义 */ 2.5.2 变量的定义与初始化变量的定义与初始化 2.5 变变 量量2.5 变变 量量2. 变量的初始化变量的初始化在定义变量的同时可以给变量赋初值,称为变量初始化。变量初始化的一般格式为:数据类型标识符 变量名1=常量1,变量名2=常量2,变量名n=常量n;例如:int a=3,b=5;/

20、* 定义a和b为整型变量,同时a、b分别赋初值3、5 */float x=0,y=0,z=0;/* 定义x、y、z为单精度实型变量,同时x、y、z都赋初值为0*/char ch=a;/* 定义ch为字符型变量,同时赋初值字符a */ 2.5.2 变量的定义与初始化变量的定义与初始化 2.5 变变 量量2.5 变变 量量 整型变量通常可分为4类:一般整型(int)、短整型(short)、长整型(long)和无符号型(unsigned)。其中,无符号型又有无符号整型(unsigned int)、无符号短整型(unsigned short)和无符号长整型(unsigned long)之分。 2.5.

21、3 整型整型变量变量2.5 变变 量量2.5 变变 量量 实型变量分为单精度型(float)、双精度型(double)和长双精度型(long double)3种。 实型变量类型标识符、内存中所占空间字节数和所表示的数值范围如表所示。 2.5.4 实型实型变量变量2.5 变变 量量【例2.3】 浮点型数据的舍入误差分析。程序运行结果:程序运行结果:a=33333.332031, b=33333.333333 2.5.4 实型实型变量变量2.5 变变 量量#include /* 程序需要使用程序需要使用C语言提供的标准函数库语言提供的标准函数库 */void main( ) /* 主函数主函数 *

22、/float a; /* 定义定义a为单精度实型变量为单精度实型变量 */ double b;/* 定义定义b为双精度实型变量为双精度实型变量 */ a=33333.33333; /* 将将33333.33333赋给单精度实型变量赋给单精度实型变量a */ b=33333.33333333333333; /* 将将33333.33333333333333赋给双精度实型变量赋给双精度实型变量b*/ printf(a=%f,b=%fn,a,b);/* 以实型形式输出以实型形式输出a和和b的值的值 */字符变量用来存放字符常量,注意,只能存放一个字符。字符变量用来存放字符常量,注意,只能存放一个字符

23、。字符变量的类型标识符为char,所占内存空间为1字节,取值范围为-128127。例如:char c1,c2,c3,c4;c1=a;/* 正确 */c2=6;/* 正确 */c3=a; /* 不正确 */c4=abc; /* 不正确 */2.5.5 字符字符变量变量2.5 变变 量量1. 字符型数据在内存中的存放形式字符型数据在内存中的存放形式 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应ASC码存放到存储单元中。例如:char c1,c2;c1=a;c2=b;字符a的ASC代码为十进制数97,字符b的ASC代码为十进制数98,在内存中变量c1

24、、c2的值实际上是以二进制形式存放的,如图所示。 2.5.5 字符字符变量变量2.5 变变 量量 2. 字符型数据的使用字符型数据的使用 字符型和整型在一定范围内是通用的,字符型数据可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,先将内存中ASC码转换成对应的字符,再输出。以整数形式输出时,则直接将ASC码作为整数输出。字符型数据还可以参加算术运算,此时相当于对它们的ASC码值进行算术 运算。2.5.5 字符字符变量变量2.5 变变 量量【例2.4】 向字符变量赋以整数。运行结果:运行结果:A C65 672.5.5 字符字符变量变量2.5 变变 量量#include /* 程序需

25、要使用程序需要使用C语言提供的标准库函数语言提供的标准库函数 */void main( ) /* 主函数主函数 */char c1,c2; /* 定义定义c1、c2为字符型变量为字符型变量 */c1=65; /* 将整数将整数65赋给赋给c1 */c2=67; /* 将整数将整数67赋给赋给c2 */printf(%c %cn,c1,c2);/*以字符形式输出以字符形式输出c1和和c2的值的值 */printf(%d %dn,c1,c2); /* 以整数形式输出以整数形式输出c1和和c2的值的值 */【例2.5】 字符型和整型的相互赋值。运行结果:运行结果:98,b66,B2.5.5 字符字符

26、变量变量2.5 变变 量量#include #include / /* * 程序需要使用程序需要使用C C语言提供的标准库函数语言提供的标准库函数 * */ /void main( )void main( )/ /* * 主函数主函数 * */ / int k; int k; / /* * 定义定义k k为整型变量为整型变量 * */ /char ch;char ch;/ /* * 定义定义chch为字符型变量为字符型变量 * */ /k=b;k=b; / /* * 将字符将字符bb赋给整型变量赋给整型变量k k * */ /ch=66;ch=66; / /* * 将整数将整数6666赋给字符

27、变量赋给字符变量ch ch * */ /printf(%d, %cn,k,k);printf(%d, %cn,k,k);/ /* * 分别以整数和字符形式输出分别以整数和字符形式输出k k的值的值* */ /printf(%d, %cn,ch,ch);printf(%d, %cn,ch,ch);/ /* * 分别以整数和字符形式输出分别以整数和字符形式输出chch的值的值* */ / 运算是对数据进行加工处理,用来表示各种运算的符号称为“运算符”。 按运算符功能大致可以分为算术运算符、关系运算符、逻辑运算符、位运算符和C语言的特殊运算符等5类。 运算符按其运算对象的多少可以分为单目运算符(仅对

28、一个运算对象进行操作)、双目运算符(对两个运算对象进行操作)和三目运算符(对三个运算对象进行操作)3类。 2.6.1 运算符运算符 2.6 C语言的运算符和表达式概述语言的运算符和表达式概述 用运算符和圆括号把运算对象连接起来的、符合用运算符和圆括号把运算对象连接起来的、符合C语言语法规则的式语言语法规则的式子,称为表达式。子,称为表达式。 表达式d/(3*a+b)-6*c中包括+、-、*、/、()等运算符号,运算对象包括a、b、c、d、3、6等。表达式2+cos(0)中包括+运算符号,运算对象包括2和cos(0)。 对表达式进行运算所得到的结果,称为表达式的值。例如,表达式2+cos(0)的

29、值为3。2.6.2 表达式表达式 2.6 C语言的运算符和表达式概述语言的运算符和表达式概述 运算符的优先级:运算符的优先级: 指多个运算符用在同一个表达式中时先进行什么运算,后进行什么运算,即如果在同一个表达式中出现了不同级别的运算符,首先计算优先级较高的。 运算符的结合性;运算符的结合性; 是指运算符所需要的数据是从其左边开始取还是从右边开始取。即结合性是指在表达式中若连续出现若干个优先级相同的运算符时,各运算的运算次序。因而在C语言中有所谓“左结合性”和“右结合性”之说。 2.6.3 运算符的优先级和结合性运算符的优先级和结合性 2.6 C语言的运算符和表达式概述语言的运算符和表达式概述

30、1. 基本算术运算符及其表达式基本算术运算符及其表达式(1) 基本算术运算符基本算术运算符+,加法运算符,或正值运算符,如3+5、+3。-,减法运算符,或负值运算符,如5-2,、-3。*,乘法运算符,如3*5。/,除法运算符,如5/3。%,模余运算符,或称求余运算符,要求%两侧均为整型数据,如7%4的值为3。 2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 (2) 优先级 上面5种运算符,都是双目运算符(除正号运算符和负号运算符),其优先级从高到低为: *、/、% +、- 乘法、除法和求余3项运算优先级相同; 加法、减法两

31、项运算优先级相同。 (3) 结合性 结合性为自左至右。 2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 【例2.6】 设变量x、y的值分别为12.2和52.6,求算术表达式(x+y)/2-31的值。 表达式中包括+、-、/等运算符,操作数包括x、y、2、31等,按照括号优先,先计算x+y,得和64.8,再计算64.8/2,得商32.4,最后计算32.4-31,运算结果为1.4,表达式(x+y)/2-31的值为1.4。2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算

32、符和表达式(4) 基本算术运算符及其表达式的说明和注意事项基本算术运算符及其表达式的说明和注意事项表达式中凡是相乘的地方必须写上“*”,不能省略,也不能用点代替;表达式中出现的括号一律使用圆括号,而且为保持运算顺序正确性,根据需要适当添加圆括号。例如,数学式,写成C语言表达式为:(2.0+a+b)/(a*b)不能写为:2.0+a+b/a*b或(2.0+a+b)/ab或(2.0+a+b)/a*b。数学中有些常用的计算可以用C系统提供的标准数学库函数实现。值得注意的是,函数的自变量(即函数的参数)必须写在圆括号内(常用数学函数参见附录B)。例如,求x的平方根的函数为sqrt(x),求xy的函数为p

33、ow(x, y)。一般情况下,求x2写为x*x的连乘形式。例如,数学式x=和(2r+e)lnx,写成C语言表达式分别为:x=(-b+sqrt(b*b-4*a*c)/(2*a)(2*3.14159*r+exp(-3)*log(x) 2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 除法运算符“/”的运算对象可以是各种类型的数据,但是当进行两个整型数据相除时,运算结果也是整型数据,即只取商的整数部分;而操作数中有一个为实型数据时,则结果为双精度实型数据。 例如,5.0/10的运算结果为0.5,5/10的运算结果为0(而不是0.5

34、),10/4的运算结果为2(而不是2.5)。 求余数运算符“%”仅用于整型数据,不能用于实型。它的作用是取整数除法的余数。 例如,1%2的结果是1,10%3的结果也是1。而1%2.0或10.0%3不是合法的表达式,运行时会出错。2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2. 自增与自减运算符及其表达式自增与自减运算符及其表达式(1) 自增、自减运算符 自增(+)和自减(- -)运算符都是单目运算符,它们的操作对象只有一个且只能是简单变量,其作用是使变量的值增1或减1。它们既可以作为前缀运算符,如+i和-i;也可以作为后

35、缀运算符,如i+和i- -。作为前缀和后缀运算符的区分,主要表现在对变量值的使用。前缀形式:+i、-i,它的功能是在使用i之前,i值先加(减)1(即先执行i+1或i-1,然后再使用i值) 2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式后缀形式:i+、i-,它的功能是在使用i之后,i值再加(减)1(即先使用i值,然后再执行i+1或i-1)。例如,j=3时:k=+j; /* 赋值时,j先增1,再将j值赋给k,结果k=4,j=4 */k=j+; /* 赋值时,j值先赋给k,然后j再增1,结果k=3,j=4 */k=-j;/* 赋

36、值时,j先减一,再将j值赋给k,结果k=2,j=2 */k=j-;/* 赋值时,j值先赋给k,然后j再减1,结果k=3,j=2 */2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 (2) 优先级优先级 自增、自减运算符的优先级高于基本算术运算符。 (3) 结合性结合性 自增、自减运算符的结合性为自右向左,具有右结合性。 例如,求表达式-a+的值时,由于“-”和“+”的运算优先级相同,且都是右结合,因此它等价于表达式-(a+)。假设a的原值是5,计算时要先计算a+,由于是后缀自增,所以取a的原值5作为表达式a+的值,再对该值

37、进行求负运算,得到-5,之后a自增为6。 2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 (4) 自增、自减运算符及其表达式的说明和注意事项自增、自减运算符及其表达式的说明和注意事项 自增、自减运算符的对象只能是简单变量,不能是常量或带有运算符的表达式。 例如,6-、+(a+b)、+(-i)等都是错误的。 表达式中如果有多个运算符连续出现时,C编译系统尽可能多地从左到右将字符组合成一个运算符。 例如,i+j等价于(i+)+j,-i+-j等价于-(i+)+(-j)。为了增加可读性,应该采用后面的写法,在必要的地方添加圆括号,

38、但建议大家尽量不要使用。 自增、自减运算可以提高程序的执行效率,速度快。因为+i运算只需要一条机器指令就可完成,而i=i+1则要对应3条机器指令。2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 【例2.7】 假设变量i、j、k的值分别为3、5和3,求表达式m=(+k)*j和n=(i+)*j中m和n的值。 在计算m=(+k)*j时,k首先增1变为4,然后与j相乘,即m=(+k)*j=4*5=20;最后将20赋值给m。在计算n=(i+)*j时,由于对i实施的是后缀自增,因此,i是用3的值参与乘运算,即n=(i+)*j=3*5=

39、15。在参与乘操作之后,i才增1变成4;最后赋值给n的值是15。 2.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式【例2.8】 自增、自减运算应用举例。程序运行结果:程序运行结果:9 8 89 -8 -92.7.1算术运算符和算术表达式算术运算符和算术表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式#include /* 程序需要使用程序需要使用C语言提供的标准函数库语言提供的标准函数库 */void main( )/* 主函数主函数 */ int i=8;/* 定义定义i为整型变量,并将其初始化为为整

40、型变量,并将其初始化为8 */printf(%dn,+i); /* i自增自增1后再参加输出运算后再参加输出运算 */printf(%dn -i); /* i自减自减1后再参加输出运算后再参加输出运算*/printf(%dn ,i+);/* i参与输出运算后,参与输出运算后,i的值再自增的值再自增1 */printf(%dn ,i-); /* i参与输出运算后,参与输出运算后,i的值再自减的值再自减1 */printf(%dn ,-i+);/* 按照结合性按照结合性-i+相当于相当于-(i+) */printf( %dn ,-i-);/* 按照结合性按照结合性-i-相当于相当于-(i-)*/

41、1. 基本赋值运算符及其表达式 (1) 基本赋值运算符基本赋值运算符 赋值符号“=”就是基本赋值运算符。 (2) 基本赋值表达式基本赋值表达式 由基本赋值运算符和圆括号将运算对象连接的符合语言语法规则的式子,称为基本赋值表达式。其一般形式为: 变量变量 基本赋值运算符基本赋值运算符 表达式表达式 赋值运算符的作用是赋值运算符的作用是,首先计算表达式的值,然后将该值赋值给等号左边的变量,实际上是将表达式的值存放到左边变量的存储单元中。基本赋值表达式的值,也就是基本赋值运算符左边变量得到的值。例如,表达式x=3*5+35的作用是将3*5+35的计算结果50,赋值给变量x,变量x的值为50,表达式的

42、值为50。 2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(3) 优先级优先级赋值运算符的优先级仅仅高于逗号运算符。(4) 结合性结合性赋值运算符有自右向左的结合性。2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 【例2.9】 已知“int a=2,b=5”,求解表达式x=y=a+b的值。 由于算术运算符的优先级高于赋值运算符,先计算表达式a+b,结果为7。按照赋值运算的结合方向自右向左结合,求解表达式x=y=a+b的值,等价于求解表达式x=(y=a+

43、b)的值。操作数y是先与右边的运算符结合,即先将7赋值给变量y,变量y的值是7,表达式y=7的值是7。 再做左边赋值运算,即将表达式y=7的值7,赋值给变量x,变量x的值是7,最后得到表达式x=y=7的值是7。 2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 【例2.10】 设变量a、b、c均为整型变量,求表达式a=(b=65)/(c=6)的值。 按照括号优先,先求解表达式b=65,结果为65;再求解表达式c=6,结果为6;再进行除法运算65/6,结果为10;最后将10赋值给变量a,得到表达式a=(b=65)/(c=6)的

44、值是10。 2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(5) 基本赋值运算符及其表达式的说明和注意事项基本赋值运算符及其表达式的说明和注意事项赋值运算符“=”的左侧只能是变量,不能是常量或表达式,而右侧可以是常量、赋过值的变量或表达式。 例如,以下是不合法的或有逻辑错误的赋值表达式: 12=a/* 赋值运算符“=”的左侧是常量 */ 2*a=3*5+55/* 赋值运算符“=”的左侧是表达式 */ x=b/*赋值运算符“=”的右侧是没有赋过值的变量 */当赋值运算符两边的类型不一致时,要进行类型转换。 实型数据(floa

45、t或double型)赋值给整型变量时,舍去小数部分。例如,int k=5.78;则k的值为5。整型数据赋值给实型变量时,数值不变,以实数形式存储到变量中。例如,float x=2;则x=2.0。2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2. 算术复合赋值运算符及其表达式(1) 算术复合赋值运算符算术复合赋值运算符在基本赋值运算符(=)前面加上基本算术运算符(+、-、*、/、%),就构成了算术复合赋值运算符。C语言规定的算术复合赋值运算符有+=、-=、*=、/=、%=5种。(2) 算术赋值表达式算术赋值表达式由算术复合赋

46、值运算符和圆括号将运算符对象连接的符合C语言语法规则的式子,称为算术赋值表达式。其一般形式为:变量 算术复合赋值运算符 表达式例如:a+=b/* 等价于a=a+b */a/=b/* 等价于a=a/b */a-=b+4/* 等价于a=a-(b+4) */x*=y+7/* 等价于x=x*(y+7) */(3) 优先级与结合性优先级与结合性算术复合赋值运算符的优先级、结合性与基本赋值运算符相同。2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式【例2.11】 已知“int a=6,b=8”,求解表达式a*=b+=12的值。求解表达式

47、a*=b+=12的值,等价于求解表达式a=a*(b+=12);先求解表达式b+=12的值,等价于求解表达式b=b+12的值,先将b+12的值赋值给变量b,变量b的值是20,得到表达式b=b+12的值是20。再求解a=a*20,即将6*20的值120赋值给变量a。变量a的值为120,得到表达式a*=b+=12的值是120。 【例2.12】 已知“int a=10”,求解表达式a+=3+(a%=1+a/2)的值。按照算术复合赋值运算符及其表达式的结合方向自右向左结合,将表达式a+=3+(a%=1+a/2)分解为求解表达式a%=1+a/2和a+=3+a,等价于求解表达式a=a%(1+a/2)和a=a

48、+(3+a);先计算表达式a=a%(1+a/2)的值,得到结果为4,即a=4,从而得到表达式a=a+(3+a)的值为11。2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(4) 算术复合赋值运算符及其表达式的说明和注意事项算术复合赋值运算符及其表达式的说明和注意事项如果基本赋值运算符(=)右边是一个表达式,在进行等价处理时,应加上括号。例如,表达式y*=x+6等价于表达式y=y*(x+6),而不等价于表达式y=y*x+6。算术复合赋值运算符这种写法,对初学者可能不习惯,但十分有利于编译处理,能提高编译效率并产生质量较高的目标

49、代码。 2.7.2赋值运算符和赋值表达式赋值运算符和赋值表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(1) 关系运算符关系运算符 关系运算符是对两个操作数进行大小比较的运算符,C语言提供了以下6种关系运算符: (大于),=(大于等于),(小于),c+d xa+b 关系表达式的值为逻辑值,即“真”或“假”。C语言中没有逻辑型数据,以1表示“真”,0表示“假”。例如,a=1,b=2,c=3,d=4,则: a(c+d)/* 表达式的值为“假”,即为0 */ a-b=d-c/* 表达式的值为“假”,即为0 */ a、=、=优先级相同;= =、!=优先级相同,但低于前4种。与算

50、术运算符和赋值运算符相比,关系运算符的优先级低于算术运算符,而高于赋值运算符。即运算次序为算术运算符关系运算符赋值运算符。关系运算符都是双目运算符,其结合性均为从左向右结合。2.7.3 关系运算符和关系表达式关系运算符和关系表达式 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 【例2.13】 已知“int i=1,j=2,k=3”,求解关系表达式k= =j= =i+5的值。 对于关系表达式k= =j= =i+5,根据关系运算符从左向右的结合性,先计算k= =j,该式不成立,其值为0;再计算0= =i+5,也不成立,故整个表达式的值为0。 【例2.14】 已知“int a=20

51、,b=70,c=50,d=90”,在表达式k=a+bc+d中,求k的值。 表达式k=a+bc+d,等价于表达式k=(a+b)(c+d),即k=(90140);根据优先级先计算(90 x0,表示x的值小于6,大于0(在06之间);而关系表达式6x0,根据左结合性,表示6与x的比较结果(不是1就是0)再与0比较(假设x=4,则对6x0,先计算64,表达式的值为真,即为1,接着再来计算10,表达式的值也为真,即为1,故整个表达式的值为1)。 应避免对实数做相等或不等的判断,因为实数在内存中存放时有一定的误差。如果一定要进行比较,则可以用它们的差的绝对值去与一个很小的数(例如10-5)相比,即fabs

52、(x-y)b)(a= =b) & (a1)(a7) 逻辑表达式的值只有真和假两个值。当逻辑表达式的值为真时,用数值1作为表达式的值;逻辑表达式的值为假时,用数值0作为表达式的值。当判断一个逻辑表达式的结果时,如逻辑表达式的整体值为非0,表示为真;如逻辑表达式的整体值为0,表示为假。 2.7.4 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(3) 逻辑运算符的优先级逻辑运算符的优先级三种逻辑运算符的优先级由高到低依次为:! & |逻辑运算符与其他运算符的优先级次序如下:! 算术运算符 关系运算符 & | 赋值运

53、算符 逗号运算符(4) 逻辑运算逻辑运算符的结合性符的结合性逻辑运算符的结合性:&和|均为双目运算符,具有左结合性;!为单目运算符,具有右结合性。2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7.4 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 【例2.15】 已知“int a=5,b=60”,计算表达式a%2= =0&b%2!=0的值。 根据优先级和结合性,计算表达式a%2=0&b%2!=0的值,相当于计算表达式(a%2= =0)&(b%2!=0)的值。关系运算a%2=0的结果为

54、0,得表达式0&(b%2!=0),0与任何值进行逻辑&运算结果却为0,则整个表达式的计算结果为0。 【例2.16】 计算表达式53&a|53&a|53)& a|(53)&a|(53)&a|(53的结果为1。得表达式1&a|(5b&cd的值。 计算表达式ab&cd的值,相当于计算表达式(ab)&(cd)的值。对于ab,其值为0,即逻辑与运算符“&”前面的表达式被判定为“假”,所以不再对其后的表达式求解,整个表达式的值为0。2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7.4 逻辑运

55、算符和逻辑表达式逻辑运算符和逻辑表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(1) 条件运算符条件运算符 条件运算符由问号“?”和冒号“:”两个字符组成,用于连接3个运算对象,是C语言中唯一的一个三目运算符。(2) 条件表达式条件表达式 用条件运算符和圆括号将运算对象连接构成的式子称为条件表达式。 其一般形式为: 表达式1?表达式2:表达式3 条件表达式的值及其运算规则:条件表达式的值及其运算规则:先求解表达式1的值,若表达式1的值非0(真),则表达式2的值为整个条件表达式的值;否则,表达式3的值为整个条件表

56、达式的值。条件表达式的执行流程如图所示。 2.7.5 条件运算符和条件表达式条件运算符和条件表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7.5 条件运算符和条件表达式条件运算符和条件表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(3) 优先级优先级 条件运算符与其他运算符的优先次序如下: 单目运算符算术运算符关系运算符逻辑运算符条件运算符赋值运算符逗号运算符 说明如下:说明如下: 条件运算符的优先级高于逗号运算符和赋值运算符。 对于“x=ab?a:b;”,赋值号右边不必加小括号,因为

57、“?:”的优先级高于“=”。 条件运算符的优先级低于算术运算符和比较运算符。 对于“x=a-3b+2?a+1:b-3;”也不必加小括号,运算符的运算顺序为a-3、 b+2、a+1、b-3、“”、“?:”、“=”。 条件表达式中的表达式类型可以不一样。 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7.5 条件运算符和条件表达式条件运算符和条件表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(4) 结合性结合性条件运算符的结合性为自右至左。例如,以下语句是正确的:xy?3:1.24; 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7.5

58、 条件运算符和条件表达式条件运算符和条件表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 【例2.18】 设整型变量a=1、b=2、c=3、d=4、m=1、n=1,表达式a+d= =b+c?m=ab:n=cd和a+d!=b+c?m=ab:n=cd经过计算之后,m和n的值有无变化? 计算表达式a+d=b+c?m=ab:n=cd的值,相当于计算表达式(a+d= =b+c)?(m=ab): (n=cd)的值。因表达式(a+d=b+c),其值为真,所以表达式(a+d=b+c)?(m=ab):(n=cd)的值为(m=ab)

59、,对于ab,其值为0,所以m的值为0,整个表达式的值为0。表达式(n=cd)没有被计算,n的值仍为1。 计算表达式a+d!=b+c?m=ab:n=cd的值,相当于计算表达式(a+d!=b+c)?(m=ab):(n=cd)的值。因表达式(a+d!=b+c),其值为假,所以表达式(a+d!=b+c)?(m=ab):(n=cd)的值为(n=cd),对于cd,其值为0,所以n的值为0,整个表达式的值为0。表达式(m=ab)没有被计算,m的值仍为1。 2.7.5 条件运算符和条件表达式条件运算符和条件表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式(5) 条件运算表达式的说明和注意事

60、项条件运算表达式的说明和注意事项 条件运算表达式可以嵌套。 【例2.19】 假设有整型变量a=1、b=2和x,计算表达式ab?(x=6):(x=7)的值。 条件运算符的结合性是从右至左,但是计算条件表达式时系统还是按照从左向右的顺序来计算,本例中先判断ab,因表达式ab?(x=6):(x=7)将不予计算,故整个表达式的值为5。 2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式2.7.5 条件运算符和条件表达式条件运算符和条件表达式2.7 C语言中基本的运算符和表达式语言中基本的运算符和表达式 条件表达式中,表达式1、表达式2和表达式3的类型可以不一致,条件表达式值取较高的类型。 例如,条件表达式ab?1.5:2的值的类型是双精度实型(即若ab,则表达式的值为1.5,否则其值为实型2.0,因为在ab?1:1.5中最高类型为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论