按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
2。 算术表达式和运算符的优先级和结合性
表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,
它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺
序进行。单个的常量、变量、函数可以看作是表达式的特例。
谭浩强 C 语言程序设计 2001 年 5 月 1 日
算术表达式是由算术运算符和括号连接起来的式子。
? 算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合 C 语
法规则的式子。
以下是算术表达式的例子:
a+b
(a*2)/c
(x+r)*8…(a+b)/7
++I
sin(x)+sin(y)
(++i)…(j++)+(k……)
? 运算符的优先级:C语言中,运算符的运算优先级共分为 15 级。1 级最高,15 级最低。
在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符
优先级相同时,则按运算符的结合性所规定的结合方向处理。
? 运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结
合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x…y+z
则 y 应先与“…”号结合,执行 x…y 运算,然后再执行+z 的运算。这种自左至右的结合
方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最典型的右结合
性运算符是赋值运算符。如 x=y=z;由于“=”的右结合性,应先执行 y=z 再执行 x=(y=z)
运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
3。 强制类型转换运算符
其一般形式为:
(类型说明符) (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
(float) a 把 a 转换为实型
(int)(x+y) 把 x+y 的结果转换为整型
4。 自增、自减运算符
自增1,自减1运算符:自增 1 运算符记为“++”,其功能是使变量的值自增 1。
自减 1 运算符记为“……”,其功能是使变量值自减 1。
自增 1,自减 1 运算符均为单目运算,都具有右结合性。可有以下几种形式:
++i i 自增 1 后再参与其它运算。
……i i 自减 1 后再参与其它运算。
i++ i 参与运算后,i 的值再自增 1。
i…… i 参与运算后,i 的值再自减 1。
在理解和使用上容易出错的是 i++和 i……。 特别是当它们出在较复杂的表达式或语句中
时,常常难于弄清,因此应仔细分析。
【例 3。16】
main(){
int i=8;
printf(〃%dn〃;++i);
printf(〃%dn〃;……i);
printf(〃%dn〃;i++);
printf(〃%dn〃;i……);
printf(〃%dn〃;…i++);
printf(〃%dn〃;…i……);
}
谭浩强 C 语言程序设计 2001 年 5 月 1 日
i 的初值为 8,第 2 行 i 加 1 后输出故为 9;第 3 行减 1 后输出故为 8;第 4 行输出 i 为
8 之后再加 1(为 9);第 5 行输出 i 为 9 之后再减 1(为 8) ;第 6 行输出…8 之后再加 1(为 9),
第 7 行输出…9 之后再减 1(为 8)。
【例 3。17】
main(){
int i=5;j=5;p;q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf(〃%d;%d;%d;%d〃;p;q;i;j);
}
这个程序中,对 P=(i++)+(i++)+(i++)应理解为三个 i 相加,故 P 值为 15。然后 i 再自增 1
三次相当于加 3 故 i 的最后值为 8。而对于 q 的值则不然,q=(++j)+(++j)+(++j)应理解为 q
先自增 1,再参与运算,由于 q 自增 1 三次后值为 8,三个 8 相加的和为 24,j 的最后值仍
为 8。
3。9 赋值运算符和赋值表达式
1。 赋值运算符
简单赋值运算符和表达式:简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表
达式。其一般形式为:
变量=表达式
例如:
x=a+b
w=sin(a)+sin(b)
y=i+++……j
赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。
因此
a=b=c=5
可理解为
a=(b=(c=5))
在其它高级语言中,赋值构成了一个语句,称为赋值语句。 而在 C 中,把“=”定义
为运算符,从而组成赋值表达式。 凡是表达式可以出现的地方均可出现赋值表达式。
例如,式子:
x=(a=5)+(b=8)
是合法的。它的意义是把 5 赋予 a,8 赋予 b,再把 a;b 相加,和赋予 x,故 x 应等于 13。
在C语言中也可以组成赋值语句,按照C语言规定,任何表达式在其未尾加上分号就
构成为语句。因此如
x=8;a=b=c=5;
谭浩强 C 语言程序设计 2001 年 5 月 1 日
都是赋值语句,在前面各例中我们已大量使用过了。
2。 类型转换
如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边
的类型换成左边的类型。具体规定如下:
1) 实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。
2) 整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值
为 0)。
3) 字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的 ASCII
码值放到整型量的低八位中,高八位为 0。整型赋予字符型,只把低八位赋予字符
量。
【例 3。18】
main(){
int a;b=322;
float x;y=8。88;
char c1='k';c2;
a=y;
x=b;
a=c1;
c2=b;
printf(〃%d;%f;%d;%c〃;a;x;a;c2);
}
本例表明了上述赋值运算中类型转换的规则。a 为整型,赋予实型量 y 值 8。88 后只取整
数 8。x 为实型,赋予整型量 b 值 322, 后增加了小数部分。字符型量 c1 赋予 a 变为整型,
整型量 b 赋予 c2 后取其低八位成为字符型(b 的低八位为 01000010,即十进制 66,按 ASCII
码对应于字符 B)。
3。 复合的赋值运算符
在 赋 值 符 “ = ” 之 前 加 上 其 它 二 目 运 算 符 可 构 成 复 合 赋 值 符 。 如 +=;…=;*=; /
=;%=;=;&=;^=;|=。
构成复合赋值表达式的一般形式为:
变量 双目运算符=表达式
它等效于
变量=变量 运算符 表达式
例如:
a+=5 等价于 a=a+5
x*=y+7 等价于 x=x*(y+7)
r%=p 等价于 r=r%p
复合赋值符这种写法,对初学者可能不习惯,但十分有利于编译处理,能提高编译效
率并产生质量较高的目标代码。
3。10 逗号运算符和逗号表达式
在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接
谭浩强 C 语言程序设计 2001 年 5 月 1 日
起来组成一个表达式, 称为逗号表达式。
其一般形式为:
表达式 1,表达式 2
其求值过程是分别求两个表达式的值,并以表达式 2 的值作为整个逗号表达式的值。
【例 3。19】
main(){
int a=2;b=4;c=6;x;y;
y=(x=a+b);(b+c);
printf(〃y=%d;x=%d〃;y;x);
}
本例中,y 等于整个逗号表达式的值,也就是表达式 2 的值,x 是第一个表达式的值。
对于逗号表达式还要说明两点:
1) 逗号表达式一般形式中的表达式 1 和表达式 2 也可以又是逗号表达式。
例如:
表达式 1,(表达式 2,表达式 3)
形成了嵌套情形。因此可以把逗号表达式扩展为以下形式:
表达式 1,表达式 2,…表达式 n
整个逗号表达式的值等于表达式 n 的值。
2) 程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定
要求整个逗号表达式的值。
并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号
只是用作各变量之间的间隔符。
3。11 小结
3。11。1 C的数据类型
基本类型,构造类型,指针类型,空类型
3。11。2 基本类型的分类及特点
字符型
基本整型
短整型
长整型
无符号型
无符号长整型
单精度实型
双精度实型
类型说明符
char
int
short int
long int
unsigned
unsigned long
float
double
字节
1
2
2
4
2
4
4
8
数值范围
C 字符集
…32768~32767
…32768~32767
…214783648~214783647
0~65535
0~4294967295
3/4E…38~3/4E+38
1/7E…308~1/7E+308
3。11。3 常量后缀
L 或 l 长整型
U 或 u 无符号数
F 或 f 浮点数
3。11。4 常量类型
谭浩强 C 语言程序设计 2001 年 5 月 1 日
整数,长整数,无符号数,浮点数,字符,字符串,符号常数,转义字符。
3。11。5 数据类型转换
?u33258X动转换:在不同类型数据的混合运算中,由系统自动实现转换,由少字节类型向多字节
类型转换。不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左
边的类型。
?u24378X制转换:由强制转换运算符完成转换。
3。11。6 运算符优先级和结合性
一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关
系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运
算符具有右结合性。
3。11。7 表达式
表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类
型。表达式求值按运算符的优先级和结合性所规定的顺序进行。
谭浩强 C 语言程序设计 2001 年 5 月 1 日
4 最简单的 C 程序设计—顺序程序设计
从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构、分支结构、循环
结构。 这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些
程序结构。 本章介绍这些基本语句及其在顺序结构中的应用,使读者对C程序有一个初步
的认识, 为后面各章的学习打下基础。
4。1 C语句概述
C程序的结构:
C程序
源程序文件1
源程序文件2
源程序文件n
预 处 理 命 令
全 局 变 量 声 明
函 数 首 部
函 数 1
函 数 体
函 数 n
局 部 变 量 声 明
执 行 语 句
C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。
C 语句可分为以下五类:
1) 表达式语句
2) 函数调用语句
3) 控制语句
4) 复合语句
5) 空语句
1。 表达式语句:表达式语句由表达式加上分号“;”组成。
其一般形式为:
表达式;
执行表达式语句就是计算表达式的值。
例如:
x=y+z; 赋值语句;
谭浩强 C 语言程序设计 2001 年 5 月 1 日
y+z; 加法运算语句,但计算结果不能保留,无实际意义;
i++; 自增 1 语句,i