《C和指针》阅读笔记-第5章操作符和表达式

2016-12-14 09:57:09来源:http://blog.csdn.net/u013178472/article/details/53431512作者:u013178472人点击

《C和指针》阅读笔记-第5章操作符和表达式


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;

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台