第三章 数据类型、运算符与表达式

48
第第第 第第第第 第第第第第第第 第第第 第第第第 第第第第第第第 3.1 C 第第第第第 3.2 第第第第第 3.3 第第第第第第第 3.4 第第第第第第第 3.5 第第

Upload: gloriann-stevens

Post on 01-Jan-2016

108 views

Category:

Documents


7 download

DESCRIPTION

第三章 数据类型、运算符与表达式. 3.1 C 的数据类型 3.2 常量与变量 3.3 三种基类型数据 3.4 运算符和表达式 3.5 练习. 3.1 C 的数据类型. 图 3.1 C 的数据类型总览. 3.1.1 三种基本数据类型(存储形式). 1. 整型 整型数据在内存中以二进制补码形式存放,一般占 2 个 字节。. 正数的补码和其原码相同,负数的补码为其绝对值的原码按位取反再加 1 。. 10 的补码: 0000 0000 0000 1010 (等于原码) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.1 C的数据类型3.2 常量与变量 3.3 三种基类型数据3.4 运算符和表达式3.5 练习

Page 2: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.1 C 的数据类型

图 3.1 C 的数据类型总览

Page 3: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.1.1 三种基本数据类型(存储形式)

1. 整型 整型数据在内存中以二进制补码形式存放,一般占 2 个字节。

正数的补码和其原码相同,负数的补码为其绝对值的原码按位取反再加 1 。

10 的补码: 0000 0000 0000 1010 (等于原码)

-10 的补码: 1111 1111 1111 0110

符号位

Page 4: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

2. 字符型 字符型数据在内存中以 ASCII 码存放(附录 I ),存储形式与整数类似,只占一个字节。

‘A’ : 0100 0001

3. 实型 实型数据在内存中按指数形式存储,分成小数部分和

指数部分,一般占 4 个字节。

Page 5: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.2 常量与变量3.2.1 常量常量是其值在程序运行过程中不能被改变的量。

常量又可以分为直接常量和符号常量。直接常量可以从字面上直接看出数据的类型和值;而符号常量是用一个标识符来代表一个常量,不能从字面上直接看出数据的类型和值。

用于为语法单位命名的有效字符序列称为标识符。 C 语言规定标识符只能由字母、数字和下划线三种字符组成,并且不能以数字开头。

Page 6: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

合法 非法_total 1_total

test1_2 test1-2

PI hi!there

a1 a1

A1 f(x)

Int int

注意:大小写敏感,不能用关键字作为标识符(附录Ⅱ)。

Page 7: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

符号常量的使用 宏定义命令# define 用来定义一个标识符和一个字符

串,在程序中每次遇到该标识符时就用所定义的字符串替换它。这个标识符叫做宏名,替换过程叫做宏替换或宏展开。宏定义命令# define 的一般形式是:

# define 宏名 字符串

例如想用 PI 表示数值 3.1415926 ,就可以用宏定义# define 来说明: # define PI 3.1415926

这样在预编译时,每当在源程序中遇到 PI 就自动用 3.1415926 代替,这就是宏展开。

Page 8: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

例 求半径为 3 的圆的周长和面积。 # define PI 3.1415926

main( )

{float perimeter,area;

perimeter=2*PI*3;

area=PI*3*3;

printf(“ 周长 =%f, 面积 =%f\n”,perimeter,area);

}

经过宏替换,宏展开为: perimeter=2*3.1415926*3;

area=3.1415926*3*3;

Page 9: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

注意:( 1 )宏替换仅是简单地用所说明的字符串来替换对应的宏名,无实际的运算发生,也不作语法检查。例如: # define PI 3.1415926;

perimeter=2*PI*3;

area=PI*3*3;

经过宏替换后, 语句展开为: perimeter=2*3.1415926;*3*3;

area=3.1415926; *3*3;

然后经编译将出现语法错误。

Page 10: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

( 2 )符号常量的值在其作用域(从定义开始,到源程序结束为止)内不能改变。例如: # define PI 3.1415926

PI=3.14;

perimeter=2*PI*3;

area=PI*3*3;

经编译将出现语法错误。

( 3 )在 C 语言程序中习惯上用大写字母作为宏名。

Page 11: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.2.2 变量

若有定义 int sum;

