550 likes | 761 Views
第二章 数据类型、运算符和表达式. 基本数据类型 常量和变量 运算符、表达式和语句 输入和输出 溢出和误差问题. 基本数据类型. 整型 int、short、long 字符型 char 实型 float、double、(long double) 有符号数和无符号数 signed、unsigned. 基本数据类型列表. 常量. 字符常量 字符串常量 整型常量 实型常量 符号常量. 字符常量. 字符型 (对应 char ) ASCII字符: ‘ A ’ 、 ‘ 2 ’ 、 ‘ $ ’
E N D
第二章 数据类型、运算符和表达式 • 基本数据类型 • 常量和变量 • 运算符、表达式和语句 • 输入和输出 • 溢出和误差问题
基本数据类型 • 整型 • int、short、long • 字符型 • char • 实型 • float、double、(long double) • 有符号数和无符号数 • signed、unsigned
常量 • 字符常量 • 字符串常量 • 整型常量 • 实型常量 • 符号常量
字符常量 • 字符型(对应char) • ASCII字符:‘A’、‘2’、‘$’ • 转义符:‘\n’、‘\0’、‘\\’、‘\’’、‘\”’ • 指明ASCII值:‘\101’(8进制)、‘\x41’(16进制)
使用双引号:“hello!” 连续的字符序列 ‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘!’, ‘\0’ 字符尾部追加‘\0’字符 字符串的实质是指针 字符串在内存的首地址 区分“A”和‘A’ 字符串常量
整型常量 • 一般整型(对应int) • 十进制:0、123、-456 • 八进制(以0开头):05、-017、0327 • 十六进制(以0x开头):0x132、-0X17f • 长整型(对应long、在数后加l或L) • 98765L、0x12345678L、50000L
实型常量 • 一般形式 • 45.768、+0.123、-123.0 • .123、123.、0.0、.0、0. • 指数形式 • 1e-5、-3.14e+07、1E10 • 要求: • 不支持8或16进制的实型数 • 一般形式必须有小数点,否则以整型处理
C语言的预编译处理 #define #include、#if、#… #define NUM 1000 在程序的最前端定义 在main()之前 特殊使用 举例 #define NUM 1000 main() { int x; x = 2*NUM; printf(“%d”,x); } 符号常量
常量测试 • 以下哪些为合法常量 7356 -0496 0x3A1 0456 ‘\x65’‘\118’ 2E E5 0x-230 567890 ‘115’ 6L 8b 2.1e3.5 • 表达式求解 • ‘A’+2 ‘\x61’‘B’+0x20 • ‘9’-‘0’ 5+‘0’ • ‘b’-’a’+10 12-10+‘A’
变量及其定义 • C语言标识符 • 以字母或下划线(‘_’)开头 • 后跟字母、下划线、数字 • 最大长度31个字符(TurboC标准) • 大小写敏感 • 所有标识符均应先定义再使用 • 变量名为一合法的C标识符 • 变量的定义及初始化 • int a; float x1 = 2.5,y,z=-3.1; • 变量定义必须在执行语句前
无符号整型 • 无符号类型 • unsigned int • Turbo C中等同于unsigned short • unsigned short • 0 - 65535 (0 ~ 216-1) • unsigned long • 0 - 4294967295 (0 ~ 232-1) • unsigned char • 0 - 255 (0 ~ 28-1)
变量测试 • 分析以下变量定义 • char ch1 = ‘\n’, ch2=65, ch3; • int x,y; • unsigned char cn=200; • signed short i1, i2=-1, i3; • unsigned x=-1; • float ft1=1e3; • double db;
运算符 算术运算符 位运算符 赋值运算符 关系运算符 逻辑运算符 条件运算符 逗号运算符 sizeof运算符 表达式 常量、变量之间运算的结果是表达式 表达式可继续参与运算 语句:任何表达式加分号 “;” 构成语句 例:3+5; 运算符、表达式和语句
运算符--算术运算符 • 加(+)、减(-)、乘(*)、除(/)、取余(%) 、取负(-) • 整除(/):15/4为3(取整,非四舍五入) • 自增(++)、自减(--) • a++;即a=a+1; (为了对应汇编指令) • 前置运算,设a当前值为3 • b = (++a)*5;(先算a=a+1,再算b=a*5,a=4,b=20) • 后置运算,设a当前值为3 • b = (a++)*5;(先算b=a*5,再算a=a+1,a=4,b=15)
运算符--位运算符 • 与(&)、或(|)、非/取反(~)、异或(^) • 3 & 5,3 | 5,3 ^ 5,~3,3 ^ 0xFFFF • 100 & 200,… • 左移(<<)、右移(>>) • 3 << 1、100 << 2 • 3 >> 1、100 >> 2 • 0x1234 >> 8、0x12345678L << 16 • 求: y=((x & 0xFF)<<8) | ((x & 0xFF00)>>8); • 设 x = 0x1234,则 y = ?
运算符--赋值运算符 • 基本赋值运算符(=) • a = 3、x = x + 2 • 赋值运算做为表达式 • printf(“%d”,(x=x+2)+4); /*设x原为3*/ • a=b=c=1; /*右结合,即a=(b=(c=1))*/ • 复合的赋值运算符 • x=x+2 写成 x+=2 (为了对应汇编指令) • x *= (a=2) + (b+=3) + c++;
运算符练习 • 写表达式 • 整数n的个位数字符 • 设变量 a 原值为 12,n原值为5,求表达式 • a *= 2+3 a += a+a • a%=(n%=2) a -= n += 2
关系运算符与关系表达式 • 关系运算符 • >(大于)、>=(大于等于)、==(等于) • <(小于)、<=(小于等于)、!=(不等于) • 关系表达式 • 关系运算的结果:真(1)、假(0) • (5>3)值为1、(5<=3)的值为0
关系运算符练习 • 设定义 int a=4,b=8;求表达式的值 • (1).a>b、 a<b、 a!=b、 a=b • (2). a==(b>-5)、 (a==b)>-5、 a=(b>-5) • (3). a<b<3、 b>a>3、 ‘a’>b、 ‘a’+a<‘b’-b
逻辑运算符 • 逻辑运算符 • &&(逻辑与)、||(逻辑或)、 !(逻辑非) • a&&b:当a和b逻辑值均为真时,结果为真 • a||b:当a和b至少一个逻辑值为真时,结果为真 • !a:当a逻辑值为真时,结果为假 • 逻辑值:0为假、非0为真(用于运算时) • 逻辑结果:假为0、真为1(运算结果时)
逻辑表达式练习 • 计算逻辑表达式 • (4<8)&&(8<3) • ((x=2)>5)||((y=4)<5) • !(6>7) • 3&&4 • (x=0)||(y=20) • !‘a’
逻辑运算的抢先判断 • 先判原则 • a && b:若a为假,结果必为假(b不计算) • a || b:若a为真,结果必为真(b不计算) • 举例(设定义 int x=6,y=8;) • (x=0)&&(y=20):结果x=0,y=8 • (y=20)&&(x=0):结果x=0,y=20 • (y=20)||(x=0):结果x=6,y=20 • (x=0)||(y=20):结果x=0,y=20
逻辑运算测试 • 求表达式(设int a=3, b=5, c=0;) • (a+=2)&&(b-=a)&&(--c) • !(a=0)&&(c++)&&(b--) • !(a>2)||(b-=5)||(c==0) • 写表达式 • a比b大1 • a为偶数或者b为奇数 • a、b、c任意两数之和大于第三数
条件运算符 • 形式:表达式1 ? 表达式2 : 表达式3 • 语义:(条件)?(真表达式):(假表达式) • 例:max = (a>b)?a:b; • 等价于 • 若 条件 (a>b) 成立,则 赋值 max=a • 否则 赋值 max=b
逗号运算符 • 形式:表达式1,表达式2 • 语义:表达式2的结果为整个表达式的结果 • 例 • x=7,y=8; 为一条语句,等价于x=7;y=8; • z=(x=7,y=8); 变量z的值为8
sizeof运算符 • 特殊类运算符 • 形式:sizeof(变量) 或 sizeof(变量类型) • 语义:计算该变量所占用的内存字节数 • 例: (以TurboC为例) • 定义int n; long x; • sizeof(n)或sizeof(int) 结果=2 • sizeof(x)或sizeof(long) 结果=4 • 练习:sizeof(unsigned char)
运算符优先级 • 运算符的优先级和方向(见附录III) • 括号 • 单目运算符(++,--,取负,取反,取址,取值) • 乘法、除法、取余 • 加减 • 关系运算 • 逻辑运算 • 赋值运算 • 养成好习惯:多使用括号
数据类型的转换 • 自动转换:两个操作数先转换到较高级别数 • char int long • • float double • 强制类型转换:(类型名)操作数 • 类型转换举例 • 5/2、5/2.、(float)5/2、(float)(5/2) • 1.2+5/2、1.2*5/2
其它变量类型 • 变量与内存关系 • 任何定义的变量都存贮在内存中 • 在内存中的任何变量都分配唯一的地址 • 变量的地址是由系统自动分配,不能预知 • 数组变量 • 指针变量
内存(64K*8位)和地址(16位) 1字节=8位 地址:0000H 64K 字 节 xxxxxxxx 地址:2000H 41H = 01000001 地址:2001H 42H = 01000010 地址:FFFFH xxxxxxxx
一维数组的定义 • 形式(定义) • 数据类型 数组名[元素个数] • 例: int a[5]; 定义5个整型a[0] ~ a[4] • 例: float s[9]; 定义9个浮点数 s[0] ~ s[8] • 形式(引用) • 数组名[下标] • 例: a[0] 表示最开始一个元素(第0个) • 例: s[8]表示最后一个元素(第9个)
数组使用举例 • int a[5], sum; • a[0] = 10; printf( “a[0]=%d\n”, a[0] ); • a[1] = 20; printf( “a[1]=%d\n”, a[1] ); • a[2] = 30; printf( “a[2]=%d\n”, a[2] ); • a[3] = 40; printf( “a[3]=%d\n”, a[3] ); • a[4] = 50; printf( “a[4]=%d\n”, a[4] ); • sum = a[0] + a[1] + a[2] + a[3] + a[4]; • printf( “sum=%d\n”, sum );
数组的初始化 • int a[10] = {2,4,6,8,10,12,14,16,18,20}; • 则初始a[0]=2,a[1]=4,…,a[9]=20 • int a[10] = {1,2}; • 则初始 a[0]=1,a[1]=2,a[2]=0,a[9]=0 • int a[] = { 1,2,3 }; • 则定义a[3],且初始 a[0]=1,a[1]=2,a[2]=3
变量与内存 a[] • int a[5] = {100,200,300, 400,500}; • int n = 10; n
指针数据类型 • 计算机数据(变量)贮存在内存中 • 每个数据都有占有内存1或多个地址(连续) • 如:long整型占4个地址 • 地址本身也是一个数值 • DOS方式:内存分段,每段最大64K,地址用16位(2个字节)表示 • 指针即数据的首地址
指针类型举例 1字节=8位 设有定义 int x; x占2个字节 64K 字 节 地址:2000H x 的低字节(41H) 地址:2001H x 的高字节(42H) x 的值为0x4241 x 的指针为0x2000
基本数据指针: int *、short *、long * char * float *、double * 指针使用运算符 取址:&变量 指针 取值:*指针 变量 指针的输出 %x 或 %X printf(“%x”,p); 指针使用举例 main() { int x, y; int *p; x = 100; p = &x; y = *p; printf(“%d\n”, y); printf(“%x\n”, p); } 指针变量定义
数据输入与输出 • 格式输出函数printf • 格式输入函数 scanf • 格式控制符
格式化输出函数 • 函数格式:printf(“输出格式”,输出表列) • 格式输出例子: • printf(“Hello,world!\n”); • printf(“Sum=%d”, sum); • printf(“a=%d,b=%d\n”, a, b); • printf(“a=%d,pointer of a=%x”, a, &a); • 格式说明:%d、%x
整型数基本格式符 带符号10进制:%d 无符号10进制:%u 8进制输出:%o 16进制输出:%x 长度控制 例:%5d,%3u, %6o,%4x 长整数(基格式符前加l) %ld,%lo,%lx 左对齐(%后加-) %-5d 前导0(数字前加0) %05d 例:原 a=-2, b=123 %d%d %05d,%-5d (对a=-2)%u、%o、%x 格式字符(1)--整型
实型基本格式符 %f:十进制小数(6位) %e:指数形式 %g:优化格式 长度控制 %5.2f:总长5,小数2 双精度实型 %lf 例1:x = 345.678 %f:345.678009 %e:3.45678e+02 %g :345.678 %4.2f :345.68 例2:x = 0.0000345 %f :0.000035 %e :3.45000e-05 %g :3.45e-05 %4.2f :0.00 格式字符(2)--实型
格式字符(3)--字符型 • 单个字符 %c • printf( “the char is %c!”, ‘a’ ); • 输出:the char is a! • 字符与整型 • printf(“%d,%d”, ‘A’, 98 ); • 输出:65,98 • printf(“%c,%c”, ‘A’, 98 ); • 输出:A,b
格式字符(4)--字符串、其它 • 字符串 %s • printf( “Hello,%s”, “wang” ); • 输出:Hello,wang • 特殊符号 %% • printf(“2%% good!”); • 输出:2% good!
格式化输入函数 • 函数格式:scanf(“输入格式”,地址表列) • 格式输入例子: • scanf(“%d”, &x); • 输入:123 • scanf(“a=%d,b=%d”, &a, &b); • 输入:a=123,b=45 (中间不能任意插入空格) • scanf(“%d%d”, &a, &b); • 输入:123 45 (中间1或多个空格、TAB、回车) • 格式符:%d、%x、%ld、%f、%c、%s 建议写法
格式化输入说明 • 格式符 %s • 以第一个空白符(空格、TAB、换行)结束 • 格式符 %*(在%后加*号) • 表示跳过一个输入项 • scanf( “%d %*d %d”, &a, &b ); • 输入行:123 456 78 • 结果:a=123, b=78
格式输出练习 • 请写出下列程序片段的运行结果 • int b=7; long n=1234567; • float x=67.8564, y=-789.124; • char c=‘A’; • printf( “n=ld,b=%d,c=%d\n”,n,b,c ); • printf( “%f%c%f\n”, x,c,y );
格式输入练习 • 为使a=3, b=7, x=8.5, y=71.82应如何输入? • int a,b; float x,y; • scanf( “a=%d b=%d”, &a, &b ); • scanf( “%f %f”, &x, &y );
输入出一般要求 • 格式符: (关键4个:%d、%s、%c、%f) • %d、%x、%ld、%5d • %f、%5.2f • %c、%s • %%、%* • 界面友好: • printf( “Please Input Number: ” ); • scanf( “%d”, &n );