操作符
出处:按学科分类—工业技术 企业管理出版社《工程师手册》第850页(3982字)
在定义变量的大小和类型之后,需要利用变量进行某种运算,这是通过操作符完成,C语言比大多数高级语言的操作符要多,除了通常的赋值和算术操作外,C还操作一个完整的逻辑集,其中有些操作(如位操作)对于编写能有效利用目标处理器的DSP程序特别重要。
1.赋值操作
最基本的操作符是赋值操作符,在C中用等号(=)表示,等号右边的值,被赋给左边的变量。多个赋值语句可以进行,如a=b=1表示将1赋给b,再将b赋给a,其结果相当于a=1;b=1。在C语言中,a=ave(*x)是一个表达式,而a=ave(x);是一个语句,编译器根据最后有分号进行区分,表在达式总可以用在其它表达式中,因此,a=b+(c=ave(x));是一个合法语句。该语句执行的结果是,将ave(x)的值赋给C,再将b+c的值赋给a,C还允许一个语句中含有多个经逗号隔开的表达式,其中每个表达式都从左至右求值,整个表达式(由多个表达式组成)的值就等于最后一个表达式的值。例如,a=(olda=a,ave(x));将a的当前值赋给olda,调用函数ave(x)并将返回的结果赋给a。
2.算术操作与位操作
常用的二元算术操作在C中用下述符号表示:
* 乘法
/ 除法
十 加法
- 减法
% 取余
前四个操作符对所有类型的变量(char,int,float,double)均有定义,取余操作符仅适合于整数,注意C语言中没有指数操作符,这一浮点运算可通过函数调用实现。
C语言中有三个一元算术操作符。其中负号操作(如-i,i为int类型)改变操作数符号。另两个一元算术操作符是增量符和减量符,表示为++和--,它们分别整数变量或指针加1或减1。操作数通常在表达式的中间,增量或减量操作既可以在变量使用前进行,也可以在变量使用后进行。下面的例子说明这两个操作符对整变量i,j和k的作用:
j-7;
k=i+++j; /*i is incremented to 5.k=11*/
k=k+--j; /*i is decremcated to 6,k=17*/
k=k+i++; /*i is ineremented to 6,k=22*/
二元操作通过以下符号作用于整数;
& 位与(AND)
| 位或(OR)
位异或(XOR)
<< 算术左移(所移位数为操作数)
>> 算术右移(所移位数为操作数)
一元位操作NOT将操作数的所有位求反,其符号为例如,设i声明为unsigmed int,则i=o将i设置为最大的无符号整数。
3.组合操作
C允许操作符与赋值号(=)相结合,以使任一形如
〈variable〉=<variable〉<operator〉〈expression〉;
的语句可以用
〈variable>〈operator>=<expression〉;
代替,其中<variable〉代表同一个变量,例如:下述包含x和y的表达式对功能相同:
x=x+y; x+=y
x=x-y; x-=y;
x=x*y; x*=y;
x=x/y; x=y;
x=x%y: x%-y;
x=x&y; x&=y;
x=xv; x=y;
x=x<<y; x<<=y;
x=x>>y; x>>=y;
在多数情况下,用左边一列语句写出的程序更容易理解,因此通常避免使用组合操作符。但是有些编译器对使用组合操作符的语句能生成更有效的代码,
4.逻辑操作
与其它C表达式一样、包含逻辑操作符的表达式也有值,逻辑操作的结果为ture或false,这可以是两个值间的比较。或一系列“与”及“或”运算的结果、如果逻辑运算的结果为true,则其值为非零整数;如果结果是false,则其值为0。循环和条件语句通过检查逻辑运算的结果来控制程序流程C语言中的9个逻辑操作符为:
> 小于
<= 小于或等于
== 等于
>= 大于或等于
> 大于
!= 不等于
&& 逻辑与
‖ 逻辑或
! 逻辑非(一元操作符)
注意==容易与赋值操作符(=)混淆,混淆后仍得到一合法表达式,因为赋值的结果也可以解释为true或false。另外,&&和‖不应与对应的位操作符(&和‖)混淆,因为这可能导致难以发现的逻辑错误。
5.操作符优先权和类型转换
与其它高级语言一样,C的操作符优先权定义了一个表达式中哪些操作先完成,操作符的顺序还可通过括号改变。因此,括号中的部分最先求值,优先权相同的项从左到右计算。C语言中操作符的优先权如下(从高到低):
++,-- 增量,减量
- 一元负号
*,/,% 乘,除,取余
+,- 加,减
<<,>> 左移,右移
==,!= 等于,不等于
& 位与
位异或
| 位或
&& 逻辑与
‖ 逻辑
包含以上操作符的语句或表达式通常应使用同一类的变量和常量。但是,如果混合使用各种类型。C语言也不会象Pascal那样停止运行,或象FORTRAN那样产生奇怪的结果。C可以根据规则自动进行类型转换,类型转换的规则是:
(1)如果一个操作中包含两种类型,则级别低的类型转换为级别高的类型,这一过程称为“提升”。各种类型级别从高到低的顺序是:double,float,long.int,short,char,每种类型的符号型高于该类型。
(2)在赋值语句中,右边表达式的最后结果转换为左边的变量类型。这可能导致提升。也可能导致降级。
通常以上规则很有效,但有时必须注明转换方式,这可通过类型强制实现,方法是将所希望的类型名括起来置于被转换的变量或表达式之前,因此,设i为int型,则语句i=10*(1.55+1.67)将使i等于32(由32.2截尾得到);而语句i=10*i(int)1.55+1.67将使i等于26(由26.7截尾而得,因为(int)1.55的结果是1)。