则执行语句 sum=0; 后 , 它的值为 0 ;可再执行语句 sum=1; 将它的值变为 1 。

变量是其值在程序执行过程中可以改变的量。

每个变量都有一个名字,它代表某个存储空间及其所存储的数据。在程序中取变量的值,实际上是通过变量名找到相应的存储单元,从中读取数据。要想把内存中的某段存储单元和一个变量名联系起来, 必须首先对变量进行定义或声明。

Page 12: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

1. 变量的定义变量定义的一般形式: 类型说明符 变量名表;这里,类型说明符 (type) 必须是 C 语言的有效数据类型。变量名表可以是一个或多个标识符名,中间用逗号分隔,最后以分号结束。如: int a,b;

float f1,f2;

char ch;

这样就在内存中开辟了五个相应的存储单元,这五个单元在空间上不一定是连续的。

Page 13: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

2. 变量的初始化 变量定义后,相应的存储单元内并没有确定的数据。因此,使用变量时要先对变量进行初始化。

如: int a,b;

a b

a=2;

b=3;

2 3

等价于int a=2,b=3;

C 语言允许在定义的同时为变量初始化。

Page 14: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3. 说明( 1 )变量必须先定义后使用。( 2 )同一函数内所定义的变量,变量名不能相同。 错误: int a;

float a;

( 3 )变量使用时要先初始化,给出相应的初值,可在定义的同时初始化。 正确:① int a,b;

a=b=2;

② int a=2,b=2;

错误: int a=b=2;

Page 15: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.3 三种基类型数据

3.3.1 整型数据1. 整型常量的表示方法( 1 )十进制整数:用十进制数码表示数,不加前缀。如: 123 , -123 。( 2 )八进制整数:用八进制数码表示数,加前缀 0( 数字零 ) 。如: 0123 , -0123 。( 3 )十六进制整数:用十六进制数码表示数,加前缀 0x

或 0X( 数字零和字母 x(X)) 。如: 0x123 , -0X123 。

注意: 123≠0123≠0x123

Page 16: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

2. 整型变量的分类( 1 )基本整型 (int) :占 2 个字节( 2 )短整型 (short int 或 short) :占 2 个字节( 3 )长整型 (long int 或 long) :占 4 个字节

这三类前都可以加上修饰符 signed 或 unsigned 。( 1 ) signed :有符号型,最高位为符号位,可缺省。( 2 ) unsigned :无符号型,最高位为数据位,不可缺省。

如有: int a; unsigned int b;则 a 为有符号基本整型, b 为无符号基本整型。

Page 17: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

int :-32768 0 32767

unsigned int :0 65535

图 3.2 int 类型和 unsigned int 类型的取值范围

无符号型变量由于无符号位,只能存放非负整数。而有符号型变量最高位为符号位, 0 表示正数, 1 表示负数,因此可存放负数。

Page 18: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3. 整型数据的溢出 各种整数类型都有各自的取值范围,一旦越出了这个范围,就不能正确地表示数据,这种情况称为“溢出”。

main( ){int a,b; a=32767; b=a+1; printf(“%d,%d\n”,a,b);}

编译,运行结果为: 32767,-32768

a: 0111 1111 1111 1111+ 0000 0000 0000 0001b: 1000 0000 0000 0000

符号位

Page 19: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

main( ){int a,b; a=-32768; b=a-1; printf(“%d,%d\n”,a,b);}

编译,运行结果为: -32768,32767

a: 1000 0000 0000 0000 - 0000 0000 0000 0001b: 0111 1111 1111 1111

符号位

注意:常量无 unsigned 型;整型数据加后缀 l 或 L ,表示长整型常量,即 123≠123L 。

Page 20: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.3.2 实型数据

1. 实型常量的表示方法( 1 )十进制小数形式:有数字和小数点组成(必须有小数点)。如: 123.0 、 123. 、 .123 。( 2 )指数形式:<数字> e( 或 E)<整数>正确: 12.3e1 、 1.23E2 、 1230e-1 。错误: e3 、 2.1e3.5 、 .e3 、 e 。

若要表示 1.0×103?

1.0e3 或 1e3

Page 21: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

