46
第第第 第第第第第第第第第第第 第 第 第 第 第

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

  • Upload
    kohana

  • View
    136

  • Download
    0

Embed Size (px)

DESCRIPTION

第三章 数据类型运算符与表达式. 信 息 管 理 系. 3.0 、 C 语言中标识符的概念. 在程序中,由程序设计者使用的名字成为标识符。标识符用以标志区分不同的东西。它可以用作函数的名字、变量、常量的名字,以及文件的名字等等。. 一、 C 语言中的标识符分类. 用户标识符 关键字(语句标识及类型标识) ( P375 附录 II ) 例如: real , main , char , int , float , double , long , if , for , switch , default , break 等 。 预定义标识符(函数名字等) - PowerPoint PPT Presentation

Citation preview

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

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

信 息 管 理 系

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

3.0 、 C 语言中标识符的概念• 在程序中,由程序设计者使用的名字成为标识符。标识符用以标志区分不同的东西。它可以用作函数的名字、变量、常量的名字,以及文件的名字等等。

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

一、 C 语言中的标识符分类• 用户标识符• 关键字(语句标识及类型标识)( P375 附录 I

I )例如: real , main , char , int , float , doub

le , long , if , for , switch , default , break 等。

• 预定义标识符(函数名字等)例如: define , include , printf , scanf , sin等。

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

二、用户自定义标识符的命名规则• 1 、标识符只能由字母、数字和下划线( _ )组成。• 2 、开头字符不能是数字;• 3 、不能与关键字重名;(关键字是 C 语言中规定好

的,具有特定意义的一串字符,关键字都是小写字母的)

• 4 、最好不要与预定义的标识符重名; 

• 5 、区分大小写。即 A 与 a 是不同的名字,一般要求都用小写字母。

• 6 、一般不要超过 8个字符。• 例如:判断下面哪些是 C语言中合法的标识符的是:• aa int INT a2_ 2a a-b a_b b

_2 2b abc a#b ab? A_a

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

3.1 、 C 程序中的数据类型

C语言的数据类型

基本类型

构造类型

指针类型

空类型 (void)

短整型 (short)

整型 (int)

长整型 (long)整型

字符型

实型 ( 浮点型 )

枚举类型

单精度 (float)

双精度 (double)

数组结构体 (struct)

共用体 (union)

文件 (file)

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

一、 C 语言中的基本数据类型类型 标识符 占用空间(字

节) 表示范围

整型

有符号标准 int 2 (-32768~32767) -215~215-1

有符号短 short 2 (-32768~32767) -215~215-1

有符号长 long 4 (-2147483648~2147483647) -231~231-1

无符号标准

unsigned int

2 (0~65535) 0~216-1

无符号短

unsigned short

2 (0~65535) 0~216-1

无符号长

unsigned long

4 (0~4294967295) 0~232-1

  字符型 char 1 

实型

单精度 float 4 

双精度 double 8 

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

二、常量常量:在程序运行中,其值不能被改变的量称为常量

常量有五种类型:整型常量、实型常量、字符常量、字符串常量和符号常量

1 、整型常量: 用十进制表示:如 123 , 123u , 123L,123l, -123L 。 用八进制表示(以 0开头):如 012 , 013L , -013u

等。 用十六进制表示(以 0x)开头:如 0x12, 0xAB , -0xAL, 0xBu 等。注:其中 L (或 l )表示该数为长整型, U (或

u )表示该数为无符号的整数

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

二、常量2 、实型常量实型常量有两种表示形式:小数形式: 45.3 , 0.2 , -623.00 , .2 , 2. , 2

指数形式: 45.3e0,45.3e-2,0.45E+2,3.2e3,.5e32

注意:小数部分为 0 的实型常量,可以写为 453.0 ,也可以依照日常习惯写成 453

数字之间不能出现空格;用指数形式时, e (或 E )的左右两端必须有数,且指数部分必须为整数。

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

