1、第3章 数据类型、运算符与表达式,第3章 数据类型、运算符与表达式,计算机中数的表示 C语言的基本数据类型 常量和变量 数据类型转换 运算符与表达式,3.0 计算机中数的表示方法,1.十进制:09十个数字组成,逢十进一 2.二进制:01二个数字组成,逢二进一 3.八进制:07八个数字组成,逢八进一 4.十六进制:09、AF十六个数字组成,逢十六进一,计算机中数的表示及进制转换数码、基与权-数码:表示数的符号-基:数码的个数-权:每一位所具有的值 数制,3.0 计算机中数的表示方法,十进制 二进制 八进制 十六进制数,0 0 0 01 1 1 12 10 2 23 11 3 3 4 100 4
2、45 101 5 56 110 6 67 111 7 78 1000 10 89 1001 11 910 1010 12 A11 1011 13 B12 1100 14 C13 1101 15 D14 1110 16 E15 1111 17 F,各种进制之间的转换 二进制、八进制、十六进制转换成十进制 -方法:按权相加,各种进制之间的转换(整数) 二进制、八进制、十六进制转换成十进制 方法:按权相加,十进制转换成二进制、八进制、十六进制,方法:连续除以基,从低到高记录余数,直至商为0,二进制与八进制之间的转换 二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制 八进制转换
3、成二进制:用3位二进制数代替每一位八进制数,例 (1101001)2=(001,101,001)2=(151)8,例 (246)8=(010,100,110)2=(10100110)2,000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7,二进制与十六进制之间的转换 二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制 十六进制转换成二进制:用4位二进制数代替每一位十六进制数,0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A
4、1011 B 1100 C 1101 D 1110 E 1111 F,例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16,例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2,bit和Byte,bit 数位 用b表示Byte 字节 用B表示1 Byte = 8 bit,数值的表示方法原码、反码和补码,原码: 最高位为符号位,其余各位为数值本身的绝对值 反码:正数:反码与原码相同负数:符号位为1,其余位对原码取反 补码:正数:原码、反码、补码相同负数:最高位为1,其余位为原码取反,再对整个数加
5、1,负数补码转换成十进制数:最高位不动,其余位取反十进制再减1,例 补码:11111001取反:10000110=-6值再减1:-6-1=-7,3.1 C语言的数据类型,C 数 据 类 型,基本类型,派生类型,指针类型,字符型char,整型,实型,数组,结构体struct,共用体union,短整型short,长整型long,布尔型 bool,枚举类型enum,空类型void,双长整型long long,基本整型 int,函数类型,复数浮点型,数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作,基本数据类型,整型,字符型,实型,有,无,16,unsigned in
6、t,0 65535,unsigned short,16,0 65535,有,long double,128,-1.2e4932 1.2e4932,VC6.0 基本数据类型,如 #define PRICE 30,常量 定义:程序运行时其值不能改变的量(即常数) 分类: 符号常量:用标识符代表常量 定义格式: #define 符号常量 常量,#define PRICE 30 main() int num,total;num=10;total=num * PRICE; printf(“total=%d“,total); ,运行结果:total=300,3.2 常量和变量,使用符号常量好处: 含义清楚
7、 需要改变一个常量时可以做到“一改全改”,直接常量: 整型常量 实型常量 字符常量 字符串常量,变量 概念:其值可以改变的量 变量名与变量值 变量定义的一般格式:数据类型 变量1,变量2,变量n;,决定分配字节数 和数的表示范围,合法标识符,例: int a,b,c; float data;,标识符就是一个名字,用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。 组成:由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。,什么是标识符?,合法标识符举例 sum, class, li_lei,_total, _31day,不合法标识符举例 Dr.Li, #1
8、23, 5D2, ab, $10,注:标识符区分大小写;变量名一般用小写字母表示;应做到“见名知义”。,数据类型 变量1,变量2,变量n;,int a=1, b-3, c; float data=3.67; char ch=A; int x=1,y=1,z=1; int x=y=z=1;,变量,变量初始化:定义时赋初值,变量定义的一般格式:,变量的使用:先定义,后使用,变量定义位置:一般放在函数开头,例1 int student;stadent=19; /*Undefined symbol stadent in function main */,例2 float a,b,c;c=a%b; /*
9、Ilegal use of floating point in function main */,变量,常变量 常变量定义的一般格式:const 数据类型 变量=常量;,const float pi = 3.1415926; /定义常变量,#define PI 3.1415926 /定义符号常量,3.3 整型数据,整型常量(整常数) 三种形式: 十进制整数:由数字09和正负号表示.如 12,-345,0 八进制整数:由数字0开头,后跟数字07表示.如0123,011 十六进制整数:由0x开头,后跟09,af,AF表示. 如0x123,0Xff,整型常量的类型 在常量后面加字母u或U,认为其是u
10、nsinged int型 在整常量后加字母l或L,认为它是long int 型常量,3.3 整型数据,整型变量 整型数据在内存中存放形式:实际上,在计算机中数值是以补码表示的。一个正数的补码和其原码相同,负数的补码为其绝对值的二进制形式按位取反再加1。,整型变量 整型变量的定义,main() int a,b,c,d;unsigned int u;a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=%d,b+u=%dn”,c,d); ,运行结果: a+u=22,b+u=-14,3.3 整型数据,main() int a,b;a = 32767;b = a + 1;pr
11、intf(“%d,%d“,a,b); ,运行结果: 32767,32768,整型数据的溢出,改过: main() long int a,b;a = 32767;b = a + 1;printf(“ %ld,%ld“,a,b); ,实型常量(实数或浮点数) 表示形式: 十进制小数形式:(必须有小数点) 如0.123, .123, 123.0, 0.0, 123. 指数形式:(e或E之前必须有数字;指数必须为整数)如12.3e3 ,123E2, 1.23e4, e-5, 1.2E-3.5,实型常量的类型 默认double型 在实型常量后加字母f或F,认为是float 型,3.4 实型数据,实型变量
12、 实型数据在内存中存放形式: 按指数形式存在,占4个字节如:float x; x=3.14159;,3.4 实型数据,3.4 实型数据,实型变量的分类:,3.4 实型数据,实型数据的舍入误差:,main( ) float a , b ; a=123456.789e5 ; b= a+20 ; printf(“a=%f , b=%fn“ , a , b ) ; ,运行结果: a=12345678848.000000 , b= 12345678848.000000,注:单精度变量有7位有效数字双精度变量有16位有效数字,3.4 实型数据,实型数据的舍入误差:,main( ) float a , b
13、; a=1234.56789e5 ; b= a+20 ; printf(“a=%f , b=%fn“ , a , b ) ; ,运行结果: a=123456792.000000 , b= 123456816.000000,32,字符常量 定义:用单引号括起来的单个普通字符或转义字符.,3.5 字符数据,如 a A ? n 101,转义字符:反斜线后面跟一个字符或一个代码值表示,将后面的字符转换成另外的意义。,常用转义字符及其含义:,例 main() printf(“Yb=n”);,运行结果: 屏幕显示:= 打印机输出:,例 3.5 转义字符的使用。main( )printf(“abctderf
14、tgn“) ;printf(“htibbjk“) ;,g,f,j,k,打印结果: fabcgdehjik 运行结果: f gehjk,字符常量的值:该字符的ASCII码值,如 A65, a97,048, n10,如 101 -A 012 -n376 - x61 -a60 -0 483 -(),例: A-101-x41-65,例 转义字符举例 main() printf(“101 x42 Cn“);printf(“I say:“How are you?“n“);printf(“C Programn“);printf(“Turbo C“); ,运行结果: A B C I say:“How are
15、you?” C Program Turbo C,字符的值域(取值范围):,ASCII字符表中的所有字符,每个字符型数据在内存中占一个字节,包括可显示字符和非可显示字符。,字符变量 定义:用来存放字符常量,只能放一个字符。 存储:字符以ASCII码存储如:char c1,c2;c1=a;c2=b;,3.5 字符数据,3.5 字符数据,字符变量 字符数据与整型数据之间可以通用(ASCII码)。,main() char c1 , c2 ; c1=97 ; c2=98 ; printf(“c1=%c , c2=%cn” , c1,c2 ) ;printf(“c1=%d , c2=%dn” , c1,c
16、2 ) ; ,运行结果: c1=a , c2=b c1=97,c2=98,例: main() char c1 , c2 ; c1=a ; c2=b ;c1=c1-32 ; c2=c2-32; printf(“c1=%c , c2=%cn” , c1,c2 ) ;printf(“c1=%d , c2=%dn” , c1,c2 ) ; ,运行结果: c1=A , c2=B c1=65, c2=66,3.5 字符数据,字符串常量 定义:用双引号(“”)括起来的字符序列,3.5 字符数据,“How are you?”, “china”,“123#45”, “a”,存储:每个字符串尾自动加一个 0 作为
17、字符串结束标志,以此判断字符串是否结束。,字符常量与字符串常量不同,注:不能把一个字符串赋给一个字符变量,C语言中没有专门的字符串变量,必须使用字符数组。, 选择题:以下选项中,均是不合法的转义字符的选项是 ( )。A) B) 1011 C) 011 D) abc f 101xf a x1f, 选择题:以下选项中,正确的字符常量是 ( )。A) “c“ B) C) 085 D) W, 选择题:以下选项中,均是正确的数值常量或字符常量的是 ( )。A) 0.0 B) “a“ C) 3 D) +0010f 3.9E-205 011 0xabcd8.9e 1e1 0xFF00 2e2& 0a 50.
18、, 选择题:下面不正确的字符串常量是 ( )。A) abc B) “1212 C) “0“ D) “ “,int a=3 ;float f=3.14 ;char c=a ;int a ,b=3 ,c ;int a=3 ,b=3 ,c=3 ;注意:变量的初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初始值的,3.6 变量赋初值,3.7不同类型数据间的转换,隐式转换 显式转换(强制转换),隐式转换 什么情况下发生 运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换 运算转换规则:
19、,3.7不同类型数据间的转换,double,float,long,unsigned,int,char,short,低,高,显式转换(强制转换) 一般形式:(类型名)表达式 例 (int)(x+y), (int)x+y(double)(3/2),(int)3.6,例 main() float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i); ,运行结果: x=3.600000,i=3,C 运 算 符,算术运算符: + - * / % + - 关系运算符: = != 逻辑运算符: ! & | 位运算符 : | & 赋值运算符: = 及其扩展 条件运算符
20、: ?: 逗号运算符: , 指针运算符: * & 求字节数 : sizeof 强制类型转换:(类型) 分量运算符: . - 下标运算符: 其它 : ( ),3.8 算术运算符和算术表达式,运算符基本概念: 运算符两端常量或者变量称为操作数 按照运算符所对应的操作数的个数可将运算符分为三种:单目运算符双目运算符三目运算符 由操作数运算符及圆括号按照一定规则构成的式子称为表达式,学习运算符应注意: 运算符功能 与操作数关系 要求操作数个数 (运算符为几目的) 要求操作数类型 运算符优先级别 结合方向 结果的类型,基本算术运算符: + - * / % 优先级:* / % - + - 结合方向:自左向
21、右 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据,例 5/2 =-5/2.0 =,例 5%2 =-5%2 =1%10 =5%1 =5.5%2 =,例 5/2 = 2 -5/2.0 = -2.5,例 5%2 = 1-5%2 = -11%10 = 15%1 = 05.5%2 = (),自增、自减运算符 + - 作用:使变量值加1或减1 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+, i- (先使用i值,再执行i+1或i-1),例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; pr
22、intf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,/*k=4,j=4*/,/*k=3,j=4*/,/*4*/,/*3*/,/*c=20,a=4*/,/*c=15,a=4*/,/*+,-运算练习小程序*/ main() int a=1,b=1;printf(“+a=%d,b+=%dn”,+a,b+);printf(“a=%d,b=%dn”,a,b);printf(“-a=%d,b-=%dn”,-a,b-);printf(“a=%d,b=%dn”,a,b);,+a=2,b+=1 a=2,b=2 -a=1,b-=2 a=1,b=1,说明: + -
23、不能用于常量和表达式如5+,(a+b)+ + -结合方向:自右向左,自增、自减运算符 + -,例:printf(“%d”,-i+);,说明: i初值为3,(i+)+(i+)+(i+)=? i+j? C编译系统尽可能多的按照自左向右将若干个字符组成一个运算符i+j 等价于 (i+)+j i的初值为3printf(“%d,%d”,i,i+);printf(“%d,%d”,i,+ i);printf(“%d,%d”,+ i,i);,自增、自减运算符 + -,3, 3,4, 4,4, 3,+ -,-,* / %,+ -,低,高,算术运算符优先顺序,简单赋值运算符 符号: = 格式: 变量标识符 = 表
24、达式 作用:将一个数据(常量或表达式)赋给一个变量,例 a=3;d=func();c=d+2;,3.9 赋值运算符和表达式,说明: 结合方向:自右向左 优先级: 较低 左侧必须是变量,不能是常量或表达式,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型(隐式转换),例 3=x-2*y;a+b=3;,例 float f; int i;i=10; f=i; 则 f=10.000000,例 int i; i=2.56; /* 结果i=2 */,二、赋值运算时的类型转换:1. 实型赋给整型:小数舍弃2. 整型赋给实型:值不变,以浮点数存储3. double赋给float:截取前7位有效数字
25、4. float赋给double:值不变,有效位增加(补0),5. 字符型赋给整型:字符数据放入整型变量低8位1)字符为无符号类型: 高8位补02)字符为有符号类型: 符号扩展字符高位为0,高8位补0字符高位为1,高8位补1,6. int型赋给long型:int型数据放入long型变量低16位高16位进行符号扩展int型数据为正值,高位为0,long高16位补0int型数据为负值,高位为1,long高16位补1,7. 整型(int, short, long)赋给字符型:截取整型低8位放入字符变量 8. 长整型 long 赋给int整型:截取整型低16位放入int变量 9. 无符号整型赋给长整型
26、 long :高位补0 10. 无符号整型赋给相同字节的整型: 11. 有符号整型赋给相同字节的无符号整型:各位内容原样复制,3.9 赋值运算符和赋值表达式,长给短,直接截取短给长,前面补位,例: a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/*表达式值为5,a,b,c值为5*/,/* b=5;a=5*/,/*表达式值11,c=6,a=11*/,/*表达式值10,a=10,b=4,c=6*/,/*表达式值5,a=5,b=10,c=2*/,赋值表达式的值与变量值相等,且可嵌套,说明:,复合赋值运算符 种类:+= -= *= /= %= =
27、 = &= = |=,3.9 赋值运算符和表达式,思考题,1、 a=12; a+=a-=a*a,2、 int a=2; a%=4-1; a+=a*=a-=a*=3;,求 a 的值?,逗号运算符和表达式 形式:表达式1,表达式2,表达式n结合性:从左向右 优先级: 低(低于赋值号的优先级)逗号表达式的值:顺序求解,但最后逗号表达式的值等于表达式n的值 用途:常用于循环for语句中,例: 3+5,6+8,例: a=3*5,a*4,练习题, 选择题:下面符合C 语言语法的赋值表达式是 ( )。A) d=9+e+f=d+9 B) d=9+e, f=d+9 C) d=(9+e, e+, d+9) D)
28、d=9+e+=d+7,例 a=3;a=3*5,a*4a=3*5,a*4,a+5 例 x=(a=3,6*3)x=a=3,6*a 例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c);,/*a=15,表达式值60*/,/*a=15,表达式值20*/,/*赋值表达式,表达式值18,x=18*/,/*逗号表达式,表达式值18,x=3*/,/*1,2,3*/,/*3,2,3*/,例: #include main() int x,y=7;float z=4;x=(y=y+6,y/z);printf(“x=%dn“,x)
29、; ,运行结果:x=3,程序中应尽量使用括号以明确求值的确切顺序,为自己和别人阅读带来方便。+ -操作符的代码比等价赋值句代码的运行速度快的多,目标代码的效率也更高,但初学者要慎用。,提示:,本章要点, C语言的标识符是如何定义的。 C语言有哪些基本数据类型?各种基本数据类型的常量和变量是如何定义的? C语言有几种类型的表达式?各种类型表达式是如何求值的? 在C语言混合运算的表达式中,各种运算符的优先级和结合性。,第3章 作业,作业 (1) x+a%3*(int)(x+y)%2/4设x=2.5,a=7,y=4.7,/*CH3.C*/ main() float x=2.5,y=4.7;int a=7;float result;result = x+a%3*(int)(x+y)%2/4;printf(“%fn”,result); ,