2. 实型变量的分类( 1 )单精度型: float ,占 4 个字节, 7 位有效数字。( 2 )双精度型: double ,占 8 个字节, 16 位有效数字。( 3 )长双精度型: long double ,占 16 个字节。3. 实型数据的舍入误差(由有效位造成)main( )

{float a,b;

a=123456.789e5;

b=a+20;

printf(“%f\n”,b);

}

Page 22: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.3.3 字符型数据1. 字符常量字符常量是用单引号括起来的一个字符。如:‘ a’ 、‘ 1’ 、‘ ?’ 等。

注意:( 1 )大小写敏感:‘ a’ 和‘ A’ 是不同的字符常量。( 2 )‘ 1’ 和 1 不同:前者是字符常量, ASCII 值为 49 ;后者为整型常量,值为 1 。( 3 )单引号仅为字符常量的定界符,而非字符常量的一部分。( 4 )单引号内的那个字符不能为单引号、双引号或反斜杠。

Page 23: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

转义字符:以 \ (反斜杠)开头的字符序列。

‘\n’: 回车换行符 ‘ \r’: 回车符

‘\t’: 跳过一个 8 列 ‘ \b’: 退格符

‘\f’: 换页符 ‘ \\’: 反斜杠

‘\’’: 单引号 ‘ \”’: 双引号

‘\ddd’: 八进制数所代表的字符

‘\xhh’:十六进制数所代表的字符

Page 24: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

例 main( )

{printf(“This is a program.\n”) ; printf(“\this is\ba\012program.\n”) ; printf(“\”first\\second\””) ; }

运行结果为:This is a program.

his ia

program.

“first\second”

Page 25: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

2. 字符串常量

字符串常量是用一对双引号括起来的字符序列。

系统自动地在每个字符串常量的末尾加一个“字符串结束标志”(‘ \0’ )。它是一个空操作符,不做任何操作。

注意:( 1 )大小写敏感:“ a” 和“ A” 是不同的字符常量。( 2 )‘ 1’ 和“ 1” 不同:前者是字符常量,只包含一个字符;后者为字符串常量,包含两个字符‘ 1’ 和‘ \0’ 。( 3 )双引号仅为字符串常量的定界符,而非字符串常量的一部分。( 4 )字符串中要插入双引号,应借助转义字符‘ \”’ 。

Page 26: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3. 字符变量 由于字符型数据和整型数据的存储形式类似,所以两者在一定范围内可互相通用。( 1 )字符型数据和整型数据之间可以进行混合运算。 main( )

{char c;

c=‘A’+32;

printf(“%c\n”,c);

}

运行结果为: a

可见,大小写字母的 ASCII 码值相差 32 。

Page 27: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

( 2 )字符型数据和整型数据可互相赋值;字符型数据可以用整数形式输出;反之,一定范围内的整数也可以用字符形式输出。 main( )

{int I;

char c;

I=‘a’;c=97;

printf(“%c,%d\n”,c,c);

printf(“%c,%d\n”,I,I);

}

运行结果为: a,97

a,97

0~ 255

Page 28: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.4 运算符和表达式

1. 表达式是由运算符和操作数组成的。依据运算的特征,可对表达式进行分类。

2. 表达式在书写时应该注意遵循 C 语言表达式书写的原则 :

(1) C 语言的表达式只能采用线性的形式书写。 例如 :

① 应写成 1.0/3+i+j*j*j 。

② 应写成( a+b ) / ( c+d ) *e+f 。

3

3

1ji

fedc

ba

3.4.1 表达式的基础

Page 29: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

(2) C 语言的表达式只能使用 C 语言中合法的运算符和操作数 , 对有些操作必须调用库函数完成 , 而且运算符不能省略。例如 :

① πr2 应写成 3.14159*r*r 。

② 应写成 0.5*a*b*sin ( a )。

③ |x- y| 应写成 fabs ( x- y )。

④ y+2X 应写成 y+pow ( 2, x )。

aabsin2

1

Page 30: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3. 表达式的计算要考虑运算符的优先级和结合性。

运算符的优先级规定了运算符执行的先后顺序。 C 语言将运算符的优先级划分为 15级。(附录Ⅲ)

运算符的结合性是指,优先级相同的运算是从左到右进行(左结合性)还是从右至左进行(右结合性)。左结合性是人们习惯的计算顺序。 C 语言中 , 只有单目运算(!、 ~、 ++ 、 -- 、 - 、 * 、 & )、条件运算(? : )、赋值运算( = 、 += 、 -= 、 *= 、 /= 、 %= )的结合性是右结合 , 其余运算均为左结合。

Page 31: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

一般,各类运算是在相应的同一类型的数据之间进行的。不同类型数据之间进行运算或数据类型不符合运算要求时,要进行类型转换。类型转换有自动转换(又称隐含转换)与强制转换两种方式。

4. 表达式的计算还要考虑类型转换。

( 1 )自动转换double

long

unsigned

int

float

char,short

Page 32: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

横向箭头方向表示必定要进行的转换,纵向箭头方向表示类型自动转换的方向(向高看齐)。

result = ( ch / i )+(f * d)-(f + i)

float

int double double double

int double

double

double

;

表达式中若有一数据为实型,则计算结果必为 double 类型。

Page 33: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

( 2 )强制转换 强制类型转换通过类型转换运算进行。 格式: ( 类型名 )( 表达式 )

将表达式的类型强制转换成类型名指定的类型。 如: float x=3.2, y=2.3;

(int)(x+y) 将表达式 x+y 的值强制转换成整型。 (int) x+y 先将 x 的值转换成整型,再与 y 相加。

强制类型转换是暂时性的、一次性的,并不会永久地改变所转换表达式的类型。 如: int a=2;

(double)a 为双精度, a依然为整型量。

Page 34: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.4.2 算术运算符和算术表达式1. 基本的算术运算符( + 、 - 、 * 、 / 、 % )说明:( 1 )双目, * 、 / 、 % 优先级高于 + 、 - ,左结合性。( 2 )两个整型数据相除时,其运算结果也是整数,余数被截掉。如 1/2 的结果是 0 ; 10/3 的结果是 3 。 例 main( )

{int i=10, j=4;

float f=i/j;

printf(″f=%f\n″, f);

}

运行结果为: f=2.000000

Page 35: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

( 3 )求余运算符 (%) 仅用于整型数据,不能用于实型。它的作用是取整数除法的余数,结果与被除数同号。如 1%2 的结果是 1 ; -10%3 的结果也是 -1 。

例 main( )

{int a;

float f= -3.5;

a=(int)f %10;

printf(“a=%d\n”,a);

}

运行结果为: a= -3

Page 36: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

2. 自增、自减运算符( ++ 、 - - )说明:( 1 )单目,操作数只能是变量,优先级处于第 2级 , 右结

合性。如 -i++ 等价于 -(i++) 。( 2 )有前置、 后置两种方式 :

① ++i 或 - -i :在使用 i 之前,先使 i 的值增 /减 1 ,俗称先加 /减后使用。

② i++ 或 i- - :先使用 i 的值,然后使 i 的值增 /减 1,俗称先使用后加 /减。

Page 37: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

main( )

{int x, y;

x=10;

y=++x;

printf(“%d, %d\n”, x, y);

}

运行结果为: 11,11

若将第四行改为: y=x++;

则运行结果为: 11,10

Page 38: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

将程序改为:main( )

{int x, y;

x=y=10;

printf(“%d,%d\n”,++x,y++);

}

运行结果为: 11,10

若将第四行改为: printf( “%d,%d\n”,++x,x++);

则运行结果为: 12,10

因为函数参数的求值顺序是自右而左。

Page 39: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

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

1. 一般的赋值运算符和复合的赋值运算符

复合的赋值运算符是由赋值运算符和其它双目运算符组合而成的。如: + = 、 - = 、 * = 、 / = 和 % = 。

格式: < 变量 > <赋值运算符 > < 表达式或量 >

如: int x=0, a, b;

a=2; b=a;

x+=2; /* 等价于 x=x+2;*/

x*=a+b; /* 等价于 x=x*(a+b);*/

则变量 a 、 b 的值都为 2 ,变量 x 的值为 8 。

Page 40: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

说明:( 1 )赋值运算符的左侧只能为变量。 非法: 1 = a;

- a=1;

a+b=1;

( 2 )双目,优先级别为 14 (仅比逗号运算符高),右结合性。 例 int a=1, b, c;

c=b=a ;

