上一页 下一页

C 语言编程基础

运算符优先级

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