

C和CPP运算符
source link: https://syxdevcode.github.io/2022/07/10/C%E5%92%8CCPP%E8%BF%90%E7%AE%97%E7%AC%A6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C和CPP运算符
2022-07-10
3.7k 3 分钟
下列运算符在两个语言中都是顺序点(运算符未重载时): &&
、||
、?:
和 ,
(逗号运算符)。
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 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK