570 likes | 732 Views
第二章 基本数据类型及运算. 数据描述 数据类型 常量 变量 类型转换 运算符与表达式 数据输入与输出. 短整型 short. 整型 int. 整型. 长整型 long. 数值类型. 单精度型 float. 基本类型. 实型. 双精度型 double. 字符类型 char. 数组. C 数 据 类 型. 结构 struct. 构造类型. 联合 union. 指针类型 *. 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 允许的操作. 空类型 void. 自定义类型 typedef.
E N D
第二章 基本数据类型及运算 • 数据描述 • 数据类型 • 常量 • 变量 • 类型转换 • 运算符与表达式 • 数据输入与输出
短整型 short 整型 int 整型 长整型 long 数值类型 单精度型 float 基本类型 实型 双精度型 double 字符类型char 数组 C 数 据 类 型 结构 struct 构造类型 联合 union 指针类型 * 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 允许的操作 空类型 void 自定义类型 typedef
unsignedshort unsignedlong 无 unsignedint (signed)long (signed)int 32 8 64 16 16 -32768~32767 -32768~32767 有 float double 有 有 (signed)short char 8 -2147483648~2147483647 -128~127 0~255 32 unsigned char -1.7e308~1.7e308 -3.4e38~3.4e38 32 0~65535 16 0~4294967295 16 0~65535 基本数据类型例 类型 符号 关键字 数的表示范围 所占位数 有 整型 无 实型 字符型 需要注意的是,标准C没有具体规定以上各整型数据所占内存字节数。只要求long型数据长度不短于int型,short型不长于int型。具体如何实现,由各计算机系统和编译系统决定。 如:在Visual C++ 6.0中,一个short型数据占用2个字节的内存空间,一个int型数据和一个long型数据分别占用4个字节的内存空间。
例 符号常量举例 #define PRICE 30 main() { int num,total; num=10; total=num*PRICE; printf("total=%d",total); } 运行结果:total=300 • 常量 • 定义:程序运行时其值不能改变的量(即常数) • 分类: • 符号常量:用标识符代表常量 • 定义格式: #define符号常量 常量 • 一般用大写字母 • 是宏定义预处理命令,不是C语句 • 直接常量: • 整型常量 • 实型常量 • 字符常量 • 字符串常量
问题: 0123 = ( )10 0x123 = ( )10 0xff = ( )10 83 291 255 • 整型常量(整常数) • 三种形式: • 十进制整数:由数字0~9和正负号表示。如 12,-456,0 • 八进制整数:由数字0开头,后跟数字0~7表示。如0123,011 • 十六进制整数:由0x开头,后跟0~9,a~f,A~F表示。 如0x123,0xff • 整型常量的类型 • 根据其值所在范围确定其数据类型 • 常量后加字母l或L,就成为long int 型常量 问题: 0123 = ( )10 0x123 = ( )10 0xff = ( )10 例 30000 为int型 65536 为long int 型 例 12 与 12L
实型常量(实数或浮点数) • 表示形式: • 十进制数形式:(必须有小数点) 如 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型 • 在实型常量后加字母l或L,为long double型
转义字符及其含义: 转义字符 含义 转义字符 含义 \t \n 换行 水平制表 \b 垂直制表 退格 \v \r \f 回车 换页 \a \\ 响铃 反斜线 \‘ \“ 单引号 双引号 < 2位16进制数代表的字符 \ddd 3位8进制数代表的字符 \xhh • 字符常量 • 定义:用单引号括起来的单个普通字符或转义字符. • 字符常量的值:该字符的ASCII码值 ‘A’——65, ‘a’——97, ‘0’——48 , ‘\n’——10 • 转义字符:反斜线后面跟一个字符或一个代码值表示 例:‘A’-------’\101’-------’\x41’--------65
转义字符举例 main( ) { printf("\101 \x42 C\n"); printf("I say:\"How are you?\"\n"); printf("\\C Program\\\n"); printf("Turbo \'C\'"); } 运行结果: A B C I say:”How are you?” \C Program\ Turbo ‘C’ main( ) { printf(“Y\b=\n”); } 运行结果: 屏幕显示:= 打印机输出:¥
h e l l o \0 例 字符串“hello”在内存中 例 空串 “” \0 例 ‘a’ “a” a a \0 例: char ch; ch=‘A’; • 字符串常量 • 定义:用双引号(“”)括起来的字符序列 • 存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志。 • 字符常量与字符串常量不同 例: char ch; ch=“A”;
变量 概念:其值可以改变的量 变量名与变量值 变量定义的一般格式: 数据类型 变量1[,变量2,…,变量n]; int a=1, b=-3,c; 地址 地址 地址 …... 1 a 2字节 变量定义 b -3 可执行语句 2字节 main( ) { int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%f\n”,data); } main( ) { int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%f\n”,data); } c 2字节 …... 随机数 内存 编译程序根据变量定义为其 分配指定字节的内存单元 • 变量初始化:定义时赋初值 • 变量的使用:先定义,后使用 决定分配字节数 和数的表示范围 合法标识符 • 变量定义位置:一般放在函数或复合语句开头 例1 int student; stadent=19; /*Undefined symbol ‘statent’ in function main*/
整型变量 占字节数随机器不同而不同,一般占一个机器字 所占字节数short≤int≤long 可用sizeof(类型标识符)计算 • 实型变量 • float:占4字节,提供7位有效数字 • double:占8字节,提供15~16位有效数字 例 float a; a=111111.111; /* a=111111.1*/ double b; b=111111.111; /* b=111111.111*/ • 字符型变量 • 字符变量存放字符ASCII码 • char与int数据间可进行算术运算 例 a=‘D’; /* a=68; */ x=‘A’+5; /* x=65+5; */ s=‘!’+‘G’ /* s=33+71; */ 没有字符串变量,用字符数组存放
常量宏定义 变量定义 输出结果 例 #define PRICE 12.5 main( ) { int num=3; float total; char ch1,ch2=‘D’; total=num*PRICE; ch1=ch2-‘A’+‘a’; printf(“total=%f,ch1=%c\n”,total,ch1); } 运行结果: total=37.500000, ch1=d
常量小结 定义:程序运行时其值不能改变的量(即常数) 符号常量:用标识符代表常量 定义格式: #define符号常量 常量 是宏定义预处理命令,不是C语句 常量后缀L或l 长整型U或u 无符号数F或f 浮点数 常量类型整数,长整数,无符号数,浮点数, 字符,字符串,符号常数,转义字符
常量小结(续) 整型常量 十进制整数:由数字0~9和正负号表示 八进制整数:由数字0开头,后跟数字0~7表示 十六进制整数:由0x开头,后跟0~9,a~f,A~F表示 实型常量 十进制数形式:(必须有小数点) 如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 型 字符常量:用单引号括起来的单个普通字符或转义字符 字符串常量:用双引号(“”)括起来的字符序列,每个字符串 尾自动加一个 ‘\0’ 作为字符串结束标志
变量小结 • 概念:其值可以改变的量 • 变量名与变量值 • 变量定义的一般格式: 数据类型 变量1[,变量2,…,变量n]; • 变量初始化:定义时赋初值 • 变量的使用:先定义,后使用 • 变量定义位置:一般放在函数开头 注意:没有字符串变量,用字符数组存放
不同类型数据间的转换 • 隐式转换 • 什么情况下发生 • 运算转换------不同类型数据混合运算时 • 赋值转换------把一个值赋给与其类型不同的变量时 • 函数调用转换------实参与形参类型不一致时转换 • 运算转换规则: 不同类型数据运算时先自动转换成同一类型 • 显式转换(强制转换) • 一般形式:(类型名)表达式 • 说明:强制转换得到所需类型,原变量类型不变
double float 高 long unsigned 说明: 必定的转换 int char,short 低 运算对象类型 不同时转换 混合运算隐式转换规则
例 (int)(x+y) (int)x+y (double)(3/2) 较高类型向较低类型转换时可能发生 显式转换举例 例 main() { float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); } 结果:x=3.600000,i=3 精度损失问题
C运算符 1.算术运算符 + - * / % ++ -- (类型) 2.赋值运算符 = 及其扩展赋值运算符 3. 关系运算符 > < == >= <= != 4.逻辑运算符 ! && || 5.位运算符 << >> ~ | ^ & 6.条件运算符 ? : 7.逗号运算符 , 8.指针运算符 * & 9.求字节数运算符 sizeof 10. 分量运算符 . → 11.下标运算符 [ ] 12.其它 如函数调用运算符()
注:有些教材最高优先级是15,有些最高优先级是1。注:有些教材最高优先级是15,有些最高优先级是1。
学习运算符应注意: (1)掌握运算符的功能; (2)搞清运算符与运算量间的关系: • 要求运算量个数 • 要求运算量类型 (3)清楚运算的优先级; (4)明确结合方向(在一个运算量的两侧有两个相同优先级别的运算符,则按结合方向顺序处理); (5)明白结果的类型(即表达式的类型)。
算术运算符和表达式 • 基本算术运算符:+ - * / % • 结合方向:从左向右 • 优先级: - ---->* / % -----> + - 说明: • “-”可为单目运算符时,右结合性 • 两整数相除,结果为整数 • “%”要求两侧均为整型数据 例 5%2 = 1 -5%2 = -1 1%10 =1 5%1 =0 5.5%2 () 例 5/2 = 2 -5/2.0 = -2.5
算术运算符和表达式(续) • 自增、自减运算符 ++ -- • 作用:使变量值加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; printf(“%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*/
算术运算符和表达式(续) • 说明: • ++ -- 不能用于常量和表达式,如5++,(a+b)++ • ++ --结合方向: 自右向左 • 优先级:- ++ -- ------>* / % ----->+ - • 注意++、--的副作用(p.48~49) • 例 -i++ -(i++) • i=3; printf(“%d”,-i++); /* -3 */ • j=3; printf(“%d,%d”,j,j++); /* 4,3 or 3,3 */ • 例 -i++ ? • i=3; printf(“%d”,-i++); • j=3; printf(“%d,%d”,j,j++);
位运算符 • 位运算是以二进制位(bit)为基本单位进行的运算 • C语言提供了六种位运算符: ~按位取反 单目 &按位与 双目 | 按位或 双目 ^ 按位异或 双目 <<左移 双目 >>右移 双目 • 不同长度的数据进行位运算: • 将操作数右端对齐, • 左端补零(无符号数) • 或补符号位(有符号数)
按位与运算符& • 0&0=0;1&0=0;0&1=0;1&1=1 • 用途: • 清零 • 保留某些位 例:int i; i & 0x00FF /* low byte */ i & 0x8000 /* the most high bit */
按位或运算符| • 0|0=0;1|0=1;0|1=1;1|1=1 • 用途: • 置1 • 取指定位值 例: int a=9, b=5, c;c= a | b;printf("a=%d,b=%d,c=%d\n",a,b,c); /*9,5,13*/
按位异或运算符^ • 0^0=0;1^0=1;0^1=1;1^1=0 • 用途: • 使特定位翻转 • 交换变量值,不用临时变量 例: int a, b, t; t=a; a=b; b=t; /* need temporary variable */ a+=b; b=a-b; a-=b; /*possibility of overflow*/ a^=b; b^=a; a^=b;
按位取反运算符~ • ~0=1;~1=0 • 用途: • 特定位清零 char c; int i; c&0xFD /* 1111 1101 */ i&0xFFFD /* 1111 1111 1111 1101 */ 考虑移植性,可用: c&~0x02 i &~0x02 /* 2 byte int or 4 byte int */
左移运算符<< • 功能: 把<<左边的运算数的各二进位全部左移若干位,由<<右边的数指定移动的位数,高位丢弃,低位补0。 • 用途: 无溢出时,左移1位相当于乘2,但快得多。 例: int i=15; /* 00001111 */ i << 2; /* 00111100 = 60*/
右移运算符>> • 功能: 把>>左边的运算数的各二进位全部右移若干位,由>>右边的数指定移动的位数。 • 有符号数右移: 当为正数时, 最高位补0;而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。 • 用途: 右移1位相当于除以2,但快得多。 unsigned char c=241; /* 1111 0001 */ c >> 2; /* 0011 1100 = 60 =241/4*/
简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量 a+=3 a=a+3 x*=y+8 x=x*(y+8) x%=3 x=x%3 • 赋值运算符和表达式 例 a=3; d=func(); c=d+2; • 复合赋值运算符 • 种类:+= -= *= /= %= <<= >>= &= ^= |= ~= • 含义: exp1 op= exp2 exp1 = exp1 op exp2
说明: 结合方向:自右向左 优先级: 左侧必须是变量,不能是常量或表达式 • 赋值运算符和表达式(续) • 赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型 • 错误: 3=x-2*y; • a+b=3; • 例float f; • int i; • i=10; • f=i; • 则 f=10.0 例int i; i=2.56;结果i=2;
赋值运算符和表达式(续) • 赋值表达式的值与变量值相等,且可嵌套 例:a=b=c=5 a=(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*/
赋值运算符和表达式(续) • 赋值类运算符的副作用及限制 C语言允许在一个表达式中使用一个以上赋值运算符。 ※ 对人的影响和副作用,易造成误解。 1.程序尽可能写得明了易懂一些; 2.加上一些不必要的括号。 ※ 对机器的副作用,不定解。 交换律不再适用。 例: a=12; a+=a-=a*a; /*a=-264等价于a=a+(a=a-(a*a))*/
赋值运算时的类型转换 “=”两侧类型不一致时,要进行类型转换: • 整←实:截掉小数部分 • 实(单、双精度)←整:数值不变,存为浮点 • 整←char:整型低8位←char整型高8位←0或符号位扩展(因机器而不同) • long int←int:符号位扩展 • int←long int:int←long 低16位 • long int←unsigned int:高位补0 • 整型←(字节数相同的)unsigned 整型:原样送入。 若超过整型表示范围,会出错。 • unsigned←(字节数相同的)非unsigned整型: 原样送入,符号位也作为有效数值。 Page 36
赋值语句 • 格式: 赋值表达式; • 赋值语句与赋值表达式的区别: 赋值表达式可以包含在其它表达式中,而赋值语句不可。 例:if ((a=b)>0) t=a; 不可写为:if ((a=b;)>0) t=a; Page 38
形式:表达式1,表达式2,……表达式n 结合性:从左向右 优先级: 最低 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中 • 逗号运算符和表达式 例 a=3*5,a*4 a=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*/
计算字节运算符sizeof • sizeof 是一个单目的编译状态运算符, 可计算出变量或类型的字节长度。 例: float f; printf(”%d”,sizeof(f)); printf(”%d”,sizeof(int)); Turbo C输出结果为4和2。 • 使用sizeof 可以增强程序的可移植性,使之不受计算机固有的数据类型长度限制。
运算符与表达式小结 • 运算符优先级和结合性 一般而言,单目运算符优先级较高,赋值运算符优先级低;算术运算符优先级较高,关系和逻辑运算符优先级较低。 多数运算符具有左结合性,单目运算符、三目运算符、 赋值运算符具有右结合性。 • 表达式表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。 表达式求值按运算符的优先级和结合性所规定的顺序进行。
数据输入与输出 C语言无I/O语句,I/O操作由函数实现 #include <stdio.h> 一、数据输出 字符输出函数 格式:putchar( c ) 参数:c为字符常量、变量或表达式 功能:把字符c 输出到显示器上 返值:正常,返回显示的代码值;出错,返回EOF(-1)
例: #include <stdio.h> main( ) { int c; char a; c=65; a='B'; putchar(c); putchar('\n'); putchar(a); } 运行结果:A B
格式输出函数 格式:printf(“格式控制串”,输出表) 功能:按指定格式向显示器输出数据 返值:正常,返回输出字节数;出错,返回EOF(-1) • 输出表:要输出的数据(可以没有,多个时以“,”分隔) • 格式控制串:包含两种信息 • 格式说明:%[修饰符]格式字符,用于指定输出格式 • 普通字符或转义序列:原样输出 • 格式字符:
十进制整数 d,i x,X 八进制无符号整数 o u 单一字符 c 字符串 s 指数形式浮点小数 e,E 小数形式浮点小数 f e和f中较短一种 g,G 百分号本身 %% 567 int a=567; printf ( “%d”,a); ff int a=255; printf(“%x”,a); 十六进制无符号整数 101 int a=65; printf(“%o”,a); 567 int a=567; printf(“%u”,a); 不带符号十进制整数 A char a=65; printf(“%c”,a); ABC printf(“%s”,“ABC”); 5.677890e+02 float a=567.789; printf(“%e”,a); 567.789000 float a=567.789; printf(“%f”,a); 567.789 float a=567.789; printf(“%g”,a); % printf(“%%”); • 例main( ) • { • unsigned int u=65535; • printf(”u=%d\n",u); • } • 输出结果:u=-1 例 int a=3, b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b); 输出结果: 3 4 a=3, b=4 • 说明 • 格式字符除 X E G 外均应用小写 • 格式字符与输出项个数应相同,按先后顺序一一对应 • 格式字符与输出项类型不一致时,输出可能出错
附加格式说明符(修饰符) 修饰符 功 能 m 输出数据域宽,数据长度<m,左补空格;否则按实际输出 对实数,指定小数点后位数(四舍五入) 对字符串,指定实际输出位数 .n - 输出数据在域内左对齐(缺省右对齐) 指定在有符号数的正数前显示正号(+) + 输出数值时指定左面不使用的空位置自动填0 0 # 在八进制和十六进制数前显示前导0,0x 在d,o,x,u前,指定输出精度为long型 在e,f,g前,指定输出精度为double型 l
例 int a=1234; float f=123.456; char ch=‘a’; printf(“%8d,%2d\n”,a,a); printf(“%f,%8f,%8.1f,%.2f,%.2e\n”,f,f,f,f,f); printf(“%3c\n”,ch); 运行 1234,1234 结果:123.456000,123.456000, 123.5,123.46,1.23e+02 a 例 static char a[]=“Hello,world!” printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a); 运行结果:Hello,world! Hello,world! Hello Hello Hel
例: int a=1234; float f=123.456; static char c[]=“Hello,world!”; printf(“%8d,%-8d\n”,a,a); printf(“%10.2f,%-10.1f\n”,f,f); printf(“%10.5s,%-10.3s\n”,c,c); 运行结果:1234,1234 123.46,123.5 Hello,Hel
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 例 int a=1234; float f=123.456; printf(“%08d\n”,a); printf(“%010.2f\n”,f); printf(“%0+8d\n”,a); printf(“0+10.2f\n”,f); /*00001234*/ /*0000123.46*/ /*000+1234*/ /*000+123.56*/ 例 int a=123; printf(“%o,%#o,%X,%#X\n”,a,a,a,a); /*173,0173,7B,0X7B*/ 例 long a=65536; printf(“%d,%8ld\n”,a, a); /*0, 65536*/
二、数据输入 字符输入函数 格式:getchar( ) 功能:从键盘读一字符 返值:正常,返回读取的代码值;出错,返回EOF(-1) #include <stdio.h> main( ) { int c; printf("Enter a character:"); c=getchar(); printf("%c--->hex%x\n",c,c); } 运行结果: Enter a character:A A--->hex41
格式:scanf(“格式控制串”,地址表) 功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束 返值:正常,返回输入数据个数 • 格式输入函数 • 地址表:变量的地址,常用取地址运算符& • 格式字符:d,i,o,x,u,c,s,f,e 例 scanf(“%d”,&a); 输入:10 则 a=10 例 scanf(“%x”,&a); 输入:11 则 a=17