ImageVerifierCode 换一换
格式:DOC , 页数:23 ,大小:179KB ,
资源ID:6995658      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6995658.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第5章 数据类型和表达式.doc)为本站会员(gnk289057)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

第5章 数据类型和表达式.doc

1、1第五章 数据类型和表达式通过前面的学习,我们已经了解了 C 语言的基本内容,并且使用了一些数据类型编写一些简单的程序,实现对数据的处理。在用 C 语言编写程序时需要考虑:计算机能处理哪些数据?对这些数据能做哪些操作?通过怎样的操作步骤才能完成给定的工作?这 3 个问题分别对应数据表达、运算和流程控制。下面我们讨论前两个问题。首先介绍 C 语言中可以使用的数据类型:整型基本数据类型 字符型 单精度实型(浮点型) 双精度数组结构数据类型 构造数据类型 联合枚举指针类型空类型C 语言程序中所使用的每个数据都属于上述某一种类型,在编程时要正确定义和使用数据。其次,在 C 语言中,对数据的操作就是对数

2、据进行运算,C 语言提供了许多运算符,可以对不同类型的数据进行处理。这些运算符与数据组合后便形成了表达式。5、1 基本数据类型C 语言的 4 种基本类型是:整型、字符型、单精度浮点型和双精度浮点型,见表5.1表 5. 1 基本数据类型类 别 名 称 类型名 数据长度 取值范围有符号整型 int 32 位 略有符号短整型 short int 16 位 有符号长整型 long int 32 位 整 型 无符号整型 unsignedint 32 位 无符号短整型 unsigned shortint 16 位 无符号长整型 unsigned longint 32 位 字符型 字符型 char 8 位

3、实 型 单精度浮点型 float 32 位 ( 浮点型 ) 双精度浮点型 double 64 位 2注 :方括号中的内容可以省略1、整型整型是指不存在小数部分的数据类型。见上表 5.1 的整型部分。无符号的整型数据指不带符号的整型,即零或正整数,不包括负数。2、字符型每个字符型数据在内存中占用一个字节,用于存储它的 ASCII 码。所以 C 语言中的字符具有数值特征,不但可以写成字符常量的形式,还可以用相应的 ASCII 码表示,即可以用整数来表示字符。例如:设 ch 是字符型变量,字符型常量 A 的 ASCII 码值是 65,则 ch = A 和 ch = 65 等价。既然字符变量的值可以是

4、字符或整数,它就可以被定义成整型变量;同时整型变量的值也可以是字符型数据,它可以被定义成字符型变量。即整型变量和字符型变量的定义和值都可以互相交换。互换整型变量和字符型变量的定义和值时,整型数据的取值范围是有效的 ASCII 码。3、实型实数类型又称为浮点型,指有小数部分的数。见上表 5.1 的实型部分。单精度和双精度的区别在于数据的精度和取值范围有所不同。双精度(double)比单精度(float)的精度高,取值范围大。实型常量的类型都是双精度浮点型。实数在计算机中只能近似表示,运算中也会产生误差。4、数据存储计算机处理的所有信息都以二进制形式表示(数值只能用 0、1,以原码、反码、补码等方

5、式表示) 。表 5.1 中的数据长度 32 位是说 32 位二进制数(关于数在计算机里的表示,请参照教材有关章节和有关书籍) 。8 位二进制数是一个字节,故 32 位二进制数是 4 个字节,16 位二进制是两个字节,64 位二进制是 8 个字节。位数越多所表示的数字越大,数值越精确。52 常量和变量C 语言中,数据有常量和变量之分。在程序运行过程中,其值不能改变的量称为常量;其值可以改变的量称为变量。521 常量常量的类型由书写格式决定。例如:-10、123L(长整型)、017(八进制)、0x1f(十六进制)是整型常量,-123.23、4.3e-3 是实型常量,而a、 n、 9是字符型常量。1

