Compare commits

..

1 Commits
main ... main

Author SHA1 Message Date
Cym10x 6da70753c9 {{file}}
1 month ago

@ -0,0 +1,2 @@
参考资料:[C++ Reference](cppreference.cn)

@ -0,0 +1,75 @@
下表列出了 C++ 运算符的优先级和结合性。运算符从上到下按优先级降序排列。a、b 和 c 是操作数。
|优先级|运算符|描述|结合性|
|---|---|---|---|
|1|a::b|[作用域解析](https://cppreference.cn/w/cpp/language/identifiers#Qualified_identifiers "cpp/language/identifiers")|从左到右 →|
|2|a++ a--|后缀/后置 [增量和减量](https://cppreference.cn/w/cpp/language/operator_incdec "cpp/language/operator incdec")|
|`_type_`(a) `_type_`{a}|[函数式转换](https://cppreference.cn/w/cpp/language/explicit_cast "cpp/language/explicit cast")|
|a()|[函数调用](https://cppreference.cn/w/cpp/language/operator_other#Built-in_function_call_operator "cpp/language/operator other")|
|a[]|[下标](https://cppreference.cn/w/cpp/language/operator_member_access#Built-in_subscript_operator "cpp/language/operator member access")|
|a.b a->b|[成员访问](https://cppreference.cn/w/cpp/language/operator_member_access#Built-in_member_access_operators "cpp/language/operator member access")|
|3|++a --a|前缀 [增量和减量](https://cppreference.cn/w/cpp/language/operator_incdec "cpp/language/operator incdec")|从右到左 ←|
|+a -a|一元 [加号和减号](https://cppreference.cn/w/cpp/language/operator_arithmetic#Unary_arithmetic_operators "cpp/language/operator arithmetic")|
|!a ~a|[逻辑非](https://cppreference.cn/w/cpp/language/operator_logical "cpp/language/operator logical") 和 [按位非](https://cppreference.cn/w/cpp/language/operator_arithmetic#Bitwise_logic_operators "cpp/language/operator arithmetic")|
|(`_type_`)a|[C 风格转换](https://cppreference.cn/w/cpp/language/explicit_cast "cpp/language/explicit cast")|
|*a|[间接寻址](https://cppreference.cn/w/cpp/language/operator_member_access#Built-in_indirection_operator "cpp/language/operator member access") (解引用)|
|&a|[取地址](https://cppreference.cn/w/cpp/language/operator_member_access#Built-in_address-of_operator "cpp/language/operator member access")|
|[`sizeof`](https://cppreference.cn/w/cpp/language/sizeof "cpp/language/sizeof")|[sizeof](https://cppreference.cn/w/cpp/language/sizeof "cpp/language/sizeof")[[注 1]](#cite_note-1)|
|[co_await](https://cppreference.cn/w/cpp/keyword/co_await "cpp/keyword/co await")|[await-表达式](https://cppreference.cn/w/cpp/language/coroutines "cpp/language/coroutines") (C++20)|
|[`new`](https://cppreference.cn/w/cpp/language/new "cpp/language/new")  [`new[]`](https://cppreference.cn/w/cpp/language/new "cpp/language/new")|[动态内存分配](https://cppreference.cn/w/cpp/language/new "cpp/language/new")|
|[`delete`](https://cppreference.cn/w/cpp/language/delete "cpp/language/delete")  [`delete[]`](https://cppreference.cn/w/cpp/language/delete "cpp/language/delete")|[动态内存释放](https://cppreference.cn/w/cpp/language/delete "cpp/language/delete")|
|4|a.*b a->*b|[指向成员的指针](https://cppreference.cn/w/cpp/language/operator_member_access#Built-in_pointer-to-member_access_operators "cpp/language/operator member access")|从左到右 →|
|5|a * b a / b a % b|[乘法、除法和取模](https://cppreference.cn/w/cpp/language/operator_arithmetic#Multiplicative_operators "cpp/language/operator arithmetic")|
|6|a + b a - b|[加法和减法](https://cppreference.cn/w/cpp/language/operator_arithmetic#Additive_operators "cpp/language/operator arithmetic")|
|7|a << b a >> b|按位 [左移和右移](https://cppreference.cn/w/cpp/language/operator_arithmetic#Bitwise_shift_operators "cpp/language/operator arithmetic")|
|8|a <=> b|[三路比较运算符](https://cppreference.cn/w/cpp/language/operator_comparison#Three-way_comparison "cpp/language/operator comparison") (C++20 起)|
|9|a < b a <= b a > b a >= b|分别用于 [关系运算符](https://cppreference.cn/w/cpp/language/operator_comparison "cpp/language/operator comparison") `**<**`、`**<=**`、`**>**` 和 `**>=**`|
|10|a == b a != b|分别用于 [相等运算符](https://cppreference.cn/w/cpp/language/operator_comparison "cpp/language/operator comparison") `**==**``**!=**`|
|11|a & b|[按位与](https://cppreference.cn/w/cpp/language/operator_arithmetic#Bitwise_logic_operators "cpp/language/operator arithmetic")|
|12|a ^ b|[按位异或](https://cppreference.cn/w/cpp/language/operator_arithmetic#Bitwise_logic_operators "cpp/language/operator arithmetic") (异或)|
|13|a \| b|[按位或](https://cppreference.cn/w/cpp/language/operator_arithmetic#Bitwise_logic_operators "cpp/language/operator arithmetic") (包含或)|
|14|a && b|[逻辑与](https://cppreference.cn/w/cpp/language/operator_logical "cpp/language/operator logical")|
|15|a \| b|[逻辑或](https://cppreference.cn/w/cpp/language/operator_logical "cpp/language/operator logical")|
|16|a ? b : c|[三元条件](https://cppreference.cn/w/cpp/language/operator_other#Conditional_operator "cpp/language/operator other")[[注 2]](#cite_note-2)|从右到左 ←|
|[`throw`](https://cppreference.cn/w/cpp/language/throw "cpp/language/throw")|[throw 运算符](https://cppreference.cn/w/cpp/language/throw "cpp/language/throw")|
|[co_yield](https://cppreference.cn/w/cpp/keyword/co_yield "cpp/keyword/co yield")|[yield-表达式](https://cppreference.cn/w/cpp/language/coroutines "cpp/language/coroutines") (C++20)|
|a = b|[直接赋值](https://cppreference.cn/w/cpp/language/operator_assignment#Builtin_direct_assignment "cpp/language/operator assignment") (C++ 类默认提供)|
|a += b a -= b|通过加法和减法进行的[复合赋值](https://cppreference.cn/w/cpp/language/operator_assignment#Builtin_compound_assignment "cpp/language/operator assignment")|
|a *= b a /= b a %= b|通过乘法、除法和取模进行的[复合赋值](https://cppreference.cn/w/cpp/language/operator_assignment#Builtin_compound_assignment "cpp/language/operator assignment")|
|a <<= b a >>= b|通过按位左移和右移进行的[复合赋值](https://cppreference.cn/w/cpp/language/operator_assignment#Builtin_compound_assignment "cpp/language/operator assignment")|
|a &= b a ^= b a \|= b|通过按位与、异或和或进行的[复合赋值](https://cppreference.cn/w/cpp/language/operator_assignment#Builtin_compound_assignment "cpp/language/operator assignment")|
|17|a, b|[逗号](https://cppreference.cn/w/cpp/language/operator_other#Built-in_comma_operator "cpp/language/operator other")|从左到右 →|
1. [](#cite_ref-1) sizeof 的操作数不能是 C 风格类型转换:表达式 sizeof (int) * p 被明确解释为 (sizeof(int)) * p而不是 sizeof((int)*p)。
2. [](#cite_ref-2) 条件运算符中间的表达式 (在 `**?**``**:**` 之间) 被解析为带有括号的:它相对于 `**?:**` 的优先级被忽略。
在解析表达式时,表中某个行上列出的具有优先级的运算符将比表中下方行上列出的优先级较低的任何运算符更紧密地绑定 (如同用括号括起来) 到其参数。例如,表达式 [std::cout](https://cppreference.cn/w/cpp/io/cout) << a & b *p++ 分别被解析为 ([std::cout](https://cppreference.cn/w/cpp/io/cout) << a) & b 和 *(p++),而不是 [std::cout](https://cppreference.cn/w/cpp/io/cout) << (a & b) (*p)++。
具有相同优先级的运算符根据其结合性方向绑定到其参数。例如,表达式 a = b = c 被解析为 a = (b = c),而不是 (a = b) = c因为赋值运算符的结合性是从右到左的但是 a + b - c 被解析为 (a + b) - c而不是 a + (b - c),因为加法和减法的结合性是从左到右的。
对于一元运算符,结合性规范是多余的,仅为完整性而显示:一元前缀运算符总是从右到左结合 (delete ++*p 是 delete(++(*p))),一元后缀运算符总是从左到右结合 (a[1][2]++ 是 ((a[1])[2])++)。请注意对于成员访问运算符即使它们与一元后缀运算符归为一类结合性也是有意义的a.b++ 被解析为 (a.b)++,而不是 a.(b++)。
运算符优先级不受[运算符重载](https://cppreference.cn/w/cpp/language/operators "cpp/language/operators")的影响。例如,[std::cout](https://cppreference.cn/w/cpp/io/cout) << a ? b : c; ([std::cout](https://cppreference.cn/w/cpp/io/cout) << a) ? b : c;
### [编辑] 注意
优先级和结合性是编译时概念,独立于[求值顺序](https://cppreference.cn/w/cpp/language/eval_order "cpp/language/eval order"),后者是运行时概念。
标准本身并未指定优先级级别。它们是从语法中派生出来的。
[`const_cast`](https://cppreference.cn/w/cpp/language/const_cast "cpp/language/const cast")、[`static_cast`](https://cppreference.cn/w/cpp/language/static_cast "cpp/language/static cast")、[`dynamic_cast`](https://cppreference.cn/w/cpp/language/dynamic_cast "cpp/language/dynamic cast")、[`reinterpret_cast`](https://cppreference.cn/w/cpp/language/reinterpret_cast "cpp/language/reinterpret cast")、[`typeid`](https://cppreference.cn/w/cpp/language/typeid "cpp/language/typeid")、[`sizeof...`](https://cppreference.cn/w/cpp/language/sizeof... "cpp/language/sizeof...")、[`noexcept`](https://cppreference.cn/w/cpp/language/noexcept "cpp/language/noexcept") 和 [`alignof`](https://cppreference.cn/w/cpp/language/alignof "cpp/language/alignof") 未包含在内,因为它们从不含糊。
一些运算符有[替代拼写](https://cppreference.cn/w/cpp/language/operator_alternative "cpp/language/operator alternative") (例如and 代表 &&or 代表 ||not 代表 ! 等)。
在 C 中,三元条件运算符的优先级高于赋值运算符。因此,表达式 e = a < d ? a++ : a = d C++ e = ((a < d) ? (a++) : (a = d)),但在 C C C
### [编辑] 另请参见
|常见运算符| | | | | | |
|---|---|---|---|---|---|---|
|[赋值](https://cppreference.cn/w/cpp/language/operator_assignment "cpp/language/operator assignment")|[递增 <br>递减](https://cppreference.cn/w/cpp/language/operator_incdec "cpp/language/operator incdec")|[算术](https://cppreference.cn/w/cpp/language/operator_arithmetic "cpp/language/operator arithmetic")|[逻辑](https://cppreference.cn/w/cpp/language/operator_logical "cpp/language/operator logical")|[比较](https://cppreference.cn/w/cpp/language/operator_comparison "cpp/language/operator comparison")|[成员 <br>访问](https://cppreference.cn/w/cpp/language/operator_member_access "cpp/language/operator member access")|[其他](https://cppreference.cn/w/cpp/language/operator_other "cpp/language/operator other")|
|a = b <br>a += b <br>a -= b <br>a *= b <br>a /= b <br>a %= b <br>a &= b <br>a \|= b <br>a ^= b <br>a <<= b <br>a >>= b|++a <br>--a <br>a++ <br>a--|+a <br>-a <br>a + b <br>a - b <br>a * b <br>a / b <br>a % b <br>~a <br>a & b <br>a \| b <br>a ^ b <br>a << b <br>a >> b|!a <br>a && b <br>a \| b|a == b <br>a != b <br>a < b <br>a > b <br>a <= b <br>a >= b <br>a <=> b|a[...] <br>*a <br>&a <br>a->b <br>a.b <br>a->*b <br>a.*b|函数调用<br><br>a(...)|
|逗号<br><br>a, b|
|条件<br><br>a ? b : c|
|特殊运算符| | | | | | |
|[static_cast](https://cppreference.cn/w/cpp/language/static_cast "cpp/language/static cast") 将一种类型转换为另一种相关类型 <br>[dynamic_cast](https://cppreference.cn/w/cpp/language/dynamic_cast "cpp/language/dynamic cast") 在继承层次结构内进行转换 <br>[const_cast](https://cppreference.cn/w/cpp/language/const_cast "cpp/language/const cast") 添加或移除 [cv](https://cppreference.cn/w/cpp/language/cv "cpp/language/cv")-限定符 <br>[reinterpret_cast](https://cppreference.cn/w/cpp/language/reinterpret_cast "cpp/language/reinterpret cast") 将类型转换为不相关类型 <br>[C 风格转换](https://cppreference.cn/w/cpp/language/explicit_cast "cpp/language/explicit cast") 通过 static_cast、const_cast 和 reinterpret_cast 的混合将一种类型转换为另一种类型。 <br>[new](https://cppreference.cn/w/cpp/language/new "cpp/language/new") 创建具有动态存储期的对象 <br>[delete](https://cppreference.cn/w/cpp/language/delete "cpp/language/delete") 销毁先前由 new 表达式创建的对象并释放获得的内存区域 <br>[sizeof](https://cppreference.cn/w/cpp/language/sizeof "cpp/language/sizeof") 查询类型的大小 <br>[sizeof...](https://cppreference.cn/w/cpp/language/sizeof... "cpp/language/sizeof...") 查询 [](https://cppreference.cn/w/cpp/language/pack "cpp/language/pack") 的大小 (C++11 起) <br>[typeid](https://cppreference.cn/w/cpp/language/typeid "cpp/language/typeid") 查询类型的类型信息 <br>[noexcept](https://cppreference.cn/w/cpp/language/noexcept "cpp/language/noexcept") 检查表达式是否可以抛出异常 (C++11 起) <br>[alignof](https://cppreference.cn/w/cpp/language/alignof "cpp/language/alignof") 查询类型的对齐要求 (C++11 起)| | | | | | |

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Loading…
Cancel
Save