C和指针读书笔记——操作符和表达式

来源:互联网 发布:mac 搭建vps 编辑:程序博客网 时间:2024/04/28 17:59

1、C语言的算术操作符中只有%操作符要求两边都必须是整型数,其他操作符都是既适用于浮点类型又适用于整数类型;

2、C语言中的左移操作时,右边空出来的位均用0补齐,然而右移操作分为两类:逻辑右移和算术右移

    逻辑右移是左边移入的位用0填充,算术移位是左边移入的位由原先该值的符号位决定的,符号位为1的移入的位均为1,符号位为0的移入的位均为0;

注:无符号值执行的所有移位操作就是逻辑移位,而有符号值的移位操作是取决于编译器;因此如果一个程序如果使用了有符号数的右移移位操作,它就是不可移植的;

应该避免下面类型的移位操作,这个移位的位数也是由编译器决定的

a << -5
3、C语言中位操作符要求操作数必须是整数类型;

4、关于位操作中的常用操作:

(1)置位:

value  = value | 1 << bit_number;
(2)清零:

value = value & ~(1 << bit_number);
(3)测试:

value & 1 << bit_number;

5、赋值操作符的结合性是从右到左(求值的顺序),在使用赋值运算时应该考虑截短问题的存在;

6、使用复合赋值符能够使源代码更加容易阅读和书写;

7、sizeof是单目操作符而不是一个函数;

8、关于++操作符和--操作符的理解

   关于前缀形式的++操作符和后缀形式的++操作符,在操作数之前的操作符在变量值被使用之前增加它的值,在操作数之后的操作符在变量值被使用后才增加它的值;

对于前缀和后缀形式的增值操作符都复制一份变量值的拷贝,用于周围表达式的值正是这份拷贝,因此这些操作符的结果不是被它们所修改的变量,而是变量值的拷贝,故它们不能像下面所示的形式进行操作:

a++ = 10;++a = 10;
(a++和++a的结果都是a的拷贝,并不是变量的本身,因此无法进行赋值);

9、关系操作符产生的结果都是整型值;

10、在进行相等行测试比较时,要检查一下所书写的确实是双等号;

11、逻辑操作符&&与||的工作原理:&&操作符的左操作数总是首先进行求值,如果它的值为真,就对右操作数进行求值;如果左操作数的值为假,那么就不再对右操作数进行求值;同理对于||操作符,也是首先对左操作数进行求值,如果左操作数是真的,那么就不再对右操作数进行求值,这称为短路求值;

12、条件操作符能够产生更小的目标代码,从而提高效率;

13、逗号操作符能够使代码更加易于维护;

14、左值意味着一个位置,右值意味着一个值,在使用右值的地方也可以使用左值,但是在需要左值的地方不能使用右值;

15、求值的顺序问题:两个相邻操作符的执行顺序由它们的优先级决定,如果它们的优先级相同,那么它们的执行顺序由它们的结合性决定(优先级只对相邻操作符的执行顺序起作用);

16、C的整型算术运算总是至少以缺省整型类型的精度来进行的;