51CTO技术论坛_中国领先的IT技术社区's Archiver

皮皮勒 发表于 2006-8-29 00:50

C语言运算符

c语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。0n gn#B^-@
2.6.1算术运算符A,i:g,Wc$Y
表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。
i9V wx;E9| CDW 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。
e0n EUabX4Pv"z [img]http://www.lukin.cn/up_files/image/2006-2-18/52018941.GIF[/img]t U N3E;X.]oGG
最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。0ud2w-J p'a V)Y?
2.6.2自增和自减
"pjA JSYn5V2v C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x;
5Z!\?vBk5\X^x 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例:o"R6oAXJ.P6J;J
x=10;
8l0p,T|X ;y=++x;
)T$p l'Ie@S 此时,y=11。如果程序改为:
sv0p%h!r5jf_7^ x=10;y=x++;5HNg,v1nP&sU-B
则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 ZX%G0[v(R/\4p
要快得多,所以尽可能采用加1或减1运算符是一种好的选择。t)Yu:mRz3U
。下面是算术运算符的优先级:
qt+`3J9c.b2k0p :最高++、-
} K(H)e"` k1xJJ%L --
J A6f(xd1xW4f -(一元减)#{[5\e+H
*、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言
+g0X*r9sIPh 处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。
lz$WkSL/M 2.6.3关系和逻辑运算符:~U$xR {"F*c _$f d
关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。
"mr5Fb:cgWZ]@$]+x [img]http://www.lukin.cn/up_files/image/2006-2-18/52018942.GIF[/img] u)g7c Jk|5|
表2-6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。关系和逻辑运算符的优先级比算术运算符低,即像表达式10>1+12的计算可以假定是对表达式10>(1+12)的计算,当然,该表达式的结果为Flase。在一个表达式中允许运算的组合。例如:
dl*uz-O7]!W[;x 10>5&&!(10= 10);
9IM;r+F[d?(l^ 2.6.4位操作符'\4Za-s)h8R
与其它语言不同,C语言支持全部的位操作符(BitwiseOperators)。因为C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力。位操作是对字节或字中的位(bit)进行测试、置位或移位处理,这里字节或字是针对C标准中的char和int数据类型而言的。位操作不能用于float、double、longdouble、void或其它复杂类型。表2-7给出了位操作的操作符。位操作中的AND、OR和NOT(1的补码)的真值表与逻辑运算等价,唯一不同的是位操作是逐位进行运算的。
RHg aW"La [img]http://www.lukin.cn/up_files/image/2006-2-18/52018943.GIF[/img])X8LyZ"t In"v8B
如表2-8所示,当且仅当一个操作数为True时,异或的输出为True,否则为Flase。 a us L y5E
位操作通常用于设备驱动程序,例如调制解调器程序、磁盘文件管理程序和打印机驱动程序。这是因为位操作可屏蔽掉某些位,如奇偶校验位(奇偶校验位用于确保字节中的其它位不会发生错误通常奇偶校验位是字节的最高位)。
ea3B\c [0{(H:] 通常我们可把位操作AND作为关闭位的手段,这就是说两个操作数中任一为0的位,其结果中对应位置为0。例如,下面的函数通过调用函数read_modem(),从调制解调器端口读入一个字符,并将奇偶校验位置成0。
*tf~Q6Fhx5gq} [img]http://www.lukin.cn/up_files/image/2006-2-18/52018944.GIF[/img] a/F cxT
字节的位8是奇偶位,将该字节与一个位1到位7为1、位8为0的字节进行与操作,可将该字节的奇偶校验位置成0。表达式ch&127正是将ch中每一位同127数字的对应位进行与操作,结果ch的位8被置成了0。在下面的例子中,假定ch接收到字符"A"并且奇偶位已经被置位。
VMA&y-`uN [img]http://www.lukin.cn/up_files/image/2006-2-18/52018945.GIF[/img] 7z7}? B1_/~#sdb
一般来说,位的AND、OR和XOR操作通过对操作数运算,直接对结果变量的每一位分别处理。正是因为这一原因(还有其它一些原因),位操作通常不像关系和逻辑运算符那样用在条件语句中,我们可以用例子说明这一点:假定X=7,那么x&&8为Ture(1),而x&8却为Flase(0)。*b!O7b(@*L9Z#{ K
记住,关系和逻辑操作符结果不是0就是1。而相似的位操作通过相应处理,结果可为任意值。换言之,位操作可以有0或1以外的其它值,而逻辑运算符的计算结果总是0或1。
:]5a({UzI;cG 移位操作符>>和>右移位数E6s(q0yI`P
左移语句是:
@1VT7XR YdM variable9?100:200;4{z`$_8H}}y
例中,赋给y的数值是100,如果x被赋给比9小的值,y的值将为200,若用if-else语句改写,有下面的等价程序:
_~H {9R_dE/t q K x=10;if(x>9)y=100;
F*bKi(x5X ;elsey=200;
}5w wi8s u ;
M8f@yt 有关C语言中的其它条件语句将在第3章进行讨论。
O JlM;SMi 2.6.6 逗号操作符2EpY2@1J'?eV
作为一个操作符,逗号把几个表达式串在一起。逗号操作符的左侧总是作为void(无值),这意味着其右边表达式的值变为以逗号分开的整个表达式的值。例如:
f.p+m-h o @!s x=(y=3,y+1);8@v/f$LRf.o
这行将3赋给y,然后将4赋给x,因为逗号操作符的优先级比赋值操作符优先级低,所以必须使用括号。实际上,逗号表示操作顺序。当它在赋值语句右边使用时,所赋的值是逗号分隔开的表中最后那个表达式的值。例如,njaHz,j(ev0o!jy
y=10;x=(y=y-5,25/y);(YE P a4wPg2q4~
执行后,x的值是5,因为y的起始值是10,减去5之后结果再除以25,得到最终结果。0c Sk a7JLCj
。在某种意义上可以认为,逗号操作符和标准英语的and是同义词。
_NX;Tp3EuC 2.6.7关于优先级的小结WS4?6F[6S o
表2-10列出了C语言所有操作符的优先级,其中包括将在本书后面讨论的某些操作符。注意,所有操作符(除一元操作符和?之外)都是左结合的。一元操作符(*,&和-)及操作符“?”则为右结合。*~U:_`mW
[img]http://www.lukin.cn/up_files/image/2006-2-18/52018948.GIF[/img]

hexiao 发表于 2006-9-16 23:08



页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.