设为首页 加入收藏

TOP

2.3.1 算术运算符与算术表达式
2013-10-10 23:05:29 来源: 作者: 【 】 浏览:78
Tags:2.3.1 算术 运算 符与 表达式

2.3.1  算术运算符与算术表达式

1.基本的算术运算符

+:加法运算符,如4 + 8,a + 10,这里a是一个变量,下同。

:减法运算符,如4 8,a 10, a。

*:乘法运算符,如4*8,a*10。

/:除法运算符,如4/8,a/10。

%:求余运算符,如7%3,则值为1。

这里要注意。

(1)括号也可以参与运算,如a*(4 + 8)。

(2)两个整数相除,结果仍然是整数,如5/3的结果是1,小数部分将舍去。

(3)求余运算符的两边都应为整数,如7.5%3是没有意义的。

(4)当整型(int,short,long)、浮点型(float,double)、字符型(char)数据混合运算时,不同类型的数据先转换为同一类型,然后再进行运算。其中short和char类型将自动转换为int类型,float类型将自动转换为double类型进行运算。如考虑以下表达式。

① a +'A',假设a是一个int类型的变量,值为1000,'A'是一个字符型常量,两者运算时,'A'将转换为int类型,运算结果是int类型。那么'A'是如何转换为int类型的呢?'A'在内存中是以它的ASCII码值65的二进制形式存放的,占1个字节,而int是4字节的,运算时用4个字节来存储'A'的值65,最低一个字节仍然存放65的二进制数,高出的3个字节将以0来填充。最后运算结果为1065。

② a + b,假设a和b都是float型,则运算时,系统自动把a和b都扩充为8个字节的double型进行运算,产生结果后又把结果转换回float型,因此结果仍然为float型。若float型的数与double型的数进行运算则结果为double型。

③ 100 +'A'-65.25,这个表达式有int型100、char型'A'、float型65.25,则运算时char型数'A'自动转换为int型,既有int型也有float型时,int型将转换为float型进行运算,而float型在运算时会自动转换为double型,所以这3个量都转换为double型参与运算,最后系统把结果转换回float型。系统相当于进行如下运算100.0 + 65.0- 65.25,运算结果为100.25。

2.算术运算符和表达式的优先级和结合性

在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x - y + z则y应先与" "号结合,执行x - y运算,然后再执行加z的运算。这种自左至右的结合方向就称为"左结合性"。而自右至左的结合方向称为"右结合性"。最典型的右结合性运算符是赋值运算符。如有赋值表达式x = y = z,由于赋值运算符"="的右结合性,应先执行y = z,即把z值赋给y,再执行x = y运算,即把y的值赋给x。C语言运算符中有少量运算符为右结合性,应注意区别,以避免理解错误。

3.强制类型转换

可以利用强制类型转换符"( )"将表达式或常量、变量转换为所需类型,例如:

(double)a :将变量a的值转换为double型。

(int)x + y :将变量x的值转换为int型再与y进行运算。

(int)(x + y) :将x + y的结果转换为int型。

(float)(11%5) :将11%5的结果转换为float型。

注意:在进行强制类型转换时,得到的是一个所需的中间类型,原来变量的类型并未发生变化,例如:

double a=3.141592;
int i=(int)a;

4.自增运算符++和自减运算符--

自增1运算符"++",其功能是使变量的值自增1。自减1运算符"--",其功能是使变量值自减1。自增,自减运算符均为右结合性。它可以有以下几种形式。

i++:先使用i,再把i的值加1。

i--:先使用i,再把i的值减1。

++i:先把i的值加1,再使用i。

--i:先把i的值减1,再使用i。

例2-6将实现自增运算符和自减运算符的功能。

例2-6

#include
int main( )
{
int i=3,j,k;

j=i++;
k=++i;
    printf("i=%d,j=%d,k=%d\n",i,j,k);
printf("%d\n",-i++);
printf("%d,%d,%d",i,i++,i++);
}

程序说明。

(1)程序首先定义了3个变量i,j,k,并为变量i赋予初值3。

(2)第二条语句,先引用i的值,再将i加1,等价于"j = i;i = i + 1;"。第三条语句,先将i加1,再引用i的值,等价于"i = i + 1;j = i;"。结果i,j,k分别输出5,3,5。

(3)第二条打印语句中,表达式"-i ++"相当于" (i++)"即先引用i的值,则-i等于-5,结果输出-5,之后i的值加1,所以该语句执行完毕后i的值已变为6。

(4)第三条语句打印出什么呢,"6,7,8"?事实上打印出的是8,7,6。因为printf中i,i++,i++的求值比较特殊,它是从右往左求值的。也就是先求最右边的i++,此时先引用i的值6,之后i的值加1变为7,然后是中间的i++,先引用i的值7,然后把i的加1使之变为8,最后是左边的i,此时i的值是8。

(5) ++,--运算符只能对单个变量起作用,对表达式和常量是不起作用的。如"(a + b)++",原意是先将a和b的值相加,再把结果加1,但++操作的对象是表达式(a + b),所以该表达式是错误的。又如8++,也是错误的,因为8是常量。要验证程序是否可以含有(a + b)++这样的表达式,可以写一个测试程序,其中含有类似的表达式,可以发现编译器在编译时会报告错误。

程序运行结果:

i=5,j=3,k=5
-5
8,7,6


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.3.2 赋值运算符与赋值表达式 下一篇2.3 运算符和表达式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: