所有的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))
這是一個有效的表達式。
位元邏輯運算子的優先級一直受到批評。在觀念裡,&和|是類似於+和*的數值運算子。但是,表達式
a & b == 7
意謂
a & (b == 7)
而
a + b == 7
意謂
(a + b) == 7
這就需要經常使用圓括號,以免有意料之外的結果。
一元正号运算符可用于操作数表达式的类型提升。例如下例:
template void f(T const& a, T const& b){};
int main() {
int a[2];
int b[3];
f(a, b); // won't work! different values for "T"!
f(+a, +b); // works! T is "int*" both
}
安全问题
下表指出了各个运算符可能导致的安全问题:
參閱
- C
- C++
參考資料
外部連結
- [http://www.knosof.co.uk/cbook/accu06a.pdf Experimental results] showing that developers have poor knowledge of binary operator precedence.
- [http://www.mycplus.com/tutorial.asp?TID=304 Basic types & Operators]
评论 (0)