a += a - =a*a ; /* 等价于 a=a - (a*a) ; a=a+a ;*/

则变量 b 、 c 的值都为 1 ,变量 a 的值为 0 。

Page 41: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

( 3 )当赋值运算符两侧数据的类型不一致,则在赋值时要进行类型转换。 ① 实型→整型:取整,舍弃小数部分。 ② 整型→实型:数值不变,以实数形式表示。 ③ 单、双精度实型之间:数值不变,进行有效数字处理。 ④ 各种整型之间:按存储形式进行。

例 float x;

int i ; x=i=3.14159;

则变量 i 的值为 3 , 而变量 x 的值为 3.0 而不是 3 , 也不是

3.14159 。

Page 42: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

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

逗号运算符也称顺序求值运算符,其运算优先级为 15 ,也是最低的,结合方向是自左至右。逗号运算符把两个对象“连接起来”,使之成为一个逗号表达式。

其一般形式是: < 表达式 1> , < 表达式 2> ,…, < 表达式 n>

逗号表达式的求解过程: 先求解表达式 1 ,再求解表达式 2 ,…,最后求解表

达 式 n 。整个逗号表达式的值是表达式 n 的值。

Page 43: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

例如:

x=(y=3, y+1)

该表达式括号内是逗号表达式,由于结合方向是自左至右, 先将 3赋给 y , 然后计算表达式 y+1 ,其值为 4 。

整个表达式的值为最后一个表达式的值,所以表达式的值为 4 ,最后将 4赋给 x 。若表达式改为:

x=y=3, y+1

则表达式的值为 4 , x 的值为 3 。

Page 44: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.4.5 其它运算符1. 取地址运算符 &

取地址运算是单目运算 , 操作数只能是变量 , 得到变量的地址。 2. 求字节数运算符 sizeof

求字节数运算是单目运算 , 操作数可以是类型名 , 也可以是变量、表达式,用以求得相应类型或数据所占的字节数。 如: sizeof(int) 值为 2

sizeof(‘A’) 值为 1

sizeof(123+2L) 值为 4

sizeof(“abc\”d\n”) 值为 7

Page 45: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

3.5 练习

一 . 选择题1. ( )是 C 语言提供的合法的数据类型关键字。A.Float B.signed C.integer D.Char

2. ( )是非法的 C 语言转义字符。(多项选择)A.’\t’ B.’\018’ C.’\n’ D.’\0xaa’

3. ( )是 C 语言的正确赋值语句。A.a=1,b=2 B.a++; C.a=b=5 D.y=int(x);

4. 要求参加运算的数必须是整数的运算符是( )。A./ B.& C.% D.=

B

B D

B

C

Page 46: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

5. 执行以下语句后的输出为( )。 char ch=‘a’;

ch - - ;

printf(“%d,%c\n”, ch +’2’ - ’0’, ch +’3’ - ’0’ );

A.b,c B.a - - 运算非法,故有语法错C.98,c D.格式描述和输出项不匹配,输出无定值6. 以下程序的输出结果是( )。 main( )

{int x=10,y=10;

printf(“%d %d\n”, x- -, - -y);}

A.10 10 B.9 9 C.9 10 D. 10 9

C

D

Page 47: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

7. 以下程序的输出结果是( )。 main( )

{int m=7,n=4;

float a=38.4,b=6.4,x;

x=m/2+n*a/b+1/2;

printf(“%f\n”,x);}

A.27.000000 B.27.500000 C.38.000000 D.28.500000

8. 以下程序的输出结果是( )。 main( )

{int a=4,b=7;

printf(“%d\n”, (a=a+1, a+b, b+1) );

A.5 B.8 C.12 D. 无定值

A

B

Page 48: 第三章  数据类型、运算符与表达式

第三章 数据类型、运算符与表达式

二 . 书写表达式1. v= at2

2.

三 . 计算表达式1. ch=‘a’ + ’8’ – ‘3’

2. a=2,b=5,a++,b++,a+b

3. a=25/3%3

4. 若有定义 int m=5,y=2;

则 y + = y - = m* = y

a

acbbx

2

42

1

12

v=0.5*a*t*t

x1=(-b+sqrt(b*b-4*a*c))/(2*a)

‘f’

9

2

-16