0%

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

第5章 操作符和表达式

5.1 简介

第5章-操作符和表达式

详细见第5章-操作符和表达式

5.2 收获

5.2.1 移位操作符的填充问题

左移n位,在右侧补充n个0

image-20200513200340111

右移有两种方案。一是逻辑移位,左边移入的位用0填充;二是算术移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样能够保证原数的正负形式不变。

如果一个程序使用了有符号数的右移位操作,它就是不可移植的

5.2.2 赋值时的截短问题

image-20200513201652427

EOF需要的位数比字符型值所能提供的位数要多,这也是getchar返回一个整型值而不是字符值的原因。然而,把getchar的返回值首先存储于char中将导致它被截短。然后这个被截短的值被提升为整型并与EOF进行比较。当这段存在错误的代码在使用有符号字符集的机器上运行时,如果读取了一个值为\377的字节时,循环将会终止,因为这个值截短再提升之后与EOF相等。当这段代码在使用无符号字符集的机器上运行时,这个循环将永远不会停止!

5.2.3 C没有显示的布尔值

C语言使用整数代替布尔值,规则零是假,任何非零值皆为真

避免混合使用整型值和布尔值

若一个变量用于表示布尔值,不要通过把它与任何特定的值进行比较来测试这个变量是否为真值,哪怕是与TRUEFALSE。相反,应该像下面测试

image-20200513204504218

5.2.4 操作符优先级

image-20200513205339805

image-20200513205416701

术语lexp表示左值表达式,rexp表示右值表达式。记住,左值意味着一个位置,而右值意味着一个值。

5.2.5 操作符容易出问题的地方

  1. 使用=替代了==
  2. 使用|替代了||,使用&替代了&&
  3. 有符号值的右移位操作是不可移植的。
  4. 连续赋值中各个变量的长度不一,意义不同
  5. 移位操作的位数不能是负数
  6. 编写了一个结果依赖于求值顺序的表达式,大忌啊!

5.2.6 编程好习惯

  1. 使用复合赋值符可以使程序更易于维护
  2. 使用条件操作符替代if语句以简化表达式
  3. 使用逗号操作符来消除多余的代码
  4. 不要混用整型和布尔型值