6、、符号常量:可以用一个标识符来表示一个常量,称为符号常量。例 51 输入球的半径,计算球的表面积和体积#include #define PI 3.14 /定义符号常量 PIint main()3double r,s,v;printf(“input r: “); /输入提示scanf(“%lf“,s = 4.0*PI*r*r; /计算球的表面积v = 4.0/3.0*PI*r*r*r; /计算球的体积printf(“s = %f, v = %fn“,s,v);return 0;运行结果:input r: 1.0s = 12.56000, v = 4.186667用 #define 命令定义符号常

7、量 PI,它代表 3.14。定义后,凡在该程序中出现 PI 的地方,PI 都代表 3.14,这样符号常量 PI 就可以和实型常量 3.14 一样进行运算。#define 命令的末尾不加分号。定义符号常量后,就可以引用它,但不能改变它的值。使用符号常量有助于提高程序的可读性,而且修改方便,便于移植。例如:上面的程序中多处用到 PI,开始取 3.14,以后为了提高计算精度, PI 值取 3.1415926,在这种情况下,如果直接使用常数 3.14,就要对程序的多处 3.14 进行修改成 3.1415926。而使用符号常量,只需改动一处,即改变符号常量的定义(将最上面的 PI 定义改成 PI 3.1

8、415926) 。符号常量名中的英文字母一般使用大写字母,如 PI。2、整型常量只要整型常量的值不超过表 6.2 中列出的整型数据的取值范围,就是合法的常量。整型常量就是常说的整数。(1)整数的表示C 语言中的整数有十进制、八进制和十六进制 3 种表现形式。a、 十进制整数由正、负号和阿拉伯数字 09 组成,但首位数字不能是 0。b、八进制整数由正、负号和阿拉泊数字 07 组成,但首位数字必须是 0。c、 十六进制整数由正、负号和阿拉伯数字 09、英文字符 af 或 AF 组成,首位数字前必须有前缀 0x 或 0X。例如,10,010,0x10 分别为十进制、八进制、十六进制整数,它们表示着不

9、同数值的整数。10 是十进制数值,010 的十进制数值是 8,0x10 的十进制数值是 16。又如,16,020,0X10 分别为十进制、八进制和十六进制整数,它们表示着同一个数值的整数,即十进制数值 16。0386 和 0x1g 是非法的整型常量,因为 0386 作为八进制整数含有非法数字 8,而0x1g 作为十六进制整数含有非法字符 g。任何一个整数都可以用 3 种形式来表示,这并不影响它的数值。例如,表示十进制数值是 10 的整数,可以采用 10、012 或 0Xa,所谓十进制、八进制和十六进制只是整数数值的 3 种表现形式而已。4作 业:将下面各数用八进制和十六进制数表示1、(10)1

10、0 =( )8=( )16 十进制化八进制: 8 10 2 = 12 八进制化十六进制:12=1 * 8 1 + 2 * 80 = 101注意:由于 16 进制和十进制超过 10 的数无法同样表示,故将 16 进制的 10 用 a 表示。即10 = a 11 = b 12 = c 13 = d 14 = e 15 = f因此上面的十进制 10 用十六进制表示就是 a2、(32)10 = ( )8 = ( )16 十进制化八进制: 8 32 0 = 40 十进制化十六进制:16 32 0 = 204 23、(75)10 = ( )8 = ( )16 8 75 3 =113 十进制化十六进制:16

11、 75 11 = 4 b9 1 41 十六进制的 11 是 b4、(-617)10 = ( )8 = ( )16 8 6 1 7 1 617 的八进制是 11518 7 7 5 八进制 1151 写成机器里的二进制原码是:8 9 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 11 符号位 1 1 5 1 整型正值符号位 0(-617) 变成负数求补码,即反码加 1:(3 位一个 8 进制数) 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 1 负值符号位 11 7 6 6 2 7(4 位一个 16 进制数) 1 1 1 1 1 1 0 1 1 0 0 1 0 1

