你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
1
本章知识点:
预备知识数据类型常量与变量不同类型数据间的转换运算符和表达式第二章 数据描述你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
2
计算机中数的表示及进制转换数码、基与权数码:表示数的符号基:数码的个数权:每一位所具有的值数制
2.0 预备知识你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
3
二进制、八进制、十六进制转换成十进制方法:按权相加
100123452 59212120212121111011 )()(例
100128 94868381136 )()(例
10012316 7 9 7 81610162161516121 )()(例AF
各种进制之间的转换你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
4
二进制、八进制、十六进制转换成十进制
十进制转换成二进制、八进制、十六进制方法:连续除以基,从低到高记录余数,直至商为 0
例 把十进制数 459转换成十六进制数
45916
2816
116
0
(459)10=(1CB)16
1 C B
余 11
余 12
余 1
各种进制之间的转换 (整数 )
方法:按权相加你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
5
二进制转换成八进制:
从右向左,每 3位一组(不足 3位左补 0),转换成八进制
八进制转换成二进制:
用 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
二进制与八进制之间的转换你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
6
二进制转换成十六进制:
从右向左,每 4位一组(不足 4位左补 0),
转换成十六进制
十六进制转换成二进制:
用 4位二进制数代替每一位十六进制数例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16
例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2
0000 ~ 0
0001 ~ 1
0010 ~ 2
0011 ~ 3
0100 ~ 4
0101 ~ 5
0110 ~ 6
0111 ~ 7
1000 ~ 8
1001 ~ 9
1010 ~ A
1011 ~ B
1100 ~ C
1101 ~ D
1110 ~ E
1111 ~ F
二进制与十六进制之间的转换你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
7
内存以字节为单元组成每个字节有一个地址一个字节一般由 8个二进制位组成每个二进位的值是 0或 1
01234567
0
1
2
3
4
5
6
7
8
9
10 ……..
.
7
6
4
3
2
5
1
字节和位你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
8
原码:最高位为符号位,其余各位为数值本身的绝对值反码:
正数:反码与原码相同负数:符号位为 1,其余位对原码取反补码:
正数:原码、反码、补码相同负数:最高位为 1,其余位为原码取反,再对整个数加 1
3
12
6
9
1
2
4
57
8
10
11
9-5=4
9+7=16=(14)12
数值的表示方法 ——原码、反码和补码你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
9
原码 反码 补码
+7 00000111 00000111 00000111
-7 10000111 11111000 11111001
+0 00000000 00000000 00000000
-0 10000000 11111111 00000000
数的范围
01111111~
11111111
(-127~+127)
01111111~
10000000
(-127~+127)
01111111~
10000000
(-128~+127)
负数补码转换成十进制数:最高位不动,其余位取反加 1
例 补码,11111001
取反,10000110
加 1,10000111=-7
(用一字节表示数)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
10
数据类型总表
C
数据类型基本类型构造类型指针类型空类型 void
定义类型 typedef
字符类型 char
枚举类型 enum
整 型实型单精度型 float
双精度型 double
数组结构体 struct
共用体 union
短整型 short
长整型 long
整型 int
数据类型决定:
1,数据占内存字节数
2,数据取值范围
3,其上可进行的操作
2.1 数据类型你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
11
类型 符号 关键字 数的表示范围所占位数整型字符型实型有无
(signed)int 16 -32768~32767
(signed)short 16 -32768~32767
(signed)long 32 -2147483648~2147483647
16unsigned int 0~65535
32 0~4294967295unsigned long
unsigned short 16 0~65535
有 float 3
2
3.4e-38~3.4e38
有 double 6
4
1.7e-308~1.7e308
有 char 8 -128~127
无 unsigned char 8 0~255
说明,数据类型所占字节数随机器硬件不同而不同,上表以 IBM PC机为例,
请看 int和 unsigned int
基本数据类型你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
12
标识符定义:用来标识变量、常量、函数等的字符序列组成:
只能由 字母、数字、下划线 组成,且第一个字母必须是字母或下划线大小写敏感不能使用关键字长度:最长 32个字符命名原则:
见名知意不宜混淆 如 l与 I,o与 0
例,判断下列标识符号合法性
sum Sum M.D.John day Date 3days
student_name #33 lotus_1_2_3
char a>b _above $123
< >
M 3days
#33
$123a>b
2.2 常量与变量你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
13
一般用大写字母是宏定义预处理命令,不是 C语句直接常量,
整型常量 请点击:
实型常量 请点击:
字符常量 请点击:
字符串常量 请点击:
如 #define PRICE 30
定义:程序运行时其值不能改变的量(即常数)
分类,
符号常量,用标识符代表常量定义格式,#define 符号常量 常量
< >
例 符号常量举例 (ch2_1.c)
#define PRICE 30
main()
{
int num,total;
num=10;
total=num*PRICE;
printf("total=%d",total);
}
运行结果,total=300
常量你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
14
三种形式:
十进制整数:由数字 0~9和正负号表示,如 123,-456,0
八进制整数:由数字 0开头,后跟数字 0~7表示,如
0123,011
十六进制整数:由 0x开头,后跟 0~9,a~f,A~F表示,
如 0x123,0Xff
例 12 与 12L例 30000 为 int型
65536 为 long int 型整型常量的类型根据其值所在范围确定其数据类型在整常量后加字母 l或 L,认为它是 long int 型常量问题:
0123 = ( )10
0x123 = ( )10
0Xff = ( )10
83
291
255
问题:
( 10
10
ff 10
整型常量(整常数)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
15
表示形式:
十进制数形式:(必须有小数点) 如 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 型实型常量(实数或浮点数)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
aaa 16
定义,用 单引号 括起来的单个 普通字符 或 转义字符,
字符常量的 值,该字符的 ASCII码值
<
转义字符及其含义:
转义字符 含义
\n
\v
\r
\a
\?
\ddd
\t
\b
\f
\\
\“
\xhh
转义字符 含义换行垂直制表回车响铃单引号
3位 8进制数代表的字符水平制表退格换页反斜线双引号
2位 16进制数代表的字符如 ‘ \101? -----------?A\012? -----------?\n?
\376? -----------\x61? -----------?a?
\60? -----------?0\483? ----------(?)
例,
A?-------?\101?-------?\x41?--------65
如 ‘ A?——65,‘ a?——97,
‘ 0?——48,?\n?——10
如 ‘ aA\n\101?
转义字符,反斜线后面跟一个字符或一个代码值表示例 转义字符举例 (ch2_001.c,ch2_004.c)
main()
{
printf("\101 \x42 C\n");
printf("I say:\"How are you?\"\n");
printf("\\C Program\\\n");
printf("Turbo \'C\'");
}
运行结果,(屏幕显示 )
A B C
Isay:”How are you?”
\C Program\
Turbo?C?
例 main()
{ printf(“Y\b=\n”);
}
运行结果:
屏幕显示,=
打印机输出,¥
字符常量你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
17
字符常量与字符串常量不同定义:用双引号 (“”)括起来的字符序列存储:每个字符串尾 自动 加一个 ‘ \0? 作为字符串结束标志
h e l l o \0例 字符串,hello”在内存中
a a \0例 ‘ a?,a”
例 空串,” \0
例,char ch;
ch=“A”;

;
字符串常量你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
18
编译程序根据变量定义为其分配指定字节的内存单元 …...
地址
int a=1,b=-3,c;
a
b
c
2字节
2字节
2字节地址地址
…...
内存
1
-3

随机数概念:其值可以改变的量变量名与 变量值变量定义的一般格式:
数据类型 变量 1[,变量 2,…,变量 n];
变量初始化,定义时赋初值 例,
int a,b,c;
float data;
决定分配字节数和数的表示范围合法标识符 例,
int a=2,b,c=4;
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; //Illegal use of floating point in function main
变量定义位置,一般 放在函数开头
main()
{ int a,b=2;
float data;
a=1;
data=(a+b)*1.2;
printf(“data=%f\n”,data);
}
变量定义可执行语句
main()
{ int a,b=2;
a=1;
float data;
data=(a+b)*1.2;
printf(“data=%f\n”,data);
}
变量你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
19
占字节数随机器不同而不同,一般占一个机器字
short≤int≤long
可用 sizeof(类型标识符)测量实型变量
float:占 4字节,提供 7位有效数字
double:占 8字节,提供 15~16位有效数字字符型变量字符变量存放字符 ASCII码
char与 int数据间可进行算术运算例 1,float a;
a=111111.111; /* a=111111.1*/
例 2,double b;
b=111111.111; /* b=111111.111*/
例 a=?D?; /* a=68; */
x=?A?+5; /* x=65+5; */
s=?!?+?G? /* s=33+71; */
没有 字符串变量,用字符数组存放整型变量你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
20
/*ch2_003.c*/
#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
例子你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
21
隐式转换
什么情况下发生
运算转换 ------不同类型数据混合运算时
赋值转换 ------把一个值赋给与其类型不同的变量时
输出转换 ------输出时转换成指定的输出格式
函数调用转换 ------实参与形参类型不一致时转换
运算转换规则,不同类型数据运算时先 自动 转换成同一类型
2.3不同类型数据间的转换你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
22
double float
long
unsigned
int char,short低高 说明,
必定的转换运算对象类型不同时转换
char ch;
int i;
float f;
double d;
ch/i + f*d - (f+i)
int
int
double
double
double
double
double
double
int
int
double
double
double
double
double
double
10+?a? +i*f - d/l
例 2 int i;
float f;
double d;
long l;
例 1
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
23
一般形式,( 类型名 ) ( 表达式)
例,(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语言教学?幻灯片版?第二章 数据描述
24
C
运算符算术运算符:( + - * / % ++ --)
关系运算符:( < <= == > >= !=)
逻辑运算符:((! && ||)
位运算符,( << >> ~ | ^ &)
赋值运算符:( = 及其扩展)
条件运算符:(?:)
逗号运算符:(,)
指针运算符:( * &)
求字节数,( sizeof)
强制类型转换:(类型)
分量运算符:(,->)
下标运算符:( [])
其它,( ( ) -)
2.4 运算符和表达式你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
25
运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型学习运算符应注意你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
26
基本算术运算符,+ - * / %
结合方向:从左向右优先级,- ---->* / % -----> + -
(2) (3) (4)
说明:
,-”可为 单目 运算符时,右结合性两整数相除,结果为整数
%要求两侧均为整型数据例 5/2 =
-5/2.0 =
例 5%2 =
-5%2 =
1%10 =
5%1 =
5.5%2
算术运算符和表达式
2
-2.5
1
-1
1
0
(?)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
27
作用:使变量值加 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
自增、自减运算符 ++ --
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
28
作用:使变量值加 1或减 1
种类:
前置 ++i,--i (先执行 i+1或 i-1,再使用 i值)
后置 i++,i-- (先使用 i值,再执行 i+1或 i-1)
说明:
++ -- 不能用于常量和表达式,如 5++,(a+b)++
++ --结合方向,自右向左优先级,- ++ -- ------>* / % ----->+ -
(2) (3) (4)
例 -i++? -(i++)
i=3; printf(“%d”,-i++); //-3例 j+++k; (j++)+k;例 -i++i=3; printf(“%d”,-i++);
自增、自减运算符 ++ --
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
29
简单赋值运算符符号,=
格式,变量标识符 =表达式作用:将一个数据(常量或表达式)赋给一个变量复合赋值运算符种类,+= -= *= /= %=,=,= &= ^= |=
含义,exp1 op= exp2? exp1 = exp1 op exp2
a+=3 a=a+3
x*=y+8 x=x*(y+8)
x%=3 x=x%3
例 a=3;
d=func();
c=d+2;
赋值运算符和表达式你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
30
结合方向,自右向左优先级,14
左侧必须是变量,不能是常量或表达式赋值表达式的值与变量值相等,且可嵌套赋值转换 规则,使赋值号右边表达式值 自动 转换成其左边变量的类型 例 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
说明( 1):
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
31
结合方向,自右向左优先级,12
左侧必须是变量,不能是常量或表达式赋值表达式的值与变量值相等,且可嵌套赋值转换 规则,使赋值号右边表达式值 自动 转换成其左边变量的类型例,a=12;
a+=a-=a*a
例,int a=2;
a%=4-1;
a+=a*=a-=a*=3;
//a=-264 等价于 a=a+(a=a-(a*a))
//a=0 等价于 a=a+(a=a*(a=a-(a=a*3)))
说明( 2),
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
32
形式,表达式 1,表达式 2,…… 表达式 n
结合性,从左向右优先级,15
逗号表达式的值:等于表达式 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
逗号运算符和表达式例,
/*ch2_6.c*/
#include <stdio.h>
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
printf("x=%d\n",x);
}
运行结果,x=3
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
33
关系运算符种类,< <= == >= > !=
结合方向:自左向右优先级别:
<
<=
>
>=
==
!=
优先级 6(高)
优先级 7(低)例 c>a+b //c>(a+b)
a>b!=c //(a>b)!=c
a==b<c //a==(b<c)
a=b>c //a=(b>c)
关系表达式的值:是逻辑值“真”或“假”,用
1和 0表示 例 int a=3,b=2,c=1,d,f;
a>b
(a>b)==c
b+c<a
d=a>b
f=a>b>c
//表达式值 1
//表达式值 1
//表达式值 0
//d=1
//f=0
关系运算符和表达式你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
34
例 若 a=0; b=0.5; x=0.3;
则 a<=x<=b的值为 0
例 5>2>7>8在 C中是允许的,
值为 0
例 int i=1,j=7,a;
a=i+(j%4!=0);
则 a= 2
例 ‘ a?>0 结果为
‘ A?>100 结果为
1
0
关系运算注意( 1)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
35
例 注意区分,=”与,==”
int a=0,b=1;
if(a=b)
printf(“a equal to b”);
else
printf(“a not equal to b”);
例 应避免对 实数 作相等或不等的判断如 1.0/3.0*3.0==1.0 结果为可改写为,fabs(1.0/3.0*3.0-1.0)<1e-6
0
关系运算注意( 2)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
36
a b !a !b a&&b a||b
真假真假假假真真逻辑运算符种类,! && ||
逻辑运算真值表
C语言中,运算量,0表示,假,,
非 0表示,真,,
运算结果,0表示,假,,
1表示,真,,
真假假假假假真真假假真真真假真真逻辑运算符和表达式( 1)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
37
! (2)
&& (11)
|| (12)
高低例 a<=x && x<=b
a>b&&x>y
a==b||x==y
!a||a>b
优先级,?结合方向:
!,从右向左
&&,从左向右
||,从左向右
// (a<=x) && (x<=b)
//(a>b)&&(x>y)
//(a==b)||(x==y)
//(!a)||(a>b)
逻辑运算符和表达式( 2)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
38
! (2)
&& (11)
|| (12)
高低
优先级,?结合方向:
!,从右向左
&&,从左向右
||,从左向右例 a=4;b=5;
!a
a&&b
a||b
!a||b
4&&0||2
5>3&&2||8<4-!0
c?&&?d?
值为 1
值为 0
值为 1
值为 1
值为 1
值为 1
//(5>3)&&2||(8<(4-(!0))) 值为 1
逻辑运算符和表达式( 3)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
39
! (2)
&& (11)
|| (12)
高低
优先级,?结合方向:
!,从右向左
&&,从左向右
||,从左向右短路特性,逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符
< >
例 a&&b&&c //只在 a为真时,才判别 b的值;
只在 a,b都为真时,才判别 c的值例 a||b||c //只在 a为假时,才判别 b的值;
只在 a,b都为假时,才判别 c的值例 a=1;b=2;c=3;d=4;m=1;n=1;
(m=a>b)&&(n=c>d) //结果 m=0,n=1
逻辑运算符和表达式( 4)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
40
一般形式,expr1? expr2,expr3
执行过程功能:相当于条件语句,但不能取代一般 if语句例 if (a>b)
printf(“%d”,a);
else
printf(“%d”,b);
printf(“%d”,a>b?a:b);
例 求 a+|b|
printf(“a+|b|=%d\n”,b>0?a+b:a-b);
expr1
取 expr2值 取 expr3值非 0 =0
例 (a==b)Y?:?N?
(x%2==1)?1:0
(x>=0)?x:-x
(c>=?a? && c<=?z?)?c-?a?+?A?:c
条件运算符可嵌套如 x>0?1:(x<0?-1:0)
优先级,13
结合方向,自右向左如 a>b?a:c>d?c:d? a>b?a:(c>d?c:d)
expr1,expr2,expr3类型可不同,表达式值取较高的类型例 xa?:?b? //x=0,表达式值为‘ b?; x?0,表达式值为‘ a?
x>y?1:1.5 //x>y,值为 1.0; x<y,值为 1.5
条件运算符与表达式你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
41
01 11 11 11 11 11 11 11int型,最大,32767
10 00 00 00 00 00 00 00 最小,-32768
11 11 11 11 11 11 11 11unsigned int型,最大,65535
00 00 00 00 00 00 00 00 最小,0
条件运算符与表达式( 1)
你现在所处的位置在,首页?C语言教学?幻灯片版?第二章 数据描述
42
数制基权表示数码特点
10o,101,102,…
十进制数
0~9
10
逢十进一二进制数
0~1
2
2o,21,22,…
逢二进一八进制数
0~7
8
8o,81,82,…
逢八进一十六进制数
0~9,A~F,a~f
16
16o,161,162,…
逢十六进一十进制,4956= 4?103+9?102 +5?101+6?10o二进制,1011 1?23+0?22 +1?21+?2o十六进制,8 AE=8?163+?162 +10?1 1+14?16o八进制,275 2 8 7 8 5 8o
条件运算符与表达式( 2)