第二章 语法陷阱(2)

运算符的优先级问题

C.jfif

  1. 前述运算符:()、[ ]、→、.
  2. 单目运算符:sizeof、(type)、!、~、++、- -(结合性从右到左)
  3. 双目运算符:
    1. 算术运算符:+、-、*、/
    2. 移位运算符:>>、<<
    3. 关系运算符:==、≥、≤、=
    4. 逻辑运算符:&&、||
    5. 赋值运算符:=(结合性从右向左)
    6. 三目运算符:? :
  4. 逗号运算符:,

注意:

tax_rate = income>40000 && residency<5 ? 3.5 : 2.0;

这里尽管赋值运算符=比三目运算符优先级要高,但是因为其从右向左的结合性,因此要先计算三目运算符再对tax_rate进行赋值

【例】一个经典的错误

while(c=getc(in) != EOF) ...

这段代码本意是从文件中读取一个字符,然后赋值给c,再与EOF(-1)进行比较。

但是,这里由于赋值运算符=比关系运算符!=优先级低,因此会先计算getc(in)!=EOF,返回结果为1。再将值赋给c,这样c会一直为1

改进方式:

while((c = getc(in)) != EOF)...