下表说明了运算符优先级和关联性的 D 规则。这些规则有点复杂,但为了保持与 ANSI-C 运算符优先级规则的完全兼容性,这是必需的。表中项的顺序为从最高优先级到最低优先级。
表 2–11 D 运算符优先级和关联性
运算符 |
关联性 |
---|---|
() [] -> . |
从左到右 |
! ~ ++ -- + - * & (type) sizeof stringof offsetof xlate |
从右到左 |
* / % |
从左到右 |
+ - |
从左到右 |
<< >> |
从左到右 |
< <= > >= |
从左到右 |
== != |
从左到右 |
& |
从左到右 |
^ |
从左到右 |
| |
从左到右 |
&& |
从左到右 |
^^ |
从左到右 |
|| |
从左到右 |
?: |
从右到左 |
= += -= *= /= %= &= ^= |= <<= >>= |
从右到左 |
, |
从左到右 |
表中还有多个运算符我们尚未讨论;后续章节中将对它们进行讨论:
sizeof |
计算对象的大小(第 7 章) |
offsetof |
计算类型成员的偏移(第 7 章) |
stringof |
将相应操作数转换为字符串(第 6 章) |
xlate |
转换数据类型(第 40 章) |
一元 & |
计算对象的地址(第 5 章) |
一元 * |
取消引用指向对象的指针(第 5 章) |
-> 和 . |
访问结构类型或联合类型的成员(第 7 章) |
表中列出的逗号 (,) 运算符用于与 ANSI-C 逗号运算符兼容,可以使用该运算符按照从左到右的顺序计算一组表达式的值,然后返回最右边表达式的值。提供此运算符是为了与 C 严格兼容,通常不应使用。
运算符优先级表中的 () 项表示函数调用;第 1 章 中提供了函数调用(如 printf() 和 trace())的示例。D 中也使用逗号列出函数的参数以及用于构成关联数组键的列表。此逗号与逗号运算符不同,它不一定从左向右计算。D 编译器不提供对函数参数或关联数组键的计算顺序的保证。在这些上下文中使用会产生负面影响的表达式(如表达式 i 和 i++ 对)时务必小心。
运算符优先级表中的 [] 项表示数组或关联数组引用。第 1 章中提供了关联数组的示例。第 9 章中介绍了称为聚合的特殊类型的关联数组。[] 运算符同样可用于对大小固定的 C 数组建立索引,如第 5 章中所述。