操作符和表达式

5.1.2 移位操作符

移位操作符>>,<<。右移位操作有两种方案,一种是逻辑移位,左边移入的用0填充;另一种是算术移位,左边移入的位由原先该值的符号确定,符号位为1则移入的位为1,符号位为0的则移入的位均为0,这样能够保持原数的正负形式不变。算术左移和逻辑左移是相同的。
标准说明无符号值执行的所有移位操作都是逻辑移位,但对于有符号值,到底是采用逻辑移位还是算术移位取决于编辑器。所以在移植的时候要考虑这个。

5.1.3 位操作符

指定位置1:
value = value | (1 << bit_number);
指定位清0:
value = value & ~(1 << bit_number);

5.1.4 赋值

赋值是表达式的一种,而不是,某种类型的语句,所以只要是允许出现表达式的地方,都允许进行赋值。表达式的值就是左操作数的新值,可以作为其他赋值操作符的操作数:
a = x = y+3;
等价于:
x = y + 3;
a = x;
如果x是一个字符型变量,那么y+3的值就会截去一段,以便容纳于字符类型的变量中,而a所赋的值就是这个被截断后的值,所以不能认为a和x都被赋予相同的值。

5.1.5 单目操作符

sizeof()的操作数可以是个表达式(通常是单个变量),也可以是两边加上括号的类型名,以字节为单位表示操作数的类型长度。
eg:  sizeof(int)
sizeof(a=b+1)并没有向a赋值,因为判断表达式的长度不需要对表达式求值。

5.1.6 关系操作符

关系操作符(>,>=,<,<=,!=,==)产生的结果都是一个整型值,而不是布尔值。
==很容易漏一个,判断时可以写成5==x,漏掉后编译器会帮助检查出来。
&&操作符的左操作数总是首先进行求值,如果它为真,然后就紧接着对右操作数进行求值;如果左操作数的值为假,那么右操作数便不再进行求值。
||操作符也具有相同特点,它首先对左操作数求值,如果它的值是真,右操作数边不再求值。称之为短路求值。

5.2 布尔值

C中没有布尔值,零是假,任何非零值皆为真。
  如果一个变量包含了一个任意的整形值,应该显式地对其进行测试:
if(value != 0)
避免混合使用整型值和布尔值,不要使用简写法来测试变量还是非零,因为这类形式错误地暗示该变量在本质上是布尔型的。

5.3 左值和右值

左值是那些能够出现在赋值符号左边的东西,右值是那些能够出现在赋值符号右边的东西。左值标识了一个可以存储结果值的地点。

5.4 表达式求值

C的整形算术运算符总是至少以缺省整形类型的精度来进行的,为了获得这个精度,表达式中的字符型和短整型操作数在使用之前就被转换为普通整形,这种转换称为整型提升。在下面的表达式中,
char  a,b,c;
a = b + c;
b和c的值被提升为普通整型,然后再执行加法运算,加法运算的结果被截短,然后再存储于a中。
下面这段代码包含一个潜在的问题:
int  a = 5000;
int  b = 25;
  long c = a*b;
最后一行的乘法运算在16位整数的机器上就溢出,这样c就会被初始化为错误的值。解决方案是在在执行乘法运算之前把其中一个(或两个)操作数转换为长整型。
long c = (long)a*b;










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值