1 / 57

第二章 基本数据类型及运算

第二章 基本数据类型及运算. 数据描述 数据类型 常量 变量 类型转换 运算符与表达式 数据输入与输出. 短整型 short. 整型 int. 整型. 长整型 long. 数值类型. 单精度型 float. 基本类型. 实型. 双精度型 double. 字符类型 char. 数组. C 数 据 类 型. 结构 struct. 构造类型. 联合 union. 指针类型 *. 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 允许的操作. 空类型 void. 自定义类型 typedef.

Download Presentation

第二章 基本数据类型及运算

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第二章 基本数据类型及运算 • 数据描述 • 数据类型 • 常量 • 变量 • 类型转换 • 运算符与表达式 • 数据输入与输出

  2. 短整型 short 整型 int 整型 长整型 long 数值类型 单精度型 float 基本类型 实型 双精度型 double 字符类型char 数组 C 数 据 类 型 结构 struct 构造类型 联合 union 指针类型 * 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 允许的操作 空类型 void 自定义类型 typedef

  3. 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个字节的内存空间。

  4. 例 符号常量举例 #define PRICE 30 main() { int num,total; num=10; total=num*PRICE; printf("total=%d",total); } 运行结果:total=300 • 常量 • 定义:程序运行时其值不能改变的量(即常数) • 分类: • 符号常量:用标识符代表常量 • 定义格式: #define符号常量 常量 • 一般用大写字母 • 是宏定义预处理命令,不是C语句 • 直接常量: • 整型常量 • 实型常量 • 字符常量 • 字符串常量

  5. 问题: 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

  6. 实型常量(实数或浮点数) • 表示形式: • 十进制数形式:(必须有小数点) 如 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型

  7. 转义字符及其含义: 转义字符 含义 转义字符 含义 \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

  8. 转义字符举例 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”); } 运行结果: 屏幕显示:= 打印机输出:¥

  9. h e l l o \0 例 字符串“hello”在内存中 例 空串 “” \0 例 ‘a’ “a” a a \0 例: char ch; ch=‘A’; • 字符串常量 • 定义:用双引号(“”)括起来的字符序列 • 存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志。 • 字符常量与字符串常量不同 例: char ch; ch=“A”;

  10. 变量 概念:其值可以改变的量 变量名与变量值 变量定义的一般格式: 数据类型 变量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*/

  11. 整型变量 占字节数随机器不同而不同,一般占一个机器字 所占字节数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; */ 没有字符串变量,用字符数组存放

  12. 常量宏定义 变量定义 输出结果 例 #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

  13. 常量小结 定义:程序运行时其值不能改变的量(即常数) 符号常量:用标识符代表常量 定义格式: #define符号常量 常量 是宏定义预处理命令,不是C语句 常量后缀L或l 长整型U或u 无符号数F或f 浮点数 常量类型整数,长整数,无符号数,浮点数, 字符,字符串,符号常数,转义字符

  14. 常量小结(续) 整型常量 十进制整数:由数字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’ 作为字符串结束标志

  15. 变量小结 • 概念:其值可以改变的量 • 变量名与变量值 • 变量定义的一般格式: 数据类型 变量1[,变量2,…,变量n]; • 变量初始化:定义时赋初值 • 变量的使用:先定义,后使用 • 变量定义位置:一般放在函数开头 注意:没有字符串变量,用字符数组存放

  16. 不同类型数据间的转换 • 隐式转换 • 什么情况下发生 • 运算转换------不同类型数据混合运算时 • 赋值转换------把一个值赋给与其类型不同的变量时 • 函数调用转换------实参与形参类型不一致时转换 • 运算转换规则: 不同类型数据运算时先自动转换成同一类型 • 显式转换(强制转换) • 一般形式:(类型名)表达式 • 说明:强制转换得到所需类型,原变量类型不变

  17. double float 高 long unsigned 说明: 必定的转换 int char,short 低 运算对象类型 不同时转换 混合运算隐式转换规则

  18. 例 (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 精度损失问题

  19. C运算符 1.算术运算符 + - * / % ++ -- (类型) 2.赋值运算符 = 及其扩展赋值运算符 3. 关系运算符 > < == >= <= != 4.逻辑运算符 ! && || 5.位运算符 << >> ~ | ^ & 6.条件运算符 ? : 7.逗号运算符 , 8.指针运算符 * & 9.求字节数运算符 sizeof 10. 分量运算符 . → 11.下标运算符 [ ] 12.其它 如函数调用运算符()

  20. 注:有些教材最高优先级是15,有些最高优先级是1。注:有些教材最高优先级是15,有些最高优先级是1。

  21. 学习运算符应注意: (1)掌握运算符的功能; (2)搞清运算符与运算量间的关系: • 要求运算量个数 • 要求运算量类型 (3)清楚运算的优先级; (4)明确结合方向(在一个运算量的两侧有两个相同优先级别的运算符,则按结合方向顺序处理); (5)明白结果的类型(即表达式的类型)。

  22. 算术运算符和表达式 • 基本算术运算符:+ - * / % • 结合方向:从左向右 • 优先级: - ---->* / % -----> + - 说明: • “-”可为单目运算符时,右结合性 • 两整数相除,结果为整数 • “%”要求两侧均为整型数据 例 5%2 = 1 -5%2 = -1 1%10 =1 5%1 =0 5.5%2 () 例 5/2 = 2 -5/2.0 = -2.5

  23. 算术运算符和表达式(续) • 自增、自减运算符 ++ -- • 作用:使变量值加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*/

  24. 算术运算符和表达式(续) • 说明: • ++ -- 不能用于常量和表达式,如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++);

  25. 位运算符 • 位运算是以二进制位(bit)为基本单位进行的运算 • C语言提供了六种位运算符: ~按位取反 单目 &按位与 双目 | 按位或 双目 ^ 按位异或 双目 <<左移 双目 >>右移 双目 • 不同长度的数据进行位运算: • 将操作数右端对齐, • 左端补零(无符号数) • 或补符号位(有符号数)

  26. 按位与运算符& • 0&0=0;1&0=0;0&1=0;1&1=1 • 用途: • 清零 • 保留某些位 例:int i; i & 0x00FF /* low byte */ i & 0x8000 /* the most high bit */

  27. 按位或运算符| • 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*/

  28. 按位异或运算符^ • 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;

  29. 按位取反运算符~ • ~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 */

  30. 左移运算符<< • 功能: 把<<左边的运算数的各二进位全部左移若干位,由<<右边的数指定移动的位数,高位丢弃,低位补0。 • 用途: 无溢出时,左移1位相当于乘2,但快得多。 例: int i=15; /* 00001111 */ i << 2; /* 00111100 = 60*/ 

  31. 右移运算符>> • 功能: 把>>左边的运算数的各二进位全部右移若干位,由>>右边的数指定移动的位数。 • 有符号数右移: 当为正数时, 最高位补0;而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。 • 用途: 右移1位相当于除以2,但快得多。 unsigned char c=241; /* 1111 0001 */ c >> 2; /* 0011 1100 = 60 =241/4*/

  32. 简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量 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

  33. 说明: 结合方向:自右向左 优先级: 左侧必须是变量,不能是常量或表达式 • 赋值运算符和表达式(续) • 赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型 • 错误: 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;

  34. 赋值运算符和表达式(续) • 赋值表达式的值与变量值相等,且可嵌套 例: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*/

  35. 赋值运算符和表达式(续) • 赋值类运算符的副作用及限制 C语言允许在一个表达式中使用一个以上赋值运算符。 ※ 对人的影响和副作用,易造成误解。 1.程序尽可能写得明了易懂一些; 2.加上一些不必要的括号。 ※ 对机器的副作用,不定解。 交换律不再适用。 例: a=12; a+=a-=a*a; /*a=-264等价于a=a+(a=a-(a*a))*/

  36. 赋值运算时的类型转换 “=”两侧类型不一致时,要进行类型转换: • 整←实:截掉小数部分 • 实(单、双精度)←整:数值不变,存为浮点 • 整←char:整型低8位←char整型高8位←0或符号位扩展(因机器而不同) • long int←int:符号位扩展 • int←long int:int←long 低16位 • long int←unsigned int:高位补0 • 整型←(字节数相同的)unsigned 整型:原样送入。 若超过整型表示范围,会出错。 • unsigned←(字节数相同的)非unsigned整型: 原样送入,符号位也作为有效数值。 Page 36

  37. 赋值语句 • 格式: 赋值表达式; • 赋值语句与赋值表达式的区别: 赋值表达式可以包含在其它表达式中,而赋值语句不可。 例:if ((a=b)>0) t=a; 不可写为:if ((a=b;)>0) t=a; Page 38

  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*/

  39. 计算字节运算符sizeof • sizeof 是一个单目的编译状态运算符, 可计算出变量或类型的字节长度。 例: float f; printf(”%d”,sizeof(f)); printf(”%d”,sizeof(int)); Turbo C输出结果为4和2。 • 使用sizeof 可以增强程序的可移植性,使之不受计算机固有的数据类型长度限制。

  40. 运算符与表达式小结 • 运算符优先级和结合性 一般而言,单目运算符优先级较高,赋值运算符优先级低;算术运算符优先级较高,关系和逻辑运算符优先级较低。 多数运算符具有左结合性,单目运算符、三目运算符、 赋值运算符具有右结合性。 • 表达式表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。 表达式求值按运算符的优先级和结合性所规定的顺序进行。

  41. 数据输入与输出 C语言无I/O语句,I/O操作由函数实现 #include <stdio.h> 一、数据输出 字符输出函数 格式:putchar( c ) 参数:c为字符常量、变量或表达式 功能:把字符c 输出到显示器上 返值:正常,返回显示的代码值;出错,返回EOF(-1)

  42. 例: #include <stdio.h> main( ) { int c; char a; c=65; a='B'; putchar(c); putchar('\n'); putchar(a); } 运行结果:A B

  43. 格式输出函数 格式:printf(“格式控制串”,输出表) 功能:按指定格式向显示器输出数据 返值:正常,返回输出字节数;出错,返回EOF(-1) • 输出表:要输出的数据(可以没有,多个时以“,”分隔) • 格式控制串:包含两种信息 • 格式说明:%[修饰符]格式字符,用于指定输出格式 • 普通字符或转义序列:原样输出 • 格式字符:

  44. 十进制整数 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 外均应用小写 • 格式字符与输出项个数应相同,按先后顺序一一对应 • 格式字符与输出项类型不一致时,输出可能出错

  45. 附加格式说明符(修饰符) 修饰符 功 能 m 输出数据域宽,数据长度<m,左补空格;否则按实际输出 对实数,指定小数点后位数(四舍五入) 对字符串,指定实际输出位数 .n - 输出数据在域内左对齐(缺省右对齐) 指定在有符号数的正数前显示正号(+) + 输出数值时指定左面不使用的空位置自动填0 0 # 在八进制和十六进制数前显示前导0,0x 在d,o,x,u前,指定输出精度为long型 在e,f,g前,指定输出精度为double型 l

  46. 例 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

  47. 例: 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

  48. 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*/

  49. 二、数据输入 字符输入函数 格式: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

  50. 格式:scanf(“格式控制串”,地址表) 功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束 返值:正常,返回输入数据个数 • 格式输入函数 • 地址表:变量的地址,常用取地址运算符& • 格式字符:d,i,o,x,u,c,s,f,e 例 scanf(“%d”,&a); 输入:10  则 a=10 例 scanf(“%x”,&a); 输入:11  则 a=17

More Related