二、常量判断下列那些是合法的 C 常数: -0. 32 -0x2al 0x7g 012

-018 123u 0x7L 0x7u 003

e3 3.e-5 7ff 9e+2.3 .3e-3

2 34 0x2A 0xAU

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

二、常量3 、字符常量C语言中规定字符常数在书写的时候要放到‘’中间。如‘ ’,’ a’,‘ #’,‘ 1’等。字符在计算机中存放的是他们的 ASCII 。但在‘’中不能放’和 \ 。

即’’’是不对的。(见 P374 附录 I)除了形式上的字符常量外, C 语言还有特殊的字符常量,如转义字

符常量。字符形式 功能 字符形式 功能

\n 换行 \f 走纸换页

\t 横向跳格 \\ 字符 \

\v 竖向跳格 \’ 字符’

\b 退格 \ddd 1~3 位 8 进制代表的字符

\r 回车 \xhh 1~2 位 16 进制代表的字符

也就是说符号在 C程序中可用三种方法表示:如 A( ASCII 码为 65 )’A’ ’\101’ ’\x41’如:已知的 ASCII 码为 001 ,那么符号在 C程序中可写为‘ \001’。

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

二、常量4 、字符串常量字符串常量是用双引号括起来的一个或一串字符。如:“ China” “How are you.” “@sohu.com” 等字符串在存储的时候会自动在末尾加上‘ \0’ ,表示结束。字符串

中字符的个数成为字符串的长度。如“ china”在内存存储如下:

思考:“ A”与‘ A’有什么不同?下列那些是合法的 C常数:

‘\n’ ‘\261’ ‘\28’ ‘\x21’ “ABC29 BG” ‘ab’ 0x2.5b 7ff 8L ‘’’ ?

5 、符号常量符号常量是由宏定义“ #define” 来定义的常量,在 C 语言中可用标

识符代表一个常量。如: #define PI 3.14159

01100011 01101000 01101001 01101110 01100001 \0

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

三、变量在程序的运行过程中,其值可以改变的量称为变量。变量要有变量名,在内存中占据一定的存储单元,存储单元里存放

的是变量的值。不同类型的变量所占存储单元大小不同,变量在使用前必须先定义。

1 、变量的定义 变量的定义格式: 数据类型 变量名; 如: int a,b; /* 定义两个整型变量这两个变量可以分别存放

一个 int 型的数据 */

float f; /* 定义一个实型变量 f ,可以存放一个单精度类型的实数 */

char c; /* 定义一个字符类型的变量 c ,可以存放一个字符*/

注: 变量的名字必须满足用户标识符的命名规则。 若同时定义多个同类型的变量,则中间用逗号(,)隔开。

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

三、变量2 、变量的赋值变量被定义以后,就可以存放相应类型的数据了。给变量一个值,我们称之为给变量赋值,用操作符 = 来实现。我们还可以在定义变量的同时给变量一个值,称为变量初始化。

如: int i=3, b=5, c; char c=’a’; float f=3.1415; c=b;在给变量赋值的时候,我们要把一个相同类型的常数赋给一个变量。

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

三、变量3 、变量值的存储变量被定义以后,系统在运行时会为该变量分配一个相应大小的存储空间,称为存储单元。

给变量赋值后,该变量对应的存储单元中会存放该值,这个值称为变量的值。

那么变量的值在变量的存储单元中是如何表示的呢?( 1 )整数是以补码的形式存放的。(正数的补码是其本身,负数的补码为原码按位取反加

1 ) 如: int a=2, b; b= -2;

00000000 00000010 11111111 11111110

a b

2 的原码表示: 00000000 00000010

-2 的补码表示: 11111111 11111101+1=11111111 11111110

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

三、变量( 2)、特殊情况:最大、最小和 0的存储 最大值: 215- 1 ( 32767 ) 最小值: -215( -32768 )

0的存储如下:

0 1111111 11111111

16 15 ~ 9 8 ~ 1

1 0000000 00000000

