C和CPP运算符

下列运算符在两个语言中都是顺序点(运算符未重载时): &&、||、?: 和 ,(逗号运算符)。

C++也包含类型转换运算符 const_cast、static_cast、dynamic_cast和 reinterpret_cast,不在表中列出以维持简洁。类型转换运算符需要在表达式中明确使用括号,因此并不存在优先级的问题。

在C里有的运算符,除了逗号运算符和箭头记头的运算符以外,在Java、Perl、C#和PHP同样也有相同的优先级、结合性和语义。

优先级运算符叙述示例重载性结合性
1 :: 作用域解析(C++专有) Class::age = 2; 否 由左至右
2 ++ 后缀递增 i++  
-- 后缀递减 i--  
{} 组合 {i++;a*=i;}  
() 函数调用或变量初始化 c_tor(int x, int y) : _x(x), _y(y * 10) {}  
[] 数组访问 array[4] = 2;  
. 以对象方式访问成员 obj.age = 34; 否
-> 以指针方式访问成员 ptr->age = 34;  
dynamic_cast 运行时检查类型转换(C++专有) Y& y = dynamic_cast<Y&>(x); 否
static_cast 未经检查的类型转换(C++专有) Y& y = static_cast<Y&>(x); 否
reinterpret_cast 重定义类型转换(C++专有) int const* p = reinterpret_cast<int const*>(0x1234); 否
const_cast 更改非常量属性(C++专有) int* q = const_cast<int*>(p); 否
typeid 获取类型信息(C++专有) std::type_info const& t = typeid(x); 否
3 ++ 前缀递增 ++i   由右至左
-- 前缀递减 --i  
+ 一元正号 int i = +1;  
- 一元负号 int i = -1;  
!
not
逻辑非
!的备用拼写
if (!done) …  
~
compl
按位取反
~的备用拼写
flag1 = ~flag2;  
(type) 强制类型转换 int i = (int)floatNum;  
* 取指针指向的值 int data = *intPtr;  
& 取变量的地址 int *intPtr = &data;  
sizeof 某某的大小 size_t s = sizeof(int); 否
new 动态内存分配(C++专有) long* pVar = new long;  
new[] 动态数组内存分配(C++专有) long* array = new long[20];  
delete 动态内存释放(C++专有) delete pVar;  
delete[] 动态数组内存释放(C++专有) delete [] array;  
4 .* 成员对象选择(C++专有) obj.*var = 24; 否 由左至右
->* 成员指针选择(C++专有) ptr->*var = 24;  
5 * 乘法 int i = 2 * 4;  
/ 除法 float f = 10.0 / 3.0;  
% 模数(取余) int rem = 4 % 3;  
6 + 加法 int i = 2 + 3;  
- 减法 int i = 5 - 1;  
7 << 比特左移 int flags = 33 << 1;  
>> 比特右移 int flags = 33 >> 1;  
8 < 小于关系 if (i < 42) …  
<= 小于等于关系 if (i <= 42) ...  
> 大于关系 if (i > 42) …  
>= 大于等于关系 if (i >= 42) ...  
9 ==
eq
等于关系
==的备用拼写
if (i == 42) ...  
!=
not_eq
不等于关系
!=的备用拼写
if (i != 42) …  
10 &
bitand
比特 AND
&的备用拼写
flag1 = flag2 & 42;  
11 ^
xor
比特 XOR(独占or)
^的备用拼写
flag1 = flag2 ^ 42;  
12 |
bitor
比特 OR(包含or)
|的备用拼写
flag1 = flag2 | 42;  
13 &&
and
逻辑 AND
&&的备用拼写
if (conditionA && conditionB) …  
14 ||
or
逻辑 OR
||的备用拼写
if (conditionA || conditionB) ...  
15 c?t:f 三元条件运算 int i = a > b ? a : b; 否 由右至左
16 = 直接赋值 int a = b;  
+= 以和赋值 a += 3;  
-= 以差赋值 b -= 4;  
*= 以乘赋值 a *= 5;  
/= 以除赋值 a /= 2;  
%= 以取余数赋值 a %= 3;  
<<= 以比特左移赋值 flags <<= 2;  
>>= 以比特右移赋值 flags >>= 2;  
&=
and_eq
以比特AND赋值
&=的备用拼写
flags &= new_flags;  
^=
xor_eq
以比特XOR赋值
^=的备用拼写
flags ^= new_flags;  
|=
or_eq
以比特OR赋值
|=的备用拼写
flags |= new_flags;  
17 throw 抛出异常 throw EClass(“Message”); 否
18 , 逗号运算符 for (i = 0, j = 0; i < 10; i++, j++) …   由左至右

列表

在本表中,a、b和c代表有效值(来自变量或返回值的逐字常数或数值)、对象名称,或适当的左值。

算术运算符

运算符名称语法可重载C里有
一元正号 +a 是 是
加法(总和) a + b 是 是
前缀递增 ++a 是 是
后缀递增 a++ 是 是
以加法赋值 a += b 是 是
一元负号(取反) -a 是 是
减法(差) a - b 是 是
前缀递减 --a 是 是
后缀递减 a-- 是 是
以减法赋值 a -= b 是 是
乘法(乘积) a * b 是 是
以乘法赋值 a *= b 是 是
除法(分之) a / b 是 是
以除法赋值 a /= b 是 是
模数(余数) a % b 是 是
以模数赋值 a %= b 是 是

比较运算符

运算符名称语法可重载C里有
小于 a < b 是 是
小于或等于 a <= b 是 是
大于 a > b 是 是
大于或等于 a >= b 是 是
不等于 a != b 是 是
等于 a == b 是 是
逻辑取反 !a 是 是
逻辑 AND a && b 是 是
逻辑 OR a || b 是 是

比特运算符

运算符名称语法可重载C里有
比特左移 a << b 是 是
以比特左移赋值 a <<= b 是 是
比特右移 a >> b 是 是
以比特右移赋值 a >>= b 是 是
比特一的补数 ~a 是 是
比特 AND a & b 是 是
以比特 AND 赋值 a &= b 是 是
比特 OR a | b 是 是
以比特 OR 赋值 a |= b 是 是
比特 XOR a ^ b 是 是
以比特 XOR 赋值 a ^= b 是 是

其它运算符

运算符名称语法可重载C里有
基本赋值 a = b 是 是
函数调用 a() 是 是
数组下标 a[b] 是 是
间接(向下参考) *a 是 是
的地址(参考) &a 是 是
成员指针 a->b 是 是
成员 a.b 否 是
间接成员指针 a->*b 是 否
间接成员 a.*b 否 否
转换 (type) a 是 是
逗号 a , b 是 是
三元条件 a ? b : c 否 是
作用域解析 a::b 否 否
的大小 sizeof a 否 是
类型识别 typeid type 否 否
分配存储区 new type 是 否
解除分配存储区 delete a 是 否

语言扩展

运算符名称语法可重载C里有提供者
标签值 && label 否 是 GCC
取得型态 typeof a
typeof(expr)
否 是 GCC
最小/最大值 a <? b
a >? b
否 否 GCC

参考:

C和C++运算符