12、1 117(8) 15(8) 11(8) 7(8)15(10) 13(10) 9(10) 7(10)f (16) d (16) 9(16) 7(16)故 ( -617 )10 = ( 176627 )8 = ( f d 9 7 )16 5、(-111)10 = ( )8 = ( )166、( 2483 )10 = ( )8 = ( )167、( -28654 )10 = ( )8 = ( )168、( 21003 )10 = ( )8 = ( )16(2)整数的类型a、根据整数后的字母确定它的类型。后缀 l 或 L 表示 long 型常量,如-12L,0123456790L;后缀 u 或 U

13、表示 unsigned 型常量,如 12u,034u,0x2fdU;后缀 l 和 u 或 L 和 U 表示 unsigned long 型常量,如 4294967295LU( 后缀 LU 表示无符号长整型 )b、根据整型常量的值确定它的类型。例如,取值在-3276832767 之间的整数是 short型常量等。53、实型常量实型常量即常说的实数(1) 实数的表示实数又称为浮点数,可以用十进制浮点表示法和科学计算法表示。a、 浮点表示法: 实数由正号、负号、阿拉泊数字 09 和小数点组成,必须有小数点,并且小数点的前、后至少一边要有数字。实数的浮点表示法又称实数的小数形式。b、科学计数法:实数由

14、正号、负号、数字和字母 e ( 或 E )组成,e 是指数的标志,在 e 之前要有数据,e 之后的指数只能是整数。实数的科学计数法又称实数的指数形式。例如:3.14 和 6.026E-27 是合法的实数,而 0.2E2.3 和 E-5 是非法的实数。科学计数法一般用于表示很大或很小的数,如普朗克常数 6.026*10-27 表示为6.026E-27,也可表示为 60.26e-28、602.6e-29 或 0.6026e-26 。(2)实数的类型都是双精度浮点型。4、字符型常量a、字符型常量和 ASCII 字符集字符型常量指单个字符,用一对单引号( )及其所括起来的字符来表示。在ASCCI 字符

15、集(见教材附录)中列出了所有可以使用的字符,每个字符在内存中占用一个字节,用于存储它的 ASCII 码值。所以 C 语言中的字符具有数值特征,可以像整数一样参加运算,此时相当于对字符的 ASCII 码进行运算。例如,字符A 的 ASCII 码是 65,则A+1=66 ,对应于字符B。这是因为所有大写字母的 ASCII 码按升序连续排列,字符A的 ASCII 码加 1,就是字符B的 ASCII。b、转义字符有一些字符,如回车符,退格符等控制符号,它们不能在屏幕上显示,也无法从键盘上输入,只能用转义字符来表示。转义字符由反斜杠加上一个字符或数字组成,它把反斜杠后面的字符或数字转换成别的意义。虽然转

16、义字符形式上由多个字符组成,但它们是字符常量,只代表一个字符,它的使用方法与其他字符常量相同。见表 5.2 列举了常见的转义字符。表 5. 2 转义字符字 符 含 义 ASCII 代马n 换行 ,将当前位置移到下一行开头 10t 水平制表(跳到下一个 tab 位置) 横向跳格 9b 退格,将当前位置移到前一列 8r 回车,将当前位置移到本行开头 13f 换页,将当前位置移到下一页开头 12 反斜杠 “” 92 ” 双引号字符 34 单引号(撇号)字符 39ddd 13 位八进制整数所代表的字符 xhh 12 位十六进制整数所代表的字符6表 5.2 中最后两行采用 ASCII 码(八进制、十六进

17、制)表示一个字符。例如,102表示 ASCII 码是八进制数 102 的字符,即字母B; x41 的表示 ASCII 码是十六进制数41 的字符,即字母A 。这样, ASCII 字符集中所有的字符都可以用转义字符表示。如:#include main() printf(“ ab ct derftgn”);printf(“htibbj kn”);输出: 1 2 3 4 5 6 7 8 9 10 输出位f g d eh j kt 跳格的绝对位置 8 个。但,如果已经有 2 个了,就跳 6 格再接着打印跟在后面的字符,如下:1、前面有 2 个,如:21tx / 输出 6 个空格则会输出:21 空空空空

