所有的C语言运算符都被C++语言支持。C语言不支持运算符重载。
在不重载时,运算符&&
、||
、,
(逗号运算符),在第一个操作数求值之后有一个顺序点。
大部分C与C++运算符也可用于其它程序设计语言如C#、Java、Perl、PHP等,具有相同的优先级、结合性与语义。
以下是C++编程语言中的所有运算符的优先级和结合性列表。
在本表中,a
、b
和c
代表有效值(来自变量或返回值的逐字常量或数值)、对象名称,或适当的左值。
在C和C++中对运算符的约束,是语言的语法规范因素所指定的(在对应的标准中),而不是优先级列表。这造成了一些微妙的冲突。例如,在C中,条件表达式的语法是:
邏輯-OR-表達式 ? 表達式 : 條件-表達式
在C++中则是:
邏輯-or-表達式 ? 表達式 : 賦值-表達式
因此,这个表达式:
e = a ? b : c = d
两个语言的语法分析结果并不相同。在C中,这个表达式被解析为:
e = ((a ? b : c) = d)
这是一个错误的语义,因为条件-表达式的结果并不是一个左值。在C++中,则解析为:
e = (a ? b : (c = d))
这是一个有效的表达式。
比特逻辑运算符的优先级一直受到批评 Archive-It的存档,存档日期2015-02-03。在观念里,&和|是类似于+和*的数值运算符。但是,表达式
a & b == 7
意谓
a & (b == 7)
而
a + b == 7
意谓
(a + b) == 7
这就需要经常使用圆括号,以免有意料之外的结果。
一元正号运算符可用于操作数表达式的类型提升。例如下例:
template <class T> void f(T const& a, T const& b){};int main() { int a; int b; f(a, b); // won't work! different values for "T"! f(+a, +b); // works! T is "int*" both }