16 15 ~ 9 8 ~ 1

0 0000000 00000000

16 15 ~ 9 8 ~ 1

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

三、变量( 3)、超出范围的情况(溢出):如: ①、阅读下面的程序段,程序段的输出结果是()

int i=65536; printf(“%d”, i ); A ) 65536 B ) 0 C )有语法错误,无输出结果 D) 1 说明: 65536= 216,即: 10000000000000000 ,第 17位上为 1,后面 1

6位均为 0。存储时只能存放 16位,即 16个 0。故结果为 0。 ②、若有下面的程序段,则输出结果为()

int a=32768; printf(“%d”, a); 说明: 32768= 215,即 1000000000000000 ,第 16位上为 1 ,后面 15位均为 0。存储时只能存放 16位,最高位为 1,故结果为- 32768 。

③、若有下面的程序段,则输出结果为() int a=65549; printf(“%d”,a); 已知 65549= 10000000000001101

B (13)int b=131069; printf(“%d”,a); 已知 131069= 11111111111111101B (-3)

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

3.8 运算符与表达式(一)、算术运算符和算术表达式

说明: 1、优先级: 5+2*32 、结合性: 5*2%3

用算术运算符和小括号将数值连接起来的式子叫算术表达式。

如: 1+2*( 3-1 ) %2

操作符 作用 运算对象 运算结果 优先级 结合性

* 乘整型或实型 整型或实型

1

自左向右

/ 除

% 求余 整型 整型

+ 加整型或实型 整型或实型 2

- 减

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

(一)、算术运算符和算术表达式• 写出下列算式的 C语言表达式:①

③ (求平方根的函数为 sqrt)

如:以下变量 x,y,z 均为 double类型且已正确赋值,不能正确表示数学式子 的 C语言表达式的是()

A ) x/y*z B ) x*(1/(y*z)) C ) x/y*1/z D) x/y/z

b/(a+b/a)

(x-y*z)/(a+b+c)

sqrt((a+b)*(b+c)*(c+a))

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

(一)算术运算符和算术表达式表达式的值:表达式运算得到的最终结果为表达式的值。也就是整个式子代表的值如 a=5,b=2; a+b 7

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

(二)赋值运算符和赋值表达式 赋值运算符: = 格式:变量 =表达式 如: int a , b; 下面都是正确的赋值表达式 a=5; b=3; a=2+3; a=a+2; b=a*a;

赋值运算为“从右向左”结合的。如 x=y=z=3 它等价于: x=(y=(z=3))

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

(三)自反运算赋值运算中有如下的特殊形式:变量在原先的基础上做一些运算后

的结果,作为新的变量的值。这些表达式又可写为后面的形式。这些运算符+=、-=、 * =、 /=、 %= 叫做自反运算符。分别称为自反加、自反减、自反乘、自反除和自反取余(自反取模)。这样的运算称为自反运算。

a=a+b; a+=b;a=a-b; a-=b;a=a*b; a*=b;a=a/b; a/=b;a=a%b; a%=b;由于该运算可看作是一种特殊的赋值运算,故其结合性仍然是“自

右向左”的。如: a=b*=a+2 等价于 b=b*(a+2); a=b;如:设 k=2, i=2, m=(k+=i*=k) 则 m= i= (6,

4)

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

(四)自加、自减运算自加、自减运算符的作用是使变量的值增 1 或减 1 。运算符为:++、――。如: ++a, a++, - -a, a- -自加与自减运算是一种特殊的赋值运算。++、――在前表示变量的值先加 1,再作为整个表达式的值。++、――在后表示先将变量的值作为表达式的值,然后变量的值再加 1。

如:设 a=5; b=a++; 则 b=5, a=6;b=++a; 则 a=6, b=6;b=a--; 则 b=5, a=4;b=--a; 则 a=4, b=4;自加、自减运算也是赋值运算,故运算的对象只能是变量,不能是