18、空空 x / 第 9 个位置上打印 x2、前面没有,如: tx / 输出 8 个空格则会输出:空空空空空空空空 x / 第 9 个位置上打印 x3、前面有 7 个,如:1234567t / 输出 1 个空格则会输出:1234567 x / 第 9 个位置上打印 x4、前面有 8 个,如:12345678tX / 输出 8 个空格 则会输出:12345678X / 第 17 个位置上打印 x5、前面有 9 个,如:123456789tX / 输出 7 个空格 则会输出:123456789 空空空空空空空 X / 第 17 个位置上打印 x举例:#include main() printf(“21

19、t3n”); /出现 6 个空格,第 9 位是 3printf(“t3n”); /出现 8 个空格,第 9 位是 3 printf(“1234567txn”); /出现 1 个空格,第 9 位是 xprintf(“12345678txn”); /出现 8 个空格,第 17 位是 xprintf(“123456789txn”); /出现 7 个空格,第 17 位是 x522 变量在程序运行过程中,其值可以改变的量称为变量。C 语言中遇到的所有变量都必须先定义,然后才能使用。定义变量时需要确定变量的名字和数据类型。1、变量名变量名应该采用一个合法的表示符,如 average(平均) 、price(

20、价格) 、sum(总数)等,其中的英文字母习惯用小写字母。变量名的选择应尽量遵循“见名知义” 的原则,用有明确含义的英文单词(或拼音)来作为名字,这样看到变量名就知道它代表的含义,便于自己或他人阅读程序。 变量名中的英文字母习惯上用小写字母。72、变量的类型C 语言中,常量的数据类型通常由书写格式决定,而变量的数据类型在定义时指定。用于定义变量的基本数据类型见表 5.1 所示。3、变量的定义方法变量定义的一般形式是: 类型名 变量表;类型名必须是有效的数据类型,变量表中可以有一个变量名或由逗号间隔的多个变量名。定义变量需要确定变量的名字和数据类型,每个变量必须有一个名字作为标识,变量名代表内存

21、中的一个存储单元,用于存放该变量的值,而该存储单元的大小由变量的类型决定。例如:字符型变量用来存放字符,需个 1 个字节,而整型变量用来存放整数,需 4 各字节。4、变量的使用定义变量后,就可以使用它,在程序中使用变量,就是使用该变量所代表的存储单元。对变量的使用,包括赋值和引用。在定义变量后,首先应该对它赋值,然后就可以在该程序中引用它的值,必要时还可以改变它的值,即再次赋值。对变量的赋值有 3 种方法。(1)在定义变量时对它赋值,称为变量赋初值。例如:int a = 5 , b = 3 ;(2)在可执行语句中,用赋值表达式对变量赋值。例如:int a , b ;a = 5;b = 3;(3

22、)调用输入函数对变量赋值。例如:int a , b;scanf(“%d%d”,运行时输入: 5 3 对变量 a 和 b 分别赋值 5 和 3。53 数据的输入和输出C 语言中,数据的输入和输出都是通过函数调用来实现的。531 整型数据的输入和输出调用函数 scanf()和 printf()实现整型数据的输入和输出时,应根据数据的类型和输入输出的形式,在函数调用的格式控制字符中使用相应的格式控制说明,见表 5.3 所示。基本的格式控制说明有:%d ( 以十进制形式输入 /输出一个整数)、%o (以八进制形式输入/输出一个整数) 、%x (以十六进制形式输入/输出一个整数),%u (以十进制形式输

23、入/输出一个无符号整数)。在格式控制说明中,可以加宽度限定词,指定整型数据的输出宽度。例如:输出格式控制说明为%md,指定了数据的输出宽度为 m( 包括符号位 ),若数据的实际位8数(含符号位 )小于 m,则左侧补空格,若大于 m,则按实际位数输出。表 5. 3 格式控制说明 ( 整型数据 )数据类型 输入输出形式 十进制 八进制 十六进制int %d %o %xlong %ld %lo %lxunsigned %u %o %xunsigned long %lu %lo %lx例 52 使用基本格式控制说明%d、%o、%x 输入输出整型数据#include int main() printf(

24、“%d,%o,%xn“,10,10,10);printf(“%d,%d,%dn“,10,010,0x10);printf(“%d,%xn“,012,012);return 0;运行结果: 10,12,a10,8,1610,a可以看出数据以十进制、八进制、十六进制 3 种形式输出一个整数;输出结果以格式控制说明为准。例如,八进制数 012 就可以用十进制和十六进制的形式输出。因此,不管一个整数采用哪种表现形式,它的数值是确定的。 例 53 用%o 输入整型数据示例#include int main() int a,b;printf(“input a,b: “);scanf(“%o%d“, / 输

