C语言40学时第 3章 数据类型、运算符与表达式课堂教学 2学时累计6学时
C语言40学时
C的数据类型
C语言中的数据分常量和变量
程序中用到的数据都必须指定其类型
C语言中的数据结构是以数据类型形式出现
C语言40学时
C的数据类型如下整型字符型基本类型 单精度型实型 (浮点型 )
双精度型枚举类型数据类型 数组类型构造类型 结构体类型共用体类型指针类型空类型
C语言40学时常量与变量
常量与符号常量在程序运行过程中,其值不能改变的量称为常量
± 123 ± 0123 ± 0x123
± 123L ± 0123L ± 0x123L
0 (整型常量 )
± 1.23
± 1.05E± 10 (实型常量 )
x1? (字符型常量 )
“abc”,1” (字符串常量 )
C语言40学时符号常量
符号常量是给常量命名,用名称代表常量例 3.1符号常量的使用 。
1,#define PRICE 30
2,main( )
3,{int num,total;
4,num=10;
5,total=num*PRICE;
6,printf("total=%d",total); }
7,运行结果,total=300
C语言40学时
注:符号常量不同于变量,不能赋值
PRICE=40; 错!
优点:
1,含义清楚,见名知意。规范的程序中不提倡使用很多的常量,如:
sum=15*30*43*0.15
常量究竟代表什么?
sum=price*weight*distance*discount
zongjia=danjia*zhongliang*juli*zhekou
2,方便改动 如:# define PRICE 44
C语言40学时变量
程序运行中其值可以改变的量为变量
3 变量值存储单元
a 变量名
C语言40学时
名字:
字母、数字和下划线三种字符组成,且第一个字符必须是字母或下划线。
合法变量名:
sum,average,_total,class,day,month,
student_name,tan,lotus_1_2_3,li_ming
不合法的标识符:
1 _2_3,M.DJohn,$23,3D64,a>b
标识符
C语言40学时变量先定义后使用
优点
1,正确性
2,按类型分配存储单元
3,检查变量的运算合法性如,a% b
C语言40学时
*****整型常量的表示方法
1,十进制整数,± 123,0,987 (0~9)
2,八进制整数,± 0123 (0~7)
3,十六进制整数,± 0x12ef (0~f )
将十六进制数转换为十进制数:
1*163+2*162+14*161+15*160=>4847
C语言40学时*****整型变量
整型数据在内存中的存放形式
int i; /*定义 i为整型变量 */
i=10; /*给 i赋以整数 10*/
i:
i:
数值- 10的补码表示:
10的原码,
取反,
加1得- 10的补码,
10
0000000000001010
0000000000001010
1111111111110101
1111111111110110
表示为二进制数
C语言40学时整型变量的分类
1,基本整型 int
2,短整型 short 或 short int
3,长整型 long 或 long int
4,无符号型 unsigned
前三种都可以加修饰符 unsigned
例,int a ;
unsigned int b;
C语言40学时
整型数范围,- 32768~+ 32767
无符号整型数范围:0~ 65535
a,
b:
整型变量的定义
1,强制类型定义
2,位置,在函数的开头部分,也可以在函数中的某个分程序内的开头部分,还可以在函数外
1111111111111111
0111111111111111
C语言40学时
1,main( )
2,{int a,b,c,d;
3,unsigned u;
4,a=12;b=-24;u=10;
5,c=a+u;d=b+u;
6,printf("a+u=%d,b+u=%d\n",c,d);
7,}
运行结果,a+u=22,b+u=-14
C语言40学时
整型数据的溢出
32767+1=? 循环记数例 3.3
1,main( )
2,{int a,b;
3,a=32767;
4,b=a+1;
5,printf("%d,%d",a,b);
6,}
运行结果,32767,- 32768
C语言40学时
*****
变量 a,b在内存中的形式:
a,215-1
b,- 215
整型常量的类型
1,int/short,-32768~32767
2,long int,-2147483648~2147483647
也可以,123L,0L
3,unsigned int,0~65535
0111111111111111
1000000000000000
C语言40学时实型数据
实型常量的表示方法
实数又称浮点数有两种表示形式
1,十进制小数形式
2,指数形式如,123e3或 1.23E5 -> 123× 103
注,e之前必须有数字,且 e后的指数必须为整数
C语言40学时例,123.456可以表示为:
123.456e0,12.3456e1,1.23456e2,
0.123456e3,0.0123456e4,0.00123456e5
规范化的指数形式
1.23456e002
实型变量
实型变量在内存中的存放形式
C语言40学时
*****
一个实型数据一般在内存中占4个字节
实型变量的分类
+.314159 +1
数符 小数部分 指数符 指数实数:3.14159
名称 类型 比特数 有效位 数值范围单精度 float 32 6~7 10-37~1038
双精度 double 64 15~16 10-307~10308
长双精度 long double 128 18~19 10-4931~104932
C语言40学时
实型变量的定义
float x,y;
double z;
long double temp;
实型数据的舍入误差有效位以外的数字将被舍去例 3.4实型数据的舍入误差
C语言40学时
1,main( )
2,{float a,b;
3,a=123456.789e5;
4,b=a+20;
5,printf("\na=%f\nb=%f\n",a,b);
6,}
运行结果,a=12345678848.000000
b=12345678848.000000
结论:应当避免一个很大的数和一个很小的数直接相加或相减
C语言40学时*****
实型常量的类型如,1.65f,654.87F,1234.56789
实型常量的运算
1,一个实型常量可以赋给一个 float型,double型或
long double型变量
2,实型常量首先按双精度常量处理然后截取七位赋给 float型变量,截取 16位赋给 double型变量 …
例,float a; double b;
a=123456.789; 最后两位小数不精确!
b=123456.789; 精确接收
C语言40学时字符型数据
字符常量
‘ A?,‘ a?,‘1’,‘$’,’ \n?
C还允许用一种特殊形式的字符常量,以\
开头的字符或一个八进制、十六进制的数表示
如,\101,\x41都是 65,也就是 A
1x82+1x80=65,4X161+1x160=65
C语言40学时转义字符及含义字符形式 含义 ASCII代码
\n 回车换行 10
\t 跳9位 9
\b 退格 8
\r 回车 13
\f 换页 12
\\ 反斜杠字符“\” 92
\? 单引号字符 39
\” 双引号字符 34
\ddd 8进制数 ASCII码
\xhh 16进制数 ASCII码
C语言40学时*****
例 3.5 转义字符的使用
1,main( )
2,{printf(,ab c\t de\rf\tg\n");
3,printf("h\ti\b\bj k");
4,}
打印结果:123456789012
f a b c g d e
h j i k
屏幕显示,f g d e
h j k
C语言40学时字符变量字符型变量可以存放一个字符一个字符存放在一个字节中( 0~255)
字符变量的定义形式
char c1,c2;
int c3,c4;
字符变量的赋值
c1=?a?; c2=?1?; c3=?b?; c4=?2?;
C语言40学时
字符数据在内存中的存储形式及使用方法
字符常量放到字符变量中是将该字符的相应 ASCII代码放到存贮单元中
c1 c2 c3 c4
97 49 98 50
01100001 00110001 01100010 00110010
以二进制形式存放
ASCII?American National Standard Code for information
Interchange
C语言40学时
字符数据以 ASCII码存贮就与整数存贮形式类似
C语言使字符型数据和整型数据之间可以通用例 3.6向字符变量赋以整数
main() 97:
{char c1,c2;
c1=97,c2=98;
printf("%c,,%c\n",c1,c2);
printf("%d,,%d\n",c1,c2);}
运行结果,a,,b
97,,98
01100001
%c %d
a 97
输出格式显示
C语言40学时
例 3.7 大小写字母的转换
main( )
{char c1,c2;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
printf("%c %c",c1,c2);}
运行结果,A B
C语言40学时*****
说明,
将字符处理成带符号的整数 (取值范围为 -
128~127其中 0~127,%d为正。 28-1)
如果使用 ASCII码在 128~255之间的字符
%d输出时为负值,最高位为 1
例,char c=130; -----> 10000010=128+2
printf(“%d”,c);
C语言40学时*****
有符号处理,
将 10000010减 1变反 01111110得 -126
无符号处理,
unsigned char c=130;
printf(“%d”,c); 结果为,130
C语言40学时字符串常量
字符串常量是一对双引号括起来的字符序列
‘ a?与,a”的区别:
printf(“How do you do.”);
“CHINA” 6个字符易错情况,c=“a”;
a a \0
C语言40学时各类数值型数据间的混合运算整型、实型、字符型、逻辑型数据间可以混合运算如,(a>b)+10+?1?-1.5*’ b?
不同类型间的转换规则:
高 double float
long
unsigned
低 int char short
C语言40学时*****
常用类型从左到右数据长度增加
char<int<unsigned int<long<float<double
例,设 i为整型,f为单精度型,d为双精度型,e为长整型
10+’ a?+ i* f- d/ e
整1 双2 双4
双3
双5
C语言40学时算术运算符和算术表达式
C运算符简介
C运算符有以下几类:
1,算术运算符 +,-,*,/,%
2,关系运算符 >,<,==,>=,<=,!=
3,逻辑运算符 !,&&,||
4,位运算符 <<,>>,~,|,^,&
5,赋值运算符 =及扩展赋值运算符
6,条件运算符?,
C语言40学时
7,逗号运算符,
8,指针运算符 *,&
9,求字节数运算符 sizeof
10,强制类型转换运算符 (类型)
11.分量运算符,->
12.下标运算符 [ ]
13.其他 函数调用运算符 ( )
C语言40学时算术运算符和算术表达式
例,1/2.=0.5
1/2=0
向零取整,-5/3=-1
规定%两侧均为整数
%的应用:5%3=2
6%3=0
16%3=1
问:1%2=?
C语言40学时
算术表达式和运算符的优先级与结合性
算术表达式:
用算术运算符和括号将运算对象连接起来的、符合 C语法规则的式子
一个运算对象两侧的运算符的优先级相同,则按规定的结合方向处理
C语言40学时强制类型转换运算符
一般形式:(类型名) (表达式 )
例,(double)a 错,double (a)
(int)(x+y) (int)x+y
(float)(5%3) (float)5%3
C语言40学时
例 3.8强制类型转换
main( )
{float x;
int i;
x=3.6;
i=(int)x; /*有同样效果,i=x;赋值转换 */
printf("x=%f,i=%d",x,i);}
运行结果,x=3.600000,i=3
问,x变量的类型?
C语言40学时课堂练习
写出程序运行结果:
main( )
{int x,y;double a;float b;
a=6.34;b=2.1;
a=a+b;
y=a-b;
x=(int)(a)%(int)(b);
printf(“x=%d,y=%d”,x,y);}
运行结果,x=0,y=6
C语言40学时
C具有两种类型转换:
1,系统自动进行类型转换
2,强制类型转换
自增自减运算(右结合)
作用:使变量的值增1或减1
前缀:++ i,-- i
后缀,i++,i--
++ i或 i++ 可以解释为,i=i+1
前缀运算符与后缀运算符的差别
C语言40学时
例:设 i为 3观察 j与 i的值
1,j=++i;
等效,i=i+1;j=i;
结果,j为4,i为4
2,j=i++;
等效,j=i; i=i+1;
结果,j为3,i为4
问,printf(“% d”,++i); 输出?
注,1.自增自减运算符只能用于变量;
2.结合方向是至右向左
C语言40学时
3,- i++ 相当于 - (i++ )
4,a+++ b 解释为 (a++ )+ b
5,a--- b 解释为 (a-- )- b
6,i=3,(i++)+(i++)+(i++)=? 12/9? 讨论
7,printf(“%d,%d”,i,i++) 从左 3,3 从右 4,3讨论最好写成,j=i++ 此后 j为 3,i为 4
printf(“%d,%d”,j,j) 3,3
printf(“%d,%d”,i,j) 4,3
C语言40学时课堂练习
读程序写出运行结果
main( )
{int x,y,z;
x=1;y=2;z=3;
z=++x%y;
printf("\n%3d%3d%3d\n",x,y,z);
x=x+(z++ + ++y);
printf("%3d%3d%3d\n",x,y,z);
y=++x+z;
printf("%3d%3d%3d\n",x,y,z);}
C语言40学时答案
2 2 0
5 3 1
6 7 1
C语言40学时*****赋值运算符和赋值表达式
格式,<变量>=表达式;
类型转换
1,实型赋给整型 截取
2,整型赋个实型 扩展
当数值范围超出时会出现失真例 3.9
main( )
{unsigned a;
int b=-1;
a=b;
printf(“%u”,a);}
运行结果,65535
C语言40学时
复合的赋值运算符使程序简化,提高编译效率共有10个复合的赋值运算符:
+=,-=,* =,/=,%=,<<=,>>=,&=,|=,^=
使用:
a+=3 等价于 a=a+3
x* =y+8 等价于 x=x* (y+8)
例:设 a为 6
a+=a-=a* a 等价于 a=a+(a=a-(a* a))
结果,a=-60
C语言40学时
设 m1=m2=m3=m4=10 讨论运算后 m1,m2,m3,m4的值?
m1+=m2-=m3* =m4/=2
m1=m1+(m2=m2-(m3=m3* (m4=m4/2)))
-30 -40 50 5
逗号运算符和逗号表达式
1,逗号运算符又称顺序求值运算符
2,其形式为:
表达式 1,表达式 2,表达式 3…… 表达式 n
3,它的值为表达式 n的值
C语言40学时
4,逗号优先级最低
例,设 a为 3
a=3* 5,a* 4
结果,a=15表达式值为 60
a=(3* 5,a* 4)
结果,a=12
C语言中逗号有两种用途
1,分隔符
2,顺序求值运算符如,printf(“%d%d”,(a,b,c),e);
C语言40学时
一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式如:
(a=3*5,a*4),a+5
a=15 表达式值,20
下面两个表达式作用不同
1,x=(a=3,6*3) x=18 表达式值,18
2,x=a=3,6*a x=3 表达式值,18