《Pointers On C》读书笔记(第五章 操作符和表达式)

时间:2023-03-09 15:40:23
《Pointers On C》读书笔记(第五章 操作符和表达式)

1.C语言操作符优先级表

《Pointers On C》读书笔记(第五章 操作符和表达式)

2.算术操作符中%(取模操作符)只适用于整型类型,其余几个操作符(+、-、*、/)既适用于整型类型也适用于浮点类型。当/操作符的两个操作数都是整型时,它执行整除运算,其它情况下则执行浮点数除法。

3.移位操作符包括左移位和右移位操作符,且只适用于整型类型。左移位时,值最左边的位被丢弃,右边多出来的空位则由0补齐。右移位时,值最右边的位被丢弃,左边移入的位由0填充(逻辑移位)或由原先该值的符号位填充(算术移位)。标准说明无符号值执行的所有移位操作都是逻辑移位,但对于有符号值则取决于编译器。而且,如果移位的位数比操作数的位数还要多,结果也是由编译器决定的。

4.位操作符对操作数的各个位执行&(与)、|(或)和^(异或)操作,只适用于整型类型。它可与移位操作符一起使用来设置整型值中的单个位,也可用来判断整型值中的单个位。

value |=  << bit_number;       //将指定位设置为1
value &= ~( << bit_number); //将指定位设置为0
value & << bit_number; //判断指定位是否为1

5.赋值操作符用一个等号表示,它把右操作数的值存储于左操作数指定的位置。赋值是表达式的一种,而不是某种类型的语句。赋值表达式的值就是左操作数的新值,它可以作为其他赋值操作符的操作数。

复合赋值符(+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=)的左操作数只求值一次。

6.单目操作符sizeof用来判断其操作数的类型长度,以字节为单位表示。其操作数既可以是个表达式(通常是个变量),也可以是两边加上括号的类型名。当操作数是数组名时,它返回该数组的长度。

注意:用sizeof来判断表达式的类型长度时,并不需要对表达式进行求值,所以sizeof(a=b+1)并没有向a赋任何值,只是单纯返回变量a的类型长度。

7.增值操作符(++)和减值操作符(--)的结果是变量值的拷贝,认识这一点非常重要。

8.逻辑操作符(&&、||)具有一个重要的特征:短路求值。即:如果&&操作符的左操作数为假,则右操作数不再求值;如果||操作符的左操作数为真,则右操作数不再求值。

9.逗号操作符将两个或多个表达式分隔开来,这些表达式自左向右逐个进行求值,整个逗号表达式的值就是最后那个表达式的值。

注意:在使用逗号表达式之前,你要问问自己它能否让程序在某些方面表现更出色。如果答案是否定的,你就不要使用它。顺便说一下,“更出色”并不包括“更炫”、“更酷”或“令人印象更深刻”。

10.左值意味着一个位置,右值意味着一个值。

11.C的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换为普通类型,这种转换称为整型提升。如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另外一个操作数的类型,否则操作就无法进行。

寻常算术转换的顺序为:int -> unsigned int -> long int -> unsigned long int -> float -> double -> long double。

当整型值转换为float型值(标准规定仅要求6位数字的精度)时,也有可能损失精度。当float型值转换为整型值时,小部分被舍弃。如果浮点数的值过于庞大,无法容纳于整型值中,那么其结果是未定义的。

12.复杂表达式的求值顺序由3个因素决定:操作符的优先级、操作符的结合性以及操作符是否控制执行的顺序。其规则为:两个相邻操作符的执行顺序由它们的优先级决定。如果它们的优先级相同,它们的执行顺序由它们的结合性决定。除此之外,编译器可以*决定使用任何顺序对表达式进行求值,只要它不违背逗号、&&、||和?:操作符所施加的限制。