常数或表达式。即: 5++ ( x+y) ++ 都是错误的。

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

复习巩固练习:1 、已知大写字母 A 的 ASCII 码是 65 ,小写字母 a 的 ASCII 码是 9

7 ,则字符常量’ \101’ 指的是() A )字符 A B )字符a C )字符 e D)非法的常量

2、以下选项中合法的实型常数是()A) 5E2.0 B ) E-3 C ) .2E0 D) 1.3E

3 、在 C 语言中,合法的长整型常数是() A ) 0L B ) 4962710 C ) 324562& D) 16D

4 、以下选项中,不属于 C 语言的数据类型的是() A ) signed short int B ) unsigned long int C ) unsigned int D) long short5 、以下选项中,与 k=n++ 完全等价的表达式是() A ) k=n, n=n+1 B ) n=n+1, k=n C ) k=++n D) k+=n+1

6 、以下程序段的输出结果是() int x=10,y=10; printf(“%d %d”, x--, ++y)7 、设 int a=2, 则执行完语句 a+=a-=a*a后, a的值为()

10 11

-4

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

复习巩固练习: 8 、 C语言中 int 型变量所占字节数是() 9 、与数学式子 对应的 C语言表达式是() A ) 3*x^n/(2*x-1) B ) 3*x**n/(2*x-1) C ) 3*pow(x,n)(1/(2*x-1)) D) 3*pow(n,x)/(2*x-1)10 、 C语言提供的合法的数据类型标识符是()

A) Double B ) short C ) interger D) Char11 、 C语言中运算对象必须是整型的运算符是()

A)%= B ) / C )= D) ^12 、下面合法的 C 语言字符常量是() A )’ \t’ B )” a”

C ) 65 D) A13 、若有 int a=5; 则表达式 a++的值是()14、以下程序的输出结果是()main(){int a=0; a+=(a=8); printf(“%d”, a ); }

2

216

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

复习巩固练习:15 、以下程序的输出结果是()main(){int x=023; printf(“%d”,--x);

16 、下列选项中,不能用作标识符的是()A) _1234_ B ) _1_2 C ) int_2_ D) 2_int_

17 、有以下程序main(){char a=’a’ , b; printf(“%c,” , ++a); printf(“%c\n”, b=a++); }程序运行后的输出结果是() A ) b, b B ) b, c C ) a, b D) a, c

18 、以下程序运行后的输出结果是()main(){int a, b, c; a=25; b=025; c=0x25; printf(“%d %d %d\n”,a,b,c); }

18

25 21 37

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

五、关于算术运算与赋值注意事项1 、+、-、 *、 / 运算,运算对象是整型、实型均可。(+=、-=、 * =、 /=同)

整型+(-、 *、 /)整型=整型 如: 3+2= 5 9/5= 1

实型+(-、 *、 /)实型=实型 如: 3.0+ 2.0= 5.0 9.0/5.0= 1.8

若两个操作数一个为整型、一个为实型,则结果为实型。如: 3+ 2.0= 5.0 9.0 / 5= 1.8

2 、关于%运算对象只能为整型数据。同样%=的运算对象也只能为整型数据。

如: 3.5% 2 是不对的。

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

五、关于算术运算与赋值注意事项3 、关于字符数据与整型数据

由于字符数据在运行时是以 ASCII 码的形式存储的,故字符数据与整型数据之间存在天然的联系。

①可以将整型数据赋值给一个字符变量。则这个字符变量的值为该整型数据对应的字符。

如: char ch; ch=65; printf(“%c”,ch); 则会输出A

②可以将一个字符赋值给一个整型变量,整型变量的值为该字符的 ASCII 码值。如: int a=’A’; printf(“%d”,a); 则输出 65。

③若将一个字符变量按整型方式输出,则输出其 ASCII 码。如: char ch=’A’; printf(“%d”, ch); 则输出 6

5。④若字符型数据与整型数据产生混合运算,则字符型数据将自动转换