25、进一个 8 进制数和一个十进制数printf(“%d %5dn“,a,b); / %5d 指定变量 b 的输出宽度为 5return 0; 运行结果:input a,b: 17 17 / 第一个 17 为 8 进制数,第二个 17 是十进制数15 17 / 8 进制 17,十进制是 15 输入时,用格式控制说明指定的形式来读入数据,以八进制形式读入 17,相当于将017(即十进制 15)赋值给变量 a。以%5d 输出 b 的值 17,左端补了 3 个空格。532 实型数据的输入和输出调用函数 scanf()和 printf()实现实型数据的输入和输出时,在函数调用的格式控制字9符串中使用相应的

26、格式控制说明,见表 5.4 所示。表 5. 4 格式控制说明( 实型数据 )函数 数据类型 格式 含义printf float %f 以小数形式输出浮点数(保留 6 位小数)double %e 以指数形式输出浮点数(小数点前面有且仅有一位非零的数字 %fscanf float %e 以小数形式或指数形式输入一个单精度浮点数%lfdouble %le 以小数形式或指数形式输入一个双精度浮点数输出浮点数时,单精度和双精度浮点型数据使用相同的格式控制说明%f 和%e;输入浮点数时,格式控制说明%f 和%e 可以通用。但是,输入 double 型数据时,在格式控制说明中必须加限定字符 l ( l 是

27、long 的首字母 )。双精度 double 型数据的输入格式控制说明必须用%lf 或%le 。在输出格式控制说明中,可以加宽度限制,指定实数数据的输出宽度。例如,输出格式控制说明%m.nf ,指定输出浮点型数据时,保留 n 位小数,且输出宽度是 m ( 包括符号位和小数点 )。若数据的实际位数小于 m,左端补空格,若大于 m,按实际位数输出。例 54 输出数值#include main() double pi=3.1415926;printf(“%f, %en“,pi,pi);printf(“%5.3f, %5.2f, %.2fn“,pi,pi,pi);return 0;运行结果:3.141

28、593, 3.141593e+0003.142, 3.14, 3.14输出 pi 的值 3.1415926 时,%5.3f 输出 3.142 (保留 3 位小数),%5.2f 输出 3.14(保留2 位小数,左端补 1 个空格),%.2f 输出 3.14(保留 2 位小数,按实际位数)。533 字符型数据的输入和输出字符的输入输出可以调用函数 getchar()、putchar()和 scanf()、printf() 。getchar()函数和 putchar()函数只能处理单个字符的输入和输出。scanf()函数和 printf()函数除处理整型数据和浮点型数据的输入输出外,也可以处理字符型

29、数据的输入和输出。此时,在函数调用格式控制字符串中相应的格式控制说明用 %c 。 10例 55 输入输出字符#include main() char ch1,ch2,ch3;scanf(“%c%c%c“,printf(“%c %c %c %c %c n“,ch1,#,ch2,#,ch3);运行结果: 输入 abc输出 a # b # c若输入 a bc输出 a # # b若 printf() 函数里是连续的 %c%c%c,则输入多个字符时,这些字符之间不能有间隔。如果使用了间隔符(如空格 ) 。由于它本身也是字符,该间隔符就被作为输入字符。输入字符 a 后,输入了一个空格,所以 ch2 的值是

30、 ,ch3 的值是 b 。 与字符型常量在程序中的表示不同,输入/输出字符时,字符两侧没有单引号(如ch1、ch2、ch3 ) 。C 语言中,一个字符型数据在内存中用一个字节存储它的 ASCII 码,它即可以按字符形式输出,也可以按整型形式输出。按字符形式输出时,可以调用函数 putchar()或 printf()(格式控制说明用 %c) ,系统自动将存储的 ASCII 码转换为相应的字符后输出;按整数形式输出时,可以调用函数 printf()(格式控制说明选用 %d、%o、%x 等) ,直接输出它的 ASCII 码。同样,一个整型(在有效的 ASCII 码范围内)也可以按字符形式输出,此时,

31、输出字符的 ASCII 码等于该数。例 56 已知字符 b 的 ASCII 码值是 98 , A 的 ASCII 码值是 65,写出下列程序的运行结果。#include main() char ch = b;printf(“%c,%dn“,b,b);printf(“%c,%dn“,98,98);printf(“%c,%dn“,97,b-1);printf(“%c,%dn“,ch-a+A,ch-a+A);return 0;运行结果: b , 98b , 98a , 97B,66程序中包括了一些字符运算,这在实际编程中是很有用的。例如,如变量 ch 的值11是小写字母 a z ,则运算 ch -

32、a + A 把小写字母转换为大写字母。又如,若变量 ch 的值是数字字符0 9 ,运算 ch 0 把数字字符转换为数字;若变量val 的值是数字 09,运算 val + 0 把数字转换为数字字符。练习 1、输入一个十进制数,输出相应的八进制数和十六进制数。例如,输入 31,输出 37 和 1F。练习 2、在例 5.2 源程序 2 中,如果将程序中的 scanf ( “ %o%d “, 改为:scanf (“ %x%d “, 输入不变,输出是什么?练习 3、如果变量 ch 的值是大写字母,怎样的运算可以把它转换为小写字母?54 类型转换在 C 语言中,不同类型的数据可以混合运算。但这些数据首先要

33、换成同一类,然后再作运算。数据类型的转换包括自动转换和强制转换。自动转换由 C 语言编译系统自动完成,强制转换则通过特定的运算完成。541 自动类型转换1、非赋值运算的类型转换数据类型的自动转换需遵循的规则见图 5.1 所示。为保证运算的精度不降低,采用以下方法。高 double floatunsigned long long unsigned unsigned short 低 int char ,short 图 5.1 数据类型自动转换规则 (1)水平方向的转换:所有的 char 型和 short 型自动转换成 int 型,所有的 unsigned short 型自动转换成 unsigned

34、 型,所有的 long 型自动地转换成 unsigned long 型,所有的float 型自动地转换成 double 型。(2)垂直方向的转换:经过水平方向的转换,如果参加运算的数据类型仍然不相同,再将这些数据自动转换成其中级别最高的类型。例如,设变量 ac 的类型是 char,变量 bi 的类型是 int,变量 d 的类型是 double,求解表达式 ac + bi d 。运算次序是:先计算 ac + bi ,将 ac 转换为 int 型后求和,结果是 int 型;再将 ac + bi 的和转换为 double 型,再与 d 相减,结果是双精度 double 型。2、赋值运算的类型转换赋值

35、运算时,将赋值号右侧表达式的类型自动转换成赋值号左侧变量的类型。例如:设变量 x 的类型是 double,计算表达式 x = 1 。运算时,先将 int 型常量 1转换成 double 型常量 1.0,然后赋值给 x ,结果是 double 型。又如,设变量 a 的类型是 short,变量 b 的类型是 char,变量 c 的类型是 long,求解表达式 c = a + b 。运算次序是:先计算 a + b ,将 a 和 b 转换成 int 型后求和,结果是 int 型;再将 a + b 的和转换成变量 c 的类型 long,然后赋值给 c,结果是 long 型。12利用这条规则时,如果赋值号

36、右侧表达式的类型比赋值号左侧变量的类型级别高,运算精度会降低。例如:,设变量 ai 的类型是 int,计算表达式 ai = 2.56 。运算时,先将 double 型常量 2.56 转换成 int 型常量 2,然后赋值给 ai,结果是 int 型。在赋值运算时,赋值号两侧数据的类型最好相同,至少右侧数据的类型比左侧数据的类型级别低,或者右侧数据的值在左侧变量的取值范围内,否则会导致运算精度降低,甚至出现意想不到的结果。542 强制类型转换使用强制类型转换运算符,可以将一个表达式转换成给定的类型。其一般形式是:( 类型名 ) 表达式;例如:设 i 是 int 型变量,( double ) i 将

37、 i 的值转换成 double 型,而( int )3.8 将 3.8转换成 int 型,得到 3。无论是自动类型转换,还是强制类型转换,都是为了本次运算的需要,对数据的类型进行临时转换,并没有改善数据的定义。例如,表达式 ( double ) i 的类型是double,而 i 的类型并没有改变,仍然是 int 。强制类型转换是运算而不是函数,故 ( int ) x 不能写成 int ( x )。强制类型转换运算的优先级较高,与自增运算符 + 相同,它的结合性是从右到左。例如:( int ) 3.8 + 1.3 等价于 ( int ) 3.8 ) + 1.3,它的值是 4.3,而 ( int

38、) ( 3.8+1.3 ) 的值是 5。 55 表达式551 算术表达式1、算术运算符算术运算符分为单目运算符和双目运算符两类,见表 6.5 所示。单目运算符只需要一个操作数,而双目运算符需要两个操作数。表 5 . 5 算术运算符目 数 单 目 双 目运算符 + + - - + - + - * / %名 称 自增 自减 正值 负值 加 减 乘 除 模(求余)2、自增运算符和自减运算符自增运算符 + 和自减运算符 - - 有两个功能。(1)使变量的值增 1 或减 1例如:设 n 是一个整型变量并已赋值,则:+ n 和 n + 都相当于 n = n + 1 ;- - n 和 n - - 都相当于

39、n = n 1 ;(2)取变量的值作为表达式的值。例如:计算表达式 + n 和 n + 的值,则:+ n 的运算顺序是:先执行 n = n + 1,再将 n 的值作为表达式 + n 的值。13n + 的运算顺序是:先将 n 的值作为表达式 n + + 的值,再执行 n = n + 1 ;自增运算符和自减运算符的运算对象只能是变量,不能是常量或表达式。如:3 + 或 + ( i + j ) 都是非法的表达式。3、算术运算符的优先级和结合性在算术四则运算中,遵循“先乘除后加减”的运算规则。同样,在 C 语言中,计算表达式的值也需要按运算符的优先级从高到低顺序计算。例如,表达式 a + b * c

40、相当于 a + ( b * c ) ,这是因为操作数 b 的两侧有运算符 + 和 * ,而 * 的优先级高于 + 。如果操作数两侧运算符的优先级相同,则按结合性(结合方向)决定计算顺序,若结合方向为“从左到右” ,则操作数先与左面的运算符结合;若结合方向为“从右到左”,则操作数先与右面的运算符结合。C 语言中算术运算符的优先级和结合性见表 5.6 所示,同一行实线上的运算符优先级相同,不同行的运算符的优先级按从高到低的次序排列,可以用圆括号来改变运算符的执行次序。表 5.6 部分运算符的优先级和结合性运算符种类 运 算 符 结 合 方 向 优 先 级逻辑运算符 ! 高+ - - + - * (

41、 单目 ) 从右向左(右结合)算术运算符 * / % ( 双目 ) + - ( 双目 )=关系运算符 = ! = 从左向右(左结合)求解时,先计算表达式 y = 3,再将该表达式的值 3 赋给 x,结果使得x 和 y 都赋值为 3;相当于计算 x = 3 和 y = 3 两个赋值表达式。由于赋值运算符的结合性是从右到左,因此,x = ( y = 3 )等价于 x = y = 3,即多个简单赋值运算可以组合为一个连赋值的形式。3、复合赋值运算符赋值运算符分为简单赋值运算符和复合赋值运算符。简单赋值运算符就是” = “,复合赋值运算符又分为复合算术赋值运算符和复合位赋值运算符,在” = “前加上算

42、术运算符就构成了复合算术赋值运算符,见表 5.7 所示。复合位赋值运算符在 5.5.7 节介绍。所以,赋值表达式的一般形式是: 变量 赋值运算符 表达式;15表 5.7 复合算术赋值运算符运 算 符 名 称 等 价 关 系 ( exp 指表达式 )+ = 加赋值 x + = exp 等价于 x = x + ( exp )- = 减赋值 x - = exp 等价于 x = x ( exp )* = 乘赋值 x * = exp 等价于 x = x * ( exp )/ = 除赋值 x / = exp 等价于 x = x / ( exp )% = 求余赋值 x % = exp 等价于 x = x %

43、 ( exp )注:exp 指数表达式x * = y 3 等价于 x = x * ( y 3 ),而不是 x = x * y 3 553 关系表达式1、关系运算符关系运算符(见表 5.8 所示)是双目运算符,用于对两个操作数进行比较。表 5.8 关系运算符运 算 符 = = = ! =名 称 小于 小于或等于 大于 大于或等于 等于 不等于优先级 高 低关系运算符的优先级低于算术运算符,高于赋值运算符和逗号运算符,它的结合方向是从左向右(见表 5.6) 。例如,设 a、b、c 是整型变量, ch 是字符型变量,则:(1)a b = = c 等价于 ( a b ) = = c(2)d = a b

44、 等价于 d = ( a b )(3)ch a + 1 等价于 ch ( a + 1 )(4)d = a + b c 等价于 d = ( ( a + b ) c )(5)3 = x = 5 等价于 ( 3 int main() char ch = w; / w 的 ASCII 码十进制为 119int a = 2,b = 3,c = 1,d,x = 10;printf(“%d “,ab=c); /a 不大于 b 为假得 0 ,而 0 是不等于 c(c=1)的,所以结果是假 0printf(“%d “,d=ab); /a 不大于 b 得假 0,而 0 赋给 d,d 是 0,结果是 0printf

45、(“%d “,cha+1); / a是 97,加 1 为 98。ch 为 w 值是 119。119 大于 98,结果是真 1printf(“%d “,d=a+bc);/ a+b 是 5,5 是大于 c 的,得真 1,真 1 赋给 d,结果是真 116printf(“%d “,b-1=a!=c);/ b-1 得 2,2 等于 a 得真 1,1 应得 c(1),但这里是!=故得假 0printf(“%dn“,3= 3 ) int a = 2,b = 0,c = 0;float x = 3.0;printf(“%d“,a / 有一个假,则为假,结果是 0printf(“%d“,a|b /按优先级先/

46、 按优先级先!后 /a|3 是真,以后无论是假还是真,结果都是 1,因为真 1+1 或 0 是真1printf(“%d“,!(x=2);/ x= =2 是假,非( ! )假( 0 ) 是真 1printf(“%d“,!x=2);/ !x 是假 0,0 = = 2 是假 0 printf(“%dn“,ch|b); / w 的 ASCII 码十进制为 119 为非 0 真 1,真 1 或( | )假,还是真 1return 0;运行结果:0 1 0 1 1 0 1程序中字符型变量 ch 的值是w (其 ASCII 码值不为 0) ,整型变量 a 的值是 2,浮点型变量 x 的值是 3.0,都是非 0 的数,在逻辑运算时,相当于“真” ,整型变量 b 和18c 的值都是 0,在逻辑运算时,相当于 “假” ,而逻辑运算的结果只能是 1 或 0。!( x = =

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报