运算符优先级
C 语言包含许多运算符,由于运算符优先级的运作方式,多个运算符之间的相互作用可能变得令人困惑。
x=5+3*6;
广告
X 的值将为 23,而不是 48,因为在 C 语言中,乘法和除法的优先级高于加法和减法。
char *a[10];
a 是指向一个包含 10 个字符的数组的单个指针,还是一个包含 10 个指向字符的指针的数组?除非您了解 C 语言中的优先级约定,否则无法确定。类似地,在 E.11 中我们看到,由于优先级问题,诸如 *p.i = 10; 这样的语句不起作用。相反,必须使用 (*p).i = 10; 形式来强制正确的优先级。
下表来自 Kernighan 和 Ritchie 的《C 语言编程》(C Programming Language),展示了 C 语言中的优先级层次结构。最上面一行的优先级最高。
Operators Associativity
( [ - . Left to right
! - ++ -{- + * & (type-cast) sizeof Right to left
(in the above line, +, - and * are the unary forms)
* / % Left to right
+ - Left to right
<< >> Left to right
< <= > >= Left to right
== != Left to right
& Left to right
^ Left to right
| Left to right
&& Left to right
|| Left to right
?: Left to right
= += -= *= /= %= &= ^= |= <<= >>= Right to left
, Left to right
通过查阅此表,您可以看到 char *a[10]; 是一个包含 10 个指向字符的指针的数组。您还可以理解为什么 (*p).i 需要使用括号才能正确处理。经过一些练习后,您会记住大部分表格内容,但偶尔仍然会因为微妙的优先级问题而导致某些功能无法正常工作。