成对应的 ASCII 码值后,再参与运算。如: int i=5, b; char ch=’A’; 则 i+ch 的结果为 70。

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

六、数据类型转换 1 、算术运算符转换:C 语言中,整型、实型、字符型数据之间可以混合运算。再进行运算时,不同类型的数据要先转换成同一类型的数据,然后再进行运算。转换规则如下:

double float

long

unsigned

int char, short

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

六、数据类型转换当一个算术运算符两端的运算量不一致时,按“向高看齐”的原则,对较低的类型进行提升。如: char ch; int i , result ; float f; double d;

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

double

double

double

double

int double

int

double

double

int

double

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

六、数据类型转换2 、赋值转换

C 语言允许通过赋值使赋值号右边表达式值的类型转换为其左边变量的类型。如上图 1 中,右边表达式的值为 double类型,但经过赋值运算却转换为 int 类型。即 result 中的最终结果为一个整数。

即:赋值转换具有强制性,赋值号右边的表达式要强制转换成左边变量的形式。

又如: int a; a=5.8; printf(“%d”, a ); 则输出 5。

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

六、数据类型转换3 、不同类型数据的显式转换

在 C 语言中,有一种“强制类型转换运算符”,它能将某以类型的变量强制转换为另一种类型,它的一般形式为: (类型标识符)表达式

如: printf ( “ %c ”, (char)(67-1.2)); 会输出 A。

如: float x=4.5; int i; i=(int)x; printf(“%d %f “, i, x); 则会输出 4 4.5000

即: x的值仍为 4.5 , i的值为 x值的整数部分。又如: ( int ) (x+y) 不能写为 int(x+y)

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

六、数据类型转换4 、输出转换

在输出语句中,也会发生隐式转换。如:float f=5.8; printf(“%d”, f ); 则输

出 5。如果是 int a=5.8; printf(“%f”, a);

在编译时不用出错,但不会输出结果。再如: int i = - 1; printf(“%u”, i );

则会输出()。- 1 的原码: 000000000000001 ,补码为: 11

1 1111 1111 1111 存储形式为 16 个 1。故当作为无符号数输出时,应输出 65535 ( 216-1 )。

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

巩固练习1 、变量 a 是 int 类型,并执行了语句: a=’A’+1.6;

则正确的叙述是()A ) a 的值是字符 C B )不允许字符型和浮点型相加

C ) a的值是浮点型 D) a的值是字符’ A’的 ASCII 码加上 1。2 、设 a 、 b均为 double型变量,且 a=5.5 ; b=2.5 ,则表达式( int ) a+b/b 的值是()A ) 6.500000 B ) 6 C ) 5.500000 D) 6.000000

3 、已知 int m=3,n=4, x; 则 x= -m++; x=x+8/++m; 后, x=( ), m =( )。

-2 5

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

七、关系运算符和关系表达式关系运算符:

关系运算符 作用 优先级 运算对

象 运算结果 结合性

> 大于

1 整型实型或字符型

关系成立则为真,结果为 1关系不成立则为假

,结果为 0

自左向右

< 小于

>= 大于等于

<= 小于等于

= = 等于2

!= 不等于

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

七、关系运算符和关系表达式 1 、由关系运算符和()将操作数(也叫运算量)连接起来的式子叫逻辑表达式。

2 、关系运算符的优先级低于算术运算符,高于赋值运算符。(若一个式子中既有关系运算、赋值运算,又有算术运算,先做算术运算,再做关系运算,最后做赋值运算。)

如: a=1+2>3-1 等价于: a=(( 1+2 ) >( 3-1 )) 关系成立, a的值为 1。

又如: 2= =3 表达式值为 0 , 10!= 9 表达式值为 1 , 2>=3 表达式值为 0。

又如: 2== 3<=5 等价于 2==( 3< =5 ) 表达式值为 0。又如: z=3+1==2+3- 1<=5+6*2 先做算术运算(先乘除取余,后

加减,相同级别的从左向右做):z=3+1==2+3-1<=5+12 z=4==4<=17 后做关系运算(先 >、 <、 >=、 <=,后==、!=): z=4==

