运算符优先级
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 需要使用括号才能正确处理。经过一些练习后,您会记住大部分表格内容,但偶尔仍然会因为微妙的优先级问题而导致某些功能无法正常工作。