




已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章 数据类型、运算符与表达式,2.1 C语言的基本数据类型,C语言提供的数据结构,是以数据类型形式出现的。具体 分类如下: 1.基本类型 分为整型、实型(又称浮点型)、字符型和枚举型四种。 2.构造类型 分为数组类型、结构类型和共用类型三种。 3.指针类型。在第10章中介绍。 4.空类型 C语言中的数据,有常量和变量之分,它们分别属于上述这些类型。 本章将介绍基本类型中的整型、实型和字符型三种数据。,C语言提供了以下一些数据类型,数据类型,构造类型,指针类型,空类型(无值类型) void,1、基本数据类型:基本数据类型最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。 2、构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在C语言中,构造类型有以下几种: 数组类型 结构体类型 共用体(联合)类型 指针类型:指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。 空类型:在调用函数值时,通常应向调用者返回一个函数值。,2.2 常量,常量的概念 在程序运行过程中,其值不能被改变的量称为常量, 常量可以从字面形式即可判断-字面常量或直接常量。 常量的分类 (1)整型常量(如12、0、-3为整型常量) (2)实型常量(4.6、-1.23为实型常量) (3)字符常量( a、d字符常量) (4)符号常量。,2.2.1 整型常量,在C语言中,整型常量可以用三种形式来表示,1、八进制整常数 八进制整常数必须以0开头,即以0作为八进制数的前缀。 数码取值为07。八进制数通常是无符号数。 以下各数是合法的八进制数: 015(十进制为13) 0101(十进制为65) 以下各数不是合法的八进制数: 256(无前缀0) 03A2(包含了非八进制数码) -0127(出现了负号) 2、十六进制整常数 十六进制整常数的前缀为0X或0x。其数码取值为09,AF或af。 以下各数是合法的十六进制整常数: 0X2A(十进制为42) 0XA0 (十进制为160) 以下各数不是合法的十六进制整常数: 5A (无前缀0X) 0X3H (含有非十六进制数码),3、十进制整常数 十进制整常数没有前缀。其数码为09。 以下各数是合法的十进制整常数:237,-568 ,65535 4、整型常数的后缀 在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为065535,有符号数为-32768+32767。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。例如: 十进制长整常数 158L (十进制为158) 358000L (十进制为-358000) 八进制长整常数 012L (十进制为10) 077L (十进制为63) 0200000L (十进制为65536) 十六进制长整常数 0X15L (十进制为21) 0XA5L (十进制为165) 0X10000L (十进制为65536,2.2.2 实型常量,在C语言中,实型常量只采用十进制表示。有小数形式和指数形式两种表示方式。 1.小数形式 由数码0 9和小数点组成。 例如: 0.0、25.0、5.789、0.13、5.0、300.、-267.8230 等均为合法的实数。注意,必须有小数点。 2.指数形式 由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。 其一般形式为: a E n(a为十进制数,n为十进制整数) 其值为 a*10n。如:2.1E5 (等于2.1*105),以下不是合法的实数: 345 (无小数点) E7 (阶码标志E之前无数字) -5 (无阶码标志) 53.-E3 (负号位置不对) 2.7E (无阶码) 注意:标准允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如356f和356是等价的。,2.2.3 字符常量,1. 字符常量 字符常量是用单引号括起来的一个字符。 例如: a、b、=、+、? 都是合法字符常量。 在语言中,字符常量有以下特点: 字符常量只能用单引号括起来,不能用双引号或其它括号。 字符常量只能是单个字符,不能是字符串。 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如5和5 是不同的。5是字符常量,不能参与运算。,2.转义字符 C语言还允许用一种特殊的字符常量,即以开头,后跟一个或几个字符的转义字符。由于转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例中出现的printf函数的格式串中用到的”n就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。 常用的转义字符及其含义见表2-1。,表中可以表示任何可输出的字母字符、专用字符、图形字符和控制字符, ddd和Xhh正是为此而提出的。 ddd和 Xhh分别为八进制和十六进制的 ASCll代码。如 101表示ASCll值为65的字符A,102表示字符B,134表示反斜线,XO A表示换行等。,例 21转义字符的使用,main() int a,b,c; a=1; b=2; c=3; printf(“%dnt%d %dn%d %dtb%dn“,a,b,c,a,b,c); ,运行结果,程序在第一列输出a值1之后就是“n”,故回车换行;接着是“t”,于是跳到下一制表位置(设制表位置间隔为 8),再输出 b值 2;空二格再输出 c值 3后又是“ n”,因此再回车换行;再空二格之后又输出 a值 1;再空三格又输出b的值 2;此后“ t”跳到下一制表位置,但下一转义字符“b”又使退回一格,故不输出2而输出C值3。,2.2.4 字符串常量,字符串常量是由一对双引号括起的字符序列。例如: “CHINA“ ,“C program.“ , “$12.5“ 等都是合法的字符串常量。字符串常量和字符常量是不同的量。它们之间主要有以下区别: 字符常量由单引号括起来,字符串常量由双引号括起来。 字符常量只能是单个字符,字符串常量则可以含零个或多个字符。,2.2.5 符号常量,符号常量: 可以使用一个符号表示一个多次常用的常量 C 语言中使用命令#define来定义: 格式: #define 符号常量名标识符 常数表达式 优点: 符号常量使程序易于阅读和修改。 例如,一个程序中多处用到学生人数60,当有学生人数改变为65,修改这个程序很困难。而使用符号常量,只要将 #define NUM 60 改为 #define NUM 65,就可以了。,无分号,例2-2:求一个半径为r的球的体积和表面积的C程序 #define PI 3.14159 /* 定义PI为符号常量,值为3.1415 */ void main( ) float v,s,r; scanf(“%f”, ,说明: (1)符号常量名常常用大写字母、变量名用小写字母。 (2)符号常量不能在其作用域范围内重新赋值。,有关符号常量的几点说明: 1)符号常量标识符:按C语言标识符的命名规则。为便于与一般变量区别,符号常量标识符名通常采用大写字母。 2)宏定义不是C语句,不必在行末加分号。如果加分号,会把分号当作符号串的一部分。 3)宏定义中的常数表达式可以是:值常量、在此前已声明过的符号常量、由这些常量与运算符组成的表达式。 例如, #define PI 3.1515926535 #define PI2 2*PI /* 定义PI2符号常量,值为2*3.1415926535 */,2.3 变量,变量:在程序执行过程中,取值可以改变的量称为变量。 给变量所取的名字称为变量名,给变量取名时要遵循标识符的命名规则。 C语言规定,标识符只能是由字母(AZ,az、数字(09)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线。 C语言的标识符可以分为三类: (1)关键字(32个) auto break case char const continue default do doudle else enum extern float for goto if int long register return short signed slzeof static struct swltch typedef union unsigned vold volatile while 它们是有特殊含义的英文单词,不允许作为用户自定义标识符使用,关键字主要用于构成语句、进行存储类型和数据类型的定义。 注意:C语言中,所有的关键字均为小写。并且用户不能用它们作为自定义标识符,(2)预定义的标识符 预定义的标识符在C语言中都有特殊含义,如 scanf和 printf是库函数名,系统中用来作为输入输出函数。用户一般不要用它们作为自定义标识符。 (3)用户自定义标识符 在程序中使用的变量名、符号常量名、函数名、数组名、类型名、文件名、标号名等有效的字符序列,除库函数的函数名、关键字由系统定义外,其余都由用户自定义,统称为用户自定义标识符。 例如: total,area,_ab,sum,average,student_name,等都是合法的标识符。 标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,做到“见名知义”。 变量名要用小写字母,符号常量名要用大写字母。即在标识符中,大小写是有区别的。例如:A和a是两个不同的标识符。,变量的数据类型是由其值决定的,可分为整型变量、实型变量、字符变量等。下面要具体讲到不同数据类型的变量。 C语言规定:变量都必须先说明后使用。只有这样,编译时才能为其分配相应的存储单元,也才能以此来检查变量所进行的运算是否合法。,2.3.1 整型变量,1.整型变量的分类 基本整型:类型说明符为int,在内存中占2个字节,其取值为基本整常数。 短整量:类型说明符为 short int或short。所占字节和取值范围均与基本整型相同。 长整型:类型说明符为 long int或 long,在内存中占 4个字节,其取值为长整常数。 无符号型:类型说明符为unsigned无符号型又可与上述3种类型匹配而构成无符号基本整型、无符号短整型、无符号长整型,,ANSI C标准没有具体规定以上各类数据所占内存的字节数而是由各计算机系统自行决定。 Turbo C中,int型和short型数据都是2个字节,即16个二进制位。long型数据是4个字节,32位。而VC+则给short型数据分配2个字节,16位,int和long型数据都是4个字节,32位 。,2整型变量的说明,变量说明的格式为: 类型说明符变量名标识符,变量名标识符,; 例如: int a,b,c;(a,b,c为整型变量) long x,y;(x,y为长整型变量) unsigned p,q; ( p,q为无符号整型变量) short i;(i为短整型变量),在书写变量说明时,应注意以下几点: 允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 最后一个变量名之后必须以“;”号结尾。 变量说明必须放在变量使用之前。一般放在函数体的开头部分。,例2.1 整型变量的定义与使用,#include void main() int a,b,c,d; /*指定、为整型变量*/ unsigned u; /*指定为无符号整型变量*/ a=12;b=24;u=10; c=a+u;d=b+u; printf(“a+u=%d,b+u=%dn“,c,d); ,运行结果,2.3.2 实型变量,实型变量分为两类:单精度型和双精度型,其类型说明符分别为float(单精度说明符)和double(双精度说明符)。在Turbo C中单精度型占 4个字节(32位)内存空间,其数值范围为3 4E 383 4E 38,只能提供 7位有效数字。双精度型占 8个字节(64位)内存空间,其数值范围为 17E 308 17E 308,可提供 16位有效数字。 实型变量说明的格式和书写规则与整型相同,只是类型说明符不同而已。实型数均为有 符号实型数,没有无符号实型数。 例如: float x, y,z;(x,y,z为单精度实型量) double a,b,c;(a,b,c为观精度实型量) 实型常数不分单、双精度,都按双精度double型处理。,例23float和double的应用。,main() float a; double b; a=5555.55555; b=5555.5555555555; printf(“%fn%fn“,a,b); ,运行结果,从本例可以看出,由于a是单精度型,有效位数只有7位。而整数已占4位,故小数3位之后均为无效数字。b是双精度型,有效位为16位。但Turbo C默认格式输出浮点数时,规定小数后最多保留6位,其余部分四舍五人。,2.3.3 字符型变量,字符型变量用来存放字符常量,即单个字符。不能存放字符串。 字符型变量的类型说明符是char。字符变量类型说明的格式和书写规则都与整型变量相同。 例如: char cl,c2; c1,c2被说明为字符型变量。系统给每个字符变量分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCll码的形式存放在变量的内存单元之中的。如果对字符变量cl,c2赋予A和B值: c1A;c2B; 由于字符A的十进制ASCll码是65字符B的十进制ASCll码是66。下面是c1、c2字符变量在内存中的存储,c1,c2,例 2-4整型量与字符型量的混合使用,main() char c1, c2,c3,c4; c1=65;c2=66; c3=A;c4=B; printf(“%c,%cn%d,%dn“,c1,c2,c3,c4); ,本程序中c1,c2,c2,c4为字符型变量,但在赋值语句中赋以整型值。从结果看c1,c2,c3,c4值的输出形式取决于printf函数格式串中的格式符,当格式符为%c时,对应输出的变量值为字符,当格式符为%d时,对应输出的变量值为整数。C语言中,整型量与字符型量是通用的,但是应注意字符数据只占一个字节,用char来说明的字符变量只能存放-128127范围内的带符号整数。单字节无符号整型量可以用unsigned char来说明,表示数据的范围为0255。,例2.5 大小写字母的转换 #include void main() char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; printf(“c c,c1,c2); ,说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。从代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。语言允许字符数据与整数直接进行算术运算。,运行结果: ,字符串常量 字符串常量是一对双撇号括起来的字符序列. 合法的字符串常量: “How do you do.”, “CHINA”, “a” , “$123.45” 可以输出一个字符串,如 printf(“How do you do.”);,是字符常量, “a”是字符串常量,二者不 同。 如:假设被指定为字符变量 :char c,c= a; “a” ;c “CHINA”;,结论:不能把一个字符串常量赋给一个字符变量。,规定:在每一个字符串常量的结尾加一个 “字符 串结束标志”,以便系统据此判断字符串是否结束。 规定以字符作为字符串结束标志。,如:如果有一个字符串常量” ,实际上在内存中是:,它占内存单元不是个字符,而是个字符,最后一个字符为。但在输出时不输出。,综上所述,字符常量A与字符串常量“A“是两回事: (1)定界符不同:字符常量使用单引号,而字符串常量使用双引号; (2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 (3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。 (4)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节存放字符0(ASCII值为0),这是字符串的结束标志。,一. 在语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。 如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,转换的方法有两种:自动转换(隐式转换);强制转换。 1、自动转换(隐式转换) 自动转换发生在不同类型数据进行混合运算时,由编译系统自动完成。转换规则:(参看下页图示) (1) 类型不同,先转换为同一类型,然后进行运算。 (2)图中纵向的箭头表示当运算对象为不同类型时转换的方向。可以看到箭头由低级别数据类型指向高级别数据类型,即数据总是由低级别向高级别转换。即按数据长度增加的方向进行,保证精度不降低。,(3)图中横向向左的箭头表示必定的转换(不必考虑其它运算对象)。如字符数据参与运算必定转化为整数,float型数据在运算时一律先转换为双精度型,以提高运算精度(即使是两个float型数据相加,也先都转换为double型,然后再相加)。 (4)赋值运算,如果赋值号“=”两边的数据类型不同,赋值号右边的类型转换为左边的类型。这种转换是截断型的转换,不会四舍五入。L9.c,2、强制转换 强制转换是通过类型转换运算符来实现。 一般形式:(类型说明符)表达式 功能:把表达式的结果强制转换为类型说明符所表示的类型。 例如: (int)a 将a的结果强制转换为整型量。 (int)(x+y) 将x+y的结果强制转换为整型量。 (float)a+b 将a的内容强制转换为浮点数,再与b相加 说明: (1)类型说明和表达式都需要加括号(单个变量可以不加括号) (2)无论隐式转换,强制转换都是临时转换,不改变数据本身的类型和值。,L10.c:强制类型转换 main() float f=5.75; printf(“(int)f=%dn“,(int)f); /* 将f的结果强制转换为整型,输出 */ printf(“f=%fn“,f); /* 输出f的值 */ 结果: (int)f=5 f=5.750000,1 C运算符简介 运算符:狭义的运算符是表示各种运算的符号。 C语言运算符丰富,范围很宽,把除了控制语句和输入/输出以外的几乎所有的基本操作都作为运算符处理,所以C语言运算符可以看作是操作符。C语言丰富的运算符构成C语言丰富的表达式(是运算符就可以构成表达式)。运算符丰富、表达式丰富、灵活。 在C语言中除了提供一般高级语言的算术、关系、逻辑运算符外,还提供赋值运算符,位操作运算符、自增自减运算符等等。甚至数组下标,函数调用都作为运算符。,2.4 运算符和表达式,C的运算符有以下几类: 本章节主要介绍算术运算符(包括自增自减运算符)、赋值运算符、逗号运算符,其它运算符在以后相关章节中结合有关内容陆续进行介绍。,2.4.1 算术运算符和算术表达式 1、基本的算术运算符 +(加法运算符。如3+5) -(减法运算符或负值运算符。如5-2,-3) *(乘法运算符。如3*5) /(除法运算符。如5/3,5.0/3) %(模运算符或求余运算符,%要求两侧均为整型数据。7%4的值为3) 除了负值运算符-单目运算符外,其它都是双目运算符。 说明:(1)两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。但是如果除数或被除数中有一个为负值,则舍入的方向是不固定的,多数机器采用“向0取整”的方法(实际上就是舍去小数部分,注意:不是四舍五入)。L11.c,(2)如果参加+,-,*,/运算的两个数有一个为实数,则结果为double型,因为所有实数都按double型进行计算。 (3)求余运算符%,要求两个操作数均为整型,结果为两数相除所得的余数。求余也称为求模。一般情况,余数的符号与被除数符号相同。 例如:-8%5=-3;8%-5=3 L12.c,说明:,1、双目运算符是有两个运算量参与运算的运算符 双目运算符中的加()、减()、乘(。)运算与普通的算术运算中的加法、减法、乘法相同,具有左结合性,不用再解释。但“”、“”也可分别作正值、负值运算符,此时为单目运算,具有右结合性,如十X,5等。 2、除法运算符“是双目运算,具有左结合性。当参与运算量均为整型时,结果也为整型,舍去小数,如 52的值为2,而不是25;如果运算量中有一个是实型,则结果为双精度实型,如502的值为2.5。 3、求余运算符(模运算符)“”是双目运算,具有左结合性。要求参与运算的量必须为整型。求余运算的结果等于两数相除后的余数,如 52的值为 1。,例2-6基本运算符的使用。,#include “stdio.h“ main() int a=10,b=3,c; float x=10.0,y,z,w; c=a/b; y=x/b; z=a/b; w=1.0*a/b; printf(“%d,%dn“,10/3,c); printf(“%f,%fn“,10.0/3,y); printf(“%f,%fn“,z,w); ,2自增,自减运算符 自增运算符(+)的功能是使变量的值目增1,自减运算符()的功能是使变量值自减1。它们均为单目运算,都具有右结合性。自增,自减运算符可有以下几种形式: i * i值目增1后再参与其他运算 * i *i值自减1后再参与其他运算 * i *i参与运算后再将值自增1 * i *i参与运算后再将值目减1 *,例2-7自增、自减运算的应用,main() int i,m,n,j,k; i=10; m=i+; n=+i; j=i-; k=-i; printf(“%d %d %d %d n“,m,n,j,k); ,程序中赋值语句 m=i;表示将 i的值 10赋给 m后, i再增 1变为 11;赋值语句 n= i;表示i先增1后,再将新值12赋给n;赋值语句j=i;表示将i的值12赋给j后,i再减1变为11;赋值语句k=i;表示i先减1后,再将新值10赋给k。,注意: (1)自增运算符(),自减运算符(),只能用于变量,而不能用于常量或表达式, (2)和的结合方向是“自右至左”。 (3)自增(减)运算符常用于循环语句中使循环变 量自动加。也用于指针变量,使指针指向下一个地址。 (4)使用和时 ,为避免二义性,最好采取大家都能理解的写法,可以加一些“不必要”的括号,如(i+)+j。,I、算术表达式 算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。运算对象可以是常量、变量、函数等。 例如,下面是一个合法的C算术表达式。 a*b/c-1.5+a 注意: C语言算术表达式的书写形式与数学表达式的书写形式有一定的区别: (1)C语言算术表达式的乘号(*)不能省略。例如:数学式b2-4ac,相应的C表达式应该写成:b*b-4*a*c。 (2) C语言表达式中只能出现字符集允许的字符。例如,数学r2相应的C表达式应该写成:PI*r*r。(其中PI是已经定义的符号常量),3.算术表达式,(3)C语言算术表达式只使用圆括号改变运算的优先顺序(不要指望用、)。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。,定义:由算术运算符、括弧、内部函数及数据组成的式子,例如,下面数学表达式对应的C语言表达式。,(b-sqrt(b*b-4*a*c)/(2*a),(a+b)/(a-b),(2*3.14159*r+exp(-5)*log(x),表达式的书写原则: (1)表达式中的所有运算符和操作数必须并排书写。不能出现上下标(如x2,x2等)和数学中的分数线。 (2)在C表达式中不能省略乘号(如2ab、xy等)。 (3)要注意各种运算符的优先级别,为保持运算顺序,在写C表达式时需要适当添加括号(),若要用到库函数,必须按库函数要求书写。 (4)若要用到库函数,必须按库函数要求书写,如上面表达式中的sqrt、exp、log就是库函数。库函数的书写格式是:库函数名(参数表)。 (5)表达式中不能出现C语言字符集以外的字符,如、等希腊字母及、等数学运算符号。,1、赋值运算符、赋值表达式 赋值运算符:赋值符号“=”就是赋值运算符。 赋值表达式:由赋值运算符组成的表达式称为赋值表达式。一般形式: 变量赋值符表达式 赋值表达式的求解过程:将赋值运算符右侧的表达式的值赋给左侧的变量,同时整个赋值表达式的值就是刚才所赋的值。赋值的含义:将赋值运算符右边的表达式的值存放到左边变量名标识的存储单元中。,2.4.2 赋值运算符和赋值表达式,例如:x=10+y; 执行赋值运算(操作),将10+y的值赋给变量x,同时整个表达式的值就是刚才所赋的值。 说明: (1) 赋值运算符左边必须是变量,右边可以是常量、变量、函数调用或常量、变量、函数调用组成的表达式。 例如:x=10 y=x+10 y=func()都是合法的赋值表达式。 (2)赋值符号“=”不同于数学的等号,它没有相等的含义。(“=”相等)例如:C语言中x=x+1是合法的(数学上不合法),它的含义是取出变量x的值加1,再存放到变量x中。,(3)赋值运算时,当赋值运算符两边数据类型不同时,将由系统自动进行类型转换。 转换原则是:先将赋值号右边表达式类型转换为左边变量的类型,然后赋值。 (4)C语言的赋值符号“=”除了表示一个赋值操作外,还是一个运算符,也就是说赋值运算符完成赋值操作后,整个赋值表达式还会产生一个所赋的值,这个值还可以利用。 2.赋值表达式的求解过程是: l 先计算赋值运算符右侧的“表达式”的值 l 将赋值运算符右侧“表达式”的值赋值给左侧的变量。 l 整个赋值表达式的值就是被赋值变量的值。,例如:分析x=y=z=3+5这个表达式。根据优先级:原式x=y=z=(3+5);根据结合性(从右向左):x=(y=(z=(3+5)x=(y=(z=3+5) z=3+5:先计算3+5,得值8赋值给变量z,z的值为8,(z=3+5)整个赋值表达式值为8; y=(z=3+5):将上面(z=3+5)整个赋值表达式值8赋值给变量y,y的值为8,(y=(z=3+5))整个赋值表达式值为8; x=(y=(z=3+5):将上面(y=(z=3+5))整个赋值表达式值8赋值给变量,z的值为8,整个表达式x=(y=(z=3+5)的值为8。 最后,x,y,z都等于8,运算步骤: 序号 表达式 变量及值 表达式的值 1 z=3+5 z(8) 8 2 y=(z=3+5) y(8) 8 3 x=(y=(z=3+5) x(8) 8 将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式的形式出现在其它语句中。 3、复合赋值运算符 在赋值符“=”之前加上某些运算符,可以构成复合赋值运算符,复合赋值运算符可以构成赋值表达式。C语言中许多双目运算符可以与赋值运算符一起构成复合运算符,即: +=,-=,*=,/=,%=,=,&=,|=,=,复合赋值表达式一般形式: = 等价于: = 例如: n+=1 等价于 n=n+1 x*=y+1 等价于 x=x*(y+1) 注意:赋值运算符、复合赋值运算符的优先级比算术运算符低。 4、赋值运算符、赋值表达式举例 (1) a=5 (2) a=b=5 (3) a=(b=4)+(c=3) (4) 假如a=12,分析:a+=a-=a*a,假如a=12,分析:a+=a-=a*a a+=a-=a*aa+=a-=(a*a)a+=(a-=(a*a) a+=(a=a-(a*a)a+=(a=a-a*a) a=a+(a=a-a*a),2.4.3 逗号运算符与逗号表达式,逗号运算符:将两个表达式连接起来,又称为“顺序求 值运算符”。 如:5,,一般形式: 表达式,表达式,求解过程: 先求解表达式,再求解表达式。整个逗号 表达式的值是表达式的值。,逗号表达式 的值为14,例:逗号表达式*5,*,分析:赋值运算符的优先级别高于逗号运算符, 因 此应先求解*5。,的值为5,然后求解*,得。整个逗号表达式的值为。,一个逗号表达式又可以与另一个表达式组 成一个新的逗号表达式。 如:(*,*),a+5 先计算出的值等于,再进行*的运算得 60(但值未变,仍为15),再进行得 ,即整个表达式的值为。,逗号表达式的一般形式可以扩展为 表达式,表达式,表达式,表达式 它的值为表达式的值。,逗号运算符是所有运算符中级别最低的 例: (,*) ,*3,赋值表达式,将一个逗号表达式的值赋给,的值等于,逗号表达式,包括一个赋值表达式和一个算术表达式,的值为,整个逗号表达式的值为18。,注意:并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。 如: printf(“%d,%d,%d”,a,b,c);,“,”并不是一个逗号表达式,它是printf函数的3个参数,printf(“%d,%d,%d”,(a,b,c),b,c),“(,)”是一个逗号表达式,它的值等于的值。,2.4.4 条件运算符和条件表达式,条件运算符为 ? : 它是一个三目运算符。 条件表达式的一般形式为: 表达式1? 表达式2 :表达式3 其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。 条件表达式通常用于赋值语句之中。例如条件语句: if(ab) max=a; else max=b; 可用条件表达式写为 max=(ab)?a:b; 执行该语句的语义是:如ab为真,则把a 赋予max,否则把b 赋予max。,使用条件表达式时,还应注意以下几点: 1. 条件运算符的运算优先级 低于关系运算符和算术运算符,高于赋值符。因此 max=(ab)?a:b可以去掉括号而写为 max=ab?a:b 2. 条件运算符? :是一对运算符,不能分开单独使用。 3. 条件运算符的结合方向是自右至左。 例如: ab?a:cd?c:d 应理解为 ab?a:(cd?c:d) 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。,例2-12求3个数中的大数。 main() int a,b,c,max; printf(”please input three numbers:n”); scanf(”d d dn”,a,b,c); maxab?a:b; maxmaxc?max :c; printf(“max=%dn”,max); 程序执行结果为: please input three numbers: 1 2 3 max=3,程序首先利用条件表达式 ab?a:b;将变量a,b中的大数求出,放入变量max;接着,又利用条件表达式maxc?max:c;将max与变量c进行比较,将这两个变量中的大数求出,对变量 max重新赋值,这时 max中就存放了变量 a,b,c中的最大值。,关系运算符及优先级别 比较两个量的运算符称为关系运算符。 在语言中有以下六种关系运算符。 ,= , = ,!= 关系运算符的优先级: (1) 、=、 关系运算符 赋值运算符,2.4.5 关系运算符与关系表达式,关系表达式,关系表达式的一般形式为: 表达式 关系运算符 表达式 关系表达式的值是: 关系成立为“真”, 不成立则为“假” C语言中用 “1” 表示 “真” “0” 表示 “假” 例如: a+bc-d x3/2 a+1c -i-5*j= =k+1 都是合法的关系表达式。,由于表达式中也可以包含关系表达式。 因此出现嵌套的情况, 例如:当 a=5, b=4, c=3 时 ac) a!=(c= =b) 又如: (a=3)(b=5) 由于35不成立,故其值为0。 又如: 当 a=5, b=4 时 a+=3b,-假(0) -真(1) -假(0) - 6,2.4.6 逻辑运算符与逻辑表达式,1、逻辑运算符 语言中提供了三种逻辑运算符 ! 非运算 & 与运算 | 或运算 运算符&和 或运算符| 均为双目运算符, 具有左结合性。 非运算符!为单目运算符,具有右结合性 (1)逻辑运算符优先级表示如下: ! & | 而且: &, | 低于关系运算符 !高于算术运算符,2、 逻辑表达式 逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式 按照运算符的优先顺序可以得出: ab & cd (ab) & (cd) !b= =c|dc & x+yc) & (x+y)b) 逻辑表达式的值: 逻辑表达式的值也为“真”和“假”两种,用“1”和“0 ”来表示。,表达式 a & b & c 的求解过程 只有a为真时,才判别b的值;只有a和b均为真时,才判别c的值。 只要a为假,就不再判别b和c的值,直接求得表达式的值为假。,3、关于逻辑运算的说明,图4-1 表达式a & b & c的求解过程,表达式 a | b | c 的求解过程 只要a为真,就不再判别b和c的值,直接求得表达式的值为真。 只有a为假时,才判别b的值;只有a和b均为假时,才判别c的值,例 分析下面程序的运行结果。 Void main() int x=5,y=9,k=1,a; a=x+|y+ ,程序运行结果如下: a=1, x=6, y=9, k=1,分析: 语句“a=x+|y+”的执行过程是先求“=”右边的值,即计算表达式“x+|y+&k+”的值,系统从左到右进行扫描,x=5,x+是先取x的值(即5,运算后x的值增加1)进行“|”运行,因为不管其右边的值是什么,其结果都是成立的,即整个表达式的值为1,C系统就不再计算“|”右边表达式“y+&k+”,所以y的值,k的值不变。 读者思考: 如果x的初值为0,程序的运行结果如何?,例2-14逻辑表达式的应用。 main() int a=14,b=15,x; char cA; x =(ab)(cB); printf(”dn”,x); 程序执行结果为: x 1 上例中,语句x=(ab)(cB )中出现了赋值运算符、关系运算符、逻辑运算符,根据它们的优先级以及式子中的括弧,应先进行括弧内的运算。右面cB等价于AB,值为真,用1表示;左面ab,等价于1415,值为真,也用1表示;这样语句x(ab)(CB)就等优于X=11,先进行逻辑运算11,其值为1,最后赋值给左边的变量x。,2.5 位运算符与位运算,C语言的位运算的功能,使得它能够编写系统程序,这是与其他高级语言不同之处。 所谓位运算,就是参与运算的量按二进制位进行运算。C语言的位运算符包括(按位与)、|(按位或)、(按位异或)、(取反)、(左移)、(右移)6种,另外,还包括5种“复合赋值”运算将位运算的运算对象只能是整型或字符型数据,不能是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论