1 z=0 最后做赋值运算。3、特别要注意“==”与“=”的区别。

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

八、逻辑运算和逻辑表达式逻辑运算符:

逻辑运算符 作用 运算对

象运算结

果 优先级 结合性

! 逻辑非 整型实型

或字符型

0 或 1

1自右向

&& 逻辑与 2 自左向右|| 逻辑或 3

a b ! a ! b a && b a || b

非 0( T )

非 0( T ) 0 0 1 1

非 0( T )

0( F ) 0 1 0 1

0 ( F ) 非 0( T ) 1 0 0 1

0 ( F ) 0( F ) 1 1 0 0

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

八、逻辑运算和逻辑表达式1 、参与逻辑运算时,非 0 为真, 0 为假。结果真为 1 ,假为 0。

2 、用逻辑运算符和()将操作数(运算量)连接起来的式子称为逻辑表达式。

3、优先级:逻辑非(!) > 算术运算符 > 关系运算符 > 逻辑与( &&) > 逻辑非( ||) > 赋值运算符。

4 、注意:若 &&的第一个操作数为 0,则第二个操作数不再计算;若 ||的第一个操作符为非 0 ,则第二个操作数不再计算。如例 3。

如: 5&&2 3&&0 0&&0 1&&5 1&&0 0&& .2 5 || 2 3 || 0 0 || 0 1 || 5 1 || 0 0 || .2!5 !0 !1 ! .5

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

八、逻辑运算和逻辑表达式例 1 :已有定义: int x=3, y=4, z=5; 则表达式 !(x+y)+z-1&&y+z/2 的值是()

A ) 6 B ) 0 C ) 2 D) 1

例 2 、语句 printf(“%d”, (a=4) && (b=-3) ) 的输出结果是()【注】

例 3、设 x, y, z 均为 int 型变量,则执行语句 x=y=3 ; t=++x || ++y 后, y的值为()【注】

例 4、 10<x≤100 或 x<0 的 C语言表达式为:

1

3

【注】! 7+ 5- 1&&4+ 5/2 0+ 5- 1&&4+ 2 4&&6 1

【注】 ( x>10 && x<=100 ) || ( x<0 )

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

八、逻辑运算和逻辑表达式例 5、写出点( x, y)落在图 2环形部分的 C语言表达式。

练 1 、以下程序的输出结果是() main() {int a=4, b=5, c=0, d; d=!a && !b || !c;

printf(“%d”,d ); }练 2 、设 a, b, c, d, m, n均为 int 类型变量,且 a=5 , b=

6 , c=7 , d=8 , m=2 , n=2 ,则逻辑表达式( m=a>b ) &&( n=c>d)运算后, n的值为()A) 0 B ) 1 C ) 2 D) 3

1

2

21x

y

( x*x+y*y>=1 && x*x+y*y<=4 ) == 1

1

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

八、逻辑运算和逻辑表达式练 3 、若变量 c 为 char类型,能判断出 c 为小写字母的表达式是

()A ) a<=c<=z B )’ a’<=c<=’z’ C ) (c>=’a’ ) || (c<=’z’ ) D) (c>=’a’) && (c<=’z’)

练 4 、以下程序的输出结果是()main(){int a=5, b=4, c=3,d; d=(a>b>c);

printf(“%d”, d ) ; }练 5 、设 y是 int 型变量,写出判断 y 为奇数的关系表达式()。练 6 、若已知 a=10, b=20, 则表达式! a<b 的值是()练 7 、若 x 和 y代表整型数,写出表示数学关系 |x-y| < 2 的 C

语言表达式()

0

y%2==1

1

(x-y)>0&&(x-y)<2 || (x-y)<0&&(x-y)>-2

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

