符号-分节4(逻辑运算符,位运算及左右移位运算)

时间:2022-09-02 22:45:12

逻辑运算符

||和&&是我们经常用到的逻辑运算符,与按位运算符|和&是两码事。下一节会介绍按位 运算符。虽然简单,但毕竟容易犯错。看例子: int i=0; int j=0;

if((++i>0)||(++j>0)) {
//打印出i 和j 的值。 }
结果:i=1;j=0。

不要惊讶。逻辑运算符||两边的条件只要有一个为真,其结果就为真;只要有一个结果 为假,其结果就为假。if((++i>0)||(++j>0))语句中,先计算(++i>0),发现其结果为真,后面 的(++j>0)便不再计算。同样&&运算符也要注意这种情况。这是很容易出错的地方,希望读者注意。

位运算

C 语言中位运算包括下面几种:

& 按位与

| 按位或

^ 按位异或

~ 取反

<< 左移

>> 右移
前4 种操作很简单,一般不会出错。但要注意按位运算符|和&与逻辑运算符||和&&完全 是两码事,别混淆了。

其中按位异或操作可以实现不用第三个临时变量交换两个变量的值:a ^= b; b ^= a;a ^= b;但并不推荐这么做,因为这样的代码读起来很费劲。

左移和右移

下面讨论一下左移和右移:
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干 位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若 干位,“>>”右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同 移动。当为正数时, 最高位补0;而为负数时,符号位为1,最高位是补0 或是补1 取决 于编译系统的规定。Turbo C 和很多系统规定为补1。

再看看下面的例子: 0x01<<2+3;
结果为7 吗?测试一下。结果为32?别惊讶,32 才是正确答案。因为“+”号的优先 级比移位运算符的优先级高(关于运算符的优先级,我并不想在这里做过多的讨论,你几 乎可以在任何一本C 语言书上找到)。好,在32 位系统下,再把这个例子改写一下: 0x01<<2+30;或0x01<<2-3;
这样行吗?不行。一个整型数长度为32 位,左移32 位发生了什么事情?溢出!左移-1 位呢?反过来移?所以,左移和右移的位数是有讲究的。左移和右移的位数不能大于数据 的长度,不能小于0。