C语言第02次课.docx
《C语言第02次课.docx》由会员分享,可在线阅读,更多相关《C语言第02次课.docx(27页珍藏版)》请在冰豆网上搜索。
C语言第02次课
1.5标识符、变量和常量
1.5.1常量与变量
1.常量
符号常量在使用之前必须先定义,其一般形式为:
#define标识符常量
其中#define也是一条预处理命令(预处理命令都以“#”开头),称为宏定义命令,其功能是把该标识符定义为其后的常量值。
一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。
【例1.5】符号常量的使用。
程序代码如下:
#definePI3.14
main()
{
floatarea,r;
r=10;
area=r*r*PI;
printf("area=%f\n",area);
}
运行结果:
area=314.000000
程序说明:
2.变量
变量名是一种标识符,它必须遵守标识符的命名规则。
1.5.2整型数据
1.5.2.1整型常量
整型常量就是整常数。
在C语言中,使用的整常数有八进制、十六进制和十进制3种,使用不同的前缀来相互区分。
除了前缀外,C语言中还使用后缀来区分不同长度的整数。
1.八进制整常数
八进制整常数必须以0开头,即以0作为八进制数的前缀。
数码取值为0~7。
如0123表示八进制数123,即(123)8,等于十进制数83,即182+281+380=83;-011表示八进制数-11,即(-11)8,等于十进制数-9。
(1)以下各数是合法的八进制数:
●015(十进制为13)0101(十进制为65)0177777(十进制为65535)
(2)以下各数是不合法的八进制数:
●256(无前缀0)0382(包含了非八进制数码8)
2.十六进制整常数
十六进制整常数的前缀为0X或0x。
其数码取值为0~9、A~F或a~f。
如0x123表示十六进制数123,即(123)16,等于十进制数291,即1162+2161+3160=291;-011表示十六进制数-11,即(-11)16,等于十进制数-17。
(1)以下各数是合法的十六进制整常数:
●0X2A(十进制为42) 0XA0(十进制为160) 0XFFFF(十进制为65535)
(2)以下各数是不合法的十六进制整常数:
●5A(无前缀0X)
●0X3H(含有非十六进制数码)
3.十进制整常数
十进制整常数没有前缀,数码取值为0~9。
(1)以下各数是合法的十进制整常数:
●237-5681627
(2)以下各数是不合法的十进制整常数:
●023(不能有前导0) 23D(含有非十进制数码)
4.整型常数的后缀
下面给出一些例子。
(1)十进制长整常数:
●158L(十进制为158)358000L(十进制为358000)
(2)八进制长整常数:
●012L(十进制为10)0200000L(十进制为65536)
(3)十六进制长整常数:
●0X15L(十进制为21)0XA5L(十进制为165)0X10000L(十进制为65536)
1.5.2.2整型变量
1.整型变量的分类
整型变量可分为基本型、短整型、长整型、和无符号型4种。
(1)基本型
(2)短整型
(3)长整型
(4)无符号型
类型声明符为unsigned,存储单元中全部二进位(bit)用作存放数本身,而不包括符号。
无符号型又可与前面的3种类型匹配而构成另外几种类型。
①无符号基本型:
类型声明符为unsignedint或unsigned。
②无符号短整型:
类型声明符为unsignedshort。
③无符号长整型:
类型声明符为unsignedlong。
表1.4整型变量的字节数及表示范围
类型声明符
分配字节数
数的范围
int
2
-32768~32767即-215~(215-1)
short[int]
2
-32768~32767即-215~(215-1)
long[int]
4
-2147483648~2147483647即-231~(231-1)
unsigned[int]
2
0~65535即0~(216-1)
unsignedshort
2
0~65535即0~(216-1)
unsignedlong
4
0~4294967295即0~(232-1)
2.整型变量的定义
变量定义的一般形式为:
类型声明符变量名标识符1,变量名标识符2,...;
例如:
inta,b,c;/*a、b、c为整型变量*/
unsignedp,q;/*p、q为无符号整型变量*/
【例1.6】整型变量的定义与初始化。
程序代码如下:
main()
{
inta=3,b=5;
printf("a+b=%d\n",a+b);
}
运行结果:
a+b=8
1.5.3实型数据
1.5.3.1实型常量
实型也称为浮点型。
实型常量也称为实数或者浮点数。
在C语言中,实数只采用十进制。
它有两种形式,十进制数形式和指数形式。
1.十进制数形式
由数码0~9和小数点组成。
例如0.0、.25、5.789、5.0、300.、-267.8230等均为合法的实数。
2.指数形式
由十进制数加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。
其一般形式为aEn(a为十进制数,n为十进制整数),其值为a*10n。
(1)以下是合法的实数:
●2.1E5(等于2.1×105)3.7E-2(等于3.7×10-2)-2.8E-2(等于-2.8×10-2)
(2)以下是不合法的实数:
●345(无小数点)E7(阶码标志E之前无数字)-5(无阶码标志)53.-E3(负号位置不对)2.7E(无阶码)
标准C允许浮点数使用后缀。
后缀为“f”或“F”即表示该数为浮点数。
如356f和356.是等价的。
1.5.3.2实型变量
实型变量分为两类。
1.单精度型
单精度型变量的类型声明符为float,在TurboC中,单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供7位有效数字。
2.双精度型
双精度型变量的类型声明符为double,在TurboC中,双精度型占8个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
实型变量声明的格式和书写规则与整型相同。
例如:
floatx,y;/*x、y为单精度实型变量*/
doublea,b,c;/*a、b、c为双精度实型变量*/
也可在声明变量为实型的同时,给出变量的初值。
例如:
floatx=3.2,y=5.3;/*x、y为单精度实型变量,且有初值*/
doublea=0.2,b=1.3,c=5.1;/*a、b、c为双精度实型变量,且有初值*/
【例1.7】单精度实型变量对有效位数字的限制。
程序代码如下:
main()
{
floata;
a=0.123456789;
printf("a=%f",a);
}
运行结果:
a=0.123457
下面的例子说明了float和double的不同。
【例1.8】演示float和double的区别。
程序代码如下:
main()
{
floata;
doubleb;
a=33333.333333;
b=33333.333333333;
printf("a=%f\nb=%f\n",a,b);/*用格式化输出函数输出a和b的值*/
}
运行结果:
a=33333.332031
b=33333.333333
1.5.4字符型数据
字符型数据包括字符常量、字符变量和字符串常量。
1.5.4.1字符常量
字符常量是用单引号括起来的一个字符。
例如‘a’、‘b’、‘A’、‘=’、‘?
’都是合法的字符常量。
表1.5常用转义字符表
转义字符
转义字符的意义
转义字符
转义字符的意义
\n
回车换行
\\
反斜线符(\)
\t
横向跳到下一制表位置
\'
单引号符
\v
竖向跳格
\"
双引号符
\b
退格
\a
鸣铃
\r
回车
\ddd
1~3位八进制数所代表的字符
\f
走纸换页
\xhh
1~2位十六进制数所代表的字符
【例1.9】转义字符的使用。
程序代码如下:
main()
{
inta,b,c;/*定义a、b、c为整数*/
a=5;b=6;c=7;
printf("%d\n\t%d%d\n%d%d\t\b%d\n",a,b,c,a,b,c);
/*按要求格式输出a、b、c的值*/
}
运行结果:
5
67
567
程序说明:
1.5.4.2字符变量
字符变量用来存放字符常量,即单个字符。
每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。
字符变量的类型声明符为char。
字符变量类型声明的格式和书写规则都与整型变量相同。
例如:
chara,b;/*定义字符变量a和b*/
a='x',b='y';/*给字符变量a和b分别赋值'x'和'y'*/
整型数据为2字节量,字符数据为1字节量,当整型数据按字符型量处理时,只有低8位字节参与处理。
【例1.10】字符变量的使用。
程序代码如下:
main()
{
chara,b;
a=120;
b=121;
printf("%c,%c\n%d,%d\n",a,b,a,b);
}
运行结果:
x,y
120,121
程序说明:
本程序中,定义a、b为字符型变量,但在赋值语句中赋以整型值。
从结果看,a、b值的输出形式取决于printf函数格式串中的格式符,当格式符为“%c”时,对应输出的变量值为字符形式,当格式符为“%d”时,对应输出的变量值为整数形式。
【例1.11】将小写字母转换成大写字母。
程序代码如下:
main()
{
chara,b;
a='x';
b='y';
a=a-32;/*把小写字母转换成大写字母*/
b=b-32;
printf("%c,%c\n%d,%d\n",a,b,a,b);/*以字符型和整型输出*/
}
运行结果:
X,Y
88,89
程序说明:
由于每个小写字母比它相应的大写字母的ASCII码大32,如‘a’=‘A’+32、‘b’=‘B’+32,因此,语句a=a-32;即可将字符变量a中原有的小写字母转换成大写字母。
1.5.4.3字符串常量
前面已经提到,字符常量是由一对单引号括起来的单个字符。
C语言除了允许使用字符常量外,还允许使用字符串常量。
字符串常量是由一对双引号括起来的字符序列。
如:
“CHINA”、“Cprogram”、“$12.5”等都是合法的字符串常量。
如字符串“WORLD”在内存中的实际存放形式为:
W
O
R
L
D
\0
可以看出,字符串“WORLD”在内存中需要6个字节的存贮空间,最后一个字节存贮的是字符串结束标记‘\0’。
注意,‘\0’是系统自动加上的。
因此,“a”实际包含了两个字符:
‘a’和‘\0’,因此,把“a”赋值给一个字符变量显然是错误的。
在C语言中,没有专门的字符串变量,字符串如果需要存放在变量中,则需要用字符数组来存放。
1.5.5不同类型数据的混合运算
整型、实型(包括精度和双精度)、字符型数据间可以混合运算。
例如,下面的语句是合法的:
intx=10+'a'+1.5-12.34*'b';
在进行混合运算时,不同类型的数据要转换成同一类型。
转换的方法有两种,一是自动转换,二是强制转换。
1.5.5.1类型的自动转换
图1.21表示了类型自动转换的规则。
图1.21类型转换方向
1.5.5.2类型的强制转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
(类型声明符)(表达式)
其功能是把表达式的运算结果强制转换成类型声明符所表示的类型。
例如:
(float)a把a转换为实型,(int)(x+y)把x+y的结果转换为整型。
【例1.12】类型的强制转换。
程序代码如下:
main()
{
floatf=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);
}
运行结果:
(int)f=5,f=5.75
本例表明,f虽强制转为int型,但只在运算中起作用,这种转换是临时的,而f本身的类型并不改变。
在学习了上述相关知识之后,通过下例来完成本章提出的任务之一。
【例1.13】变量的定义及赋值。
已知a=6,b=2.5,求表达式(a+b)/3的值。
main()
{
inta=6;
floatb=2.5,y;
y=(a+b)/3;
printf("(a+b)/3=%f",y);
}
运行结果:
(a+b)/3=2.833333
1.6 基本运算符、表达式及运算的优先级
1.6.1运算符简介
运算是对数据进行加工的过程,用来表示各种不同运算的符号称为运算符。
C语言提供了相当丰富的一组运算符。
除了一般高级语言所具有的算术运算符、关系运算符、逻辑运算符外,还提供了赋值运算符、位运算符和自增自减运算符等。
运算符分类如表1.6所示。
表1.6C语言的运算符
运算符种类
运算符
算术运算符
+、-、*、/、%
自增、自减运算符
++、--
关系运算符
>、<、==、>=、<=、!
=
逻辑运算符
!
、&&、||
位运算符
<<、>>、-、|、^、&
赋值运算符
=及其扩展赋值运算符
条件运算符
?
:
逗号运算符
指针运算符
*、&
求字节数运算符
Sizeof
强制类型转转换运算符
(类型)
分量运算符
.、->
下标运算符
[]
其他
如函数调用运算符()
1.6.2算术运算符和算术表达式
1.算术运算符
算术运算符除了负值运算符外都是双目运算符,即指两个运算对象之间的运算。
取负值运算符是单目运算符。
表1.7给出了基本算术运算符的种类和功能。
表1.7算术运算符
运算符
名称
举例
运算功能
-
取负值
-x
取x的负值
+
加
x+y
求x与y的和
-
减
x-y
求x与y的差
*
乘
x*y
求x与y的积
/
除
x/y
求x与y的商
%
求余(或模)
x%y
求x除以y的余数
使用算术运算符应注意以下几点:
●减法运算符“-”可作取负值运算符,这时为单目运算符。
例如-(x+y)、-10等。
●使用除法运算符“/”时,若参与运算的变量均为整数时,其结果也为整数(舍去小数);若除数或被除数中有一个为负数,则结果值随机器而定。
例如:
-7/4,在有的机器上得到结果为-1,而有的机器上得到结果-2。
多数机器上采取“向零取整”原则,例如:
7/4=1,-7/4=-1,取整后向零靠拢。
●使用求余运算符(模运算符)“%”时,要求参与运算的变量必须均为整型,其结果值为两数相除所得的余数。
一般情况下,所得的余数与被除数符号相同。
例如:
7%4=3,10%5=0,-8%5=-3,8%-5=3。
2.算术表达式
用算术运算符、圆括号将运算对象(或称操作数)连接起来的符合C语法规则的式子,称为C算术表达式。
其中运算对象可以是常量、变量、函数等。
例如:
a*b/c-1.5+'a'
C算术表达式的书写形式与数学中表达式的书写形式是有区别的,在使用时要注意以下几点:
●C表达式中的乘号不能省略。
例如:
数学式b2-4ac,相应的C表达式应写成b*b-4*a*c。
●C表达式中只能使用系统允许的标识符。
例如:
数学式πr2相应的C表达式应写成3.1415926*r*r。
●C表达式中的内容必须书写在同一行,不允许有分子分母形式,必要时要利用圆括号保证运算的顺序。
例如:
数学式
相应的C表达式应写(a+b)/(c+d)。
●C表达式不允许使用方括号和花括号,只能使用圆括号帮助限定运算顺序。
可以使用多层圆括号,但左右括号必须配对,运算时从内层圆括号开始,由内向外依次计算表达式的值。
3.算术运算符的优先级和结合性
C语言规定了在表达式求值过程中各运算符的优先级和结合性。
●优先级:
是指当一个表达式中如果有多个运算符时,则计算是有先后次序的,这种计算的先后次序称为相应运算符的优先级。
●结合性:
是指当一个运算对象两侧的运算符的优先级别相同时,进行运算(处理)的结合方向。
按“从右向左”的顺序运算,称为右结合性;按“从左向右”的顺序运算,称为左结合性。
表1.8中给出了算术运算符的优先级和结合性。
表1.8算术运算符的优先级和结合性
运算种类
结合性
优先级
*、/、%
从左向右
高
↓
低
+、-
从左向右
在算术表达式中,若包含不同优先级的运算符,则按运算符的优先级别由高到低进行运算;若表达式中运算符的优先级别相同时,则按运算符的结合方向(结合性)进行运算。
在书写包含多种运算符的表达式时,应注意各个运算符的优先级,从而确保表达式中的运算符能以正确的顺序执行,如果对复杂表达式中运算符的计算顺序没有把握确定,可用圆括号来强制实现所希望的计算顺序。
1.6.3赋值运算符和赋值表达式
1.赋值运算
赋值符号“=”就是赋值运算符,由赋值运算符组成的表达式称为赋值表达式。
其一般形式为:
变量名=表达式;
赋值的含义是指将赋值运算符右边的表达式的值存放到以左边变量名为标识的存储单元中。
说明:
●赋值运算符的左边必须是变量,右边的表达式可以是单一的常量、变量、表达式和函数调用语句。
例如,下面都是合法的赋值表达式:
x=10;
y=x+10;
y=func();
●赋值符号“=”不同于数学中使用的等号,它没有相等的含义。
例如x=x+1;的含义是取出变量x中的值加1后,再存入变量x中去。
●在一个赋值表达式中,可以出现多个赋值运算符,其运算顺序是从右向左结合。
例如,下面是合法的赋值表达式:
x=y=z=0;/*相当于x=(y=(z=0));*/
上面的表达式在运算时,先执行z=0,再把其结果赋予y,最后再把y的赋值表达式结果值0赋予x。
又如:
a=b=3+5;/*相当于a=(b=3+5);*/
运算时,先执行b=3+5,再把它的结果赋予a,最后使a、b的值均为8。
●进行赋值运算时,当赋值运算符两边的数据类型不同时,将由系统自动进行类型转换。
转换的原则是,赋值运算符右边的数据类型转换成左边的变量类型。
转换规则如表1.9所示。
表1.9赋值运算中数据类型的转换规则
运算符左
运算符右
转换说明
float
int
将整型数据转换成实型数据后再赋值
int
float
将实型数据的小数部分截去后再赋值
longint
int、short
值不变
int、shortint
longint
右侧的值不能超过左侧数据值的范围,否则将导致意外的结果
unsigned
signed
按原样赋值。
但是如果数据范围超过相应整型的范围,将导致意外的结果
signed
unsigned
2.复合赋值运算符
其一般形式为:
变量双目运算符=表达式;
C语言规定,所有双目运算符都可以与赋值运算符一起组合成复合赋值运算符。
共存在10种复合赋值运算符,即+=、-=、*=、/=、%=、<<=、>>=、&=、^=、||=。
3.赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。
一般形式为:
变量=表达式;
赋值表达式的求解过程如下。
1.6.4逗号运算符和逗号表达式
在C语言中,逗号运算符即“,”,可以用于将若干个表达式连接起来构成一个逗号表达式。
其一般形式为:
表达式1,表达式2,...,表达式n;
求解过程为:
自左至右,先求解表达式1,再求解表达式2,……,最后求解表达式n。
表达式n的值即为整个逗号表达式的值。
例如:
a=3*4,a*5,a+10;
求解过程为:
先计算3*4,将值12赋给a,然后计算a*5的值为60,最后计算a+10的值为12+10=22,所以整个表达式的值为22。
注意变量a的值为12。
1.6.5其他常用运算符
自增、自减运算符是单目运算符,即仅对一个运算对象施加运算,运算结果仍赋予该运算对象。
参加运算的运算对象只能是变量而不能是表达式或常量,其功能是使变量值自增1和自减1。
表1.10列出了自增、自减运算符的种类和功能。
表1.10自增、自减运算符
运算符
名称
举例
等价运算
++
加1
i++或++i
i=i+1
--
减1
i--或--i
i=i-1
对一个变量i实行前置运算(++i)或后置运算(i++),其运算结果是一样的,即都使变量i值加1(i=i+1)。
但++i和i++的不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。
例如:
架设i的初值等于3,则:
j=++i;/*i的值先变成4,再赋给j,j的值为4*/
j=i++;/*先将i的值赋给j,j的值为3,然后i变为4*/
1.6.6运算符的优先级与结合性
C语言规定了运算符的“优先级”和“结合性”。
在表达式求值时,先按运算符的“优先级别”高低次序执行。
例如表达式a-b*c等价于a-(b*c),“*”运算符的优先级高于“-”运算符。
如果在一个运算对象两侧的运算符优先级别相同,则按规定的“结合方向”处理。
左结合性(自左向右结合方向)是指运算对象先与左面的运算符结合。
右结合性(自右向左结合方向)是指运算对象先与右面的运算符结合。
【例1.14】把数学算式转换成C语言表达式。
输入变量x、y、z的值,根据以下算式求n的值。
该算式转换成C语言表达式应为:
x*x+y*z/2。
源程序如下:
main()
{
intx,y,z;
floatn;
scanf("%d%d%d",&x,&y,&z);
n=x*x+y*z/(float)2;
printf("n=%f",n);
}
运行结果:
3159↙
n=76.500000
【例1.15】已知整型变量a、b、c的值,根据以下算式求y的值。
程序代码如下:
main()
{
inta,b,c;
floaty;
a=9;
b=4;
c=7;
y=(3.8*(b*b+a*c))/(6*a);
printf("y=%f",y);
}
运行结果:
y=5.559259
1.6.7常用数学函数与表达式
作为初学者,记住表1-11中数学函数是必要的。
程序中要使用