九、逗号运算符和逗号表达式C 语言提供一种特殊的运算符――逗号运算符。用它将两个表达式连接起来,称为逗号表达式。逗号运算符又称为顺序求值运算符。逗号表达式的一般形式为:

表达式 1,表达式 21 、逗号表达式的求解过程为:先求解表达式 1 ,再求解表达式 2 。

结合性自左向右。2、整个逗号表达式的值是表达式 2的值。3、逗号运算符的优先级是所有运算符中最低的。 如: a=(3+5,6+8); 则 a 的值为 14 。 又如: a=3*5, a*4 先求 a=3*5, 再求 a*4, 故整个逗号表达式的值为: 60。

4 、逗号表达式可扩展为:表达式 1 ,表达式 2 ,表达式 3 ,……,表达式 n它的运算规则为依次求解表达式 1 到表达式 n 的值,整个表达式的值为表达式 n 的值。如( a=3*5,a+10 ) ,a/5 , a*2 的值为 30

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

九、逗号运算符和逗号表达式例 1 、假定 x 和 y为 double类型,则表达式 x=2,y=x+3/2 的值是

()A ) 3.500000 B ) 3 C ) 2.000000 D) 3.0

00000例 2 、若已定义 x,y为 int 类型,则表达式: x=2, y=x+3/2.0 的

值是()

B

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

十、条件运算符和条件表达式又叫问号运算符与问号表达式条件运算符有三个操作对象,称三目(元)运算符,条件表达式的一

般形式为:表达式 1?表达式 2:表达式 3

说明:1、条件运算符的求解顺序是:

2、条件运算符的值比关系运算和算术运算都低,但高于赋值运算符。如: max=a>b? a:b ; 就等价于: max=(a>b? a:b);

3 、条件运算符的结合方向是“自右向左”的。 如: a>b? a:c>d?c:d 等价于: a>b?a:(c>d?c:d )4 、表达式 2和表达式 3不仅可以是数值表达式,还可以是赋值表达式或函数

表达式。如: a > b ? ( a =100 ) : ( b =100 ) ; a > b ? printf ( “ %d ” , a ) : printf ( “%d” ,

b );

若值为非 0 数,则整个表达式的值为表达式 2的值若值为 0,则整个表达式的值为表达式 3的值

求表达式 1的值

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

十、条件运算符和条件表达式例 1 、若 x=1, y=2, z=3 ,计算 x > y ? x : (y > z ? y : z)的值。

先计算 y>z=0 ,故括号中的部分值为 3;剩余部分为:x > y ? x : 3 ,显然值应为 3。

例 2、 x, y , z值为上题所给,计算 x = =y ? ( x > z ? x : z ) : y

2

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

运算符与表达式总结运算符 作用 操作数个数 优先级 结合性

() 括号   1 自内而外

!、 + 、 - 、 ++ 、 -- 、(类型)

逻辑非、正、负、自加、自减、强制类型转换 1 (单目运算符) 2 自右向左

* 、 / 、 % 算术乘、除、取余

2 (双目运算符)

3

自左向右

+ 、 - 、 算术加、减 4

> 、 >= 、 < 、 <= 关系运算 5

= = 、 != 关系运算 6

&& 逻辑与 7

|| 逻辑或 8

? : 条件运算符 3 (三目运算符) 9自右向左= 、 += 、 -= 、 *= 、

/= 、 %=赋值运算符 2 (双目运算符) 10

, 逗号运算符 多目 11 自左向右

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

运算符与表达式总结说明:1 、不同级别的运算符,其运算顺序是由优先级决定的。2 、同一优先级的运算符,其运算顺序是由结合方向决

定的。3、不同的运算符要求有不同的运算对象个数。4、各类运算符的优先级可大致归纳为: 括号 → 单目运算符 → 算术运算符(先乘除,后

加减) → 关系运算符 → 逻辑运算符(不包括!) → 条件运算符 → 赋值运算符 →逗号运算符

5 、要求在书写时,可适当使用(),以免产生不必要的麻烦。