这是我读《C和指针》第5章做的笔记,复习一下C语言中各种各样的操作符,希望能对你有所帮助。
位移操作符 >>、<<
左移位操作符为<<,右移位操作符为>>。左操作数的值将移动由右操作数指定的位数。两个操作数都必须是整型类型。
标准说明无符号值执行的所有移位操作都是逻辑移位,但对于有符号值,到底是采用逻辑移位还是算术移位取决于编译器。因此,一个程序如果使用了有符号数的右移位操作,它就是不可移植的。
位操作符 & | ^
要求操作数为整数类型,它们对操作数对应的位进行指定的操作,每次对左右操作数的各一位进行操作。
假定变量a的二进制值为00101110,变量b的二进制值为01011011,a&b的结果是00001010,alb的结果是01111111,a^b的结果是011110101(相同为0,不同为1)
sizeof操作符
sizeof操作符判断它的操作数的类型长度,以字节为单位表示。操作数既可以是个表达式(常常是单个变量),也可以是两边加上括号的类型名。
sizeof(a=b+ 1)没有向a赋任何值。
增值操作符++
++或–操作符只能作用于可以位于赋值符号左边的表达式
抽象地说,前缀和后缀形式的增值操作符都复制一份变量值的拷贝。前缀操作符(++a)在进行复制之前增加变量的值,后缀操作符(a++)在进行复制之后才增加变量的值。这些操作符的结果不是被它们所修改的变量,而是变量值的拷贝,认识这一点非常重要。
关系操作符
这些操作符产生的结果都是一个整型值,而不是布尔值。在C中,你必须使用双等于号==来执行比较。
逻辑操作符
&&操作符的左操作数总是首先进行求值,如果它的值为真,然后就紧接着对右操作数进行求值。如果左操作数的值为假,那么右操作数便不再进行求值,因为整个表达式的值肯定是假的,右操作数的值已无关紧要。
||操作符也具有相同的特点,它首先对左操作数进行求值,如果它的值是真,右操作数便不再求值,因为整个表达式的值此时已经确定。这个行为常常被称为“短路求值”
逗号操作符
逗号操作符将两个或多个表达式分隔开来。这些表达式自左向右逐个进行求值,整个逗号表达式的值就是最后那个表达式的值。
总结
有符号值的右移位操作是不可移植的。
位操作的位数是个负值容易得到匪夷所思的结果。
连续赋值中各个变量的长度不一可能会损失精度。
误用=而不是==进行比较。
误用|替代||,误用&替代&&。