5

C和CPP运算符

 1 year ago
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_caststatic_castdynamic_castreinterpret_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
加法(总和) + b
前缀递增 ++a
后缀递增 a++
以加法赋值 += b
一元负号(取反) -a
减法(差) - b
前缀递减 --a
后缀递减 a--
以减法赋值 -= b
乘法(乘积) * b
以乘法赋值 *= b
除法(分之) / b
以除法赋值 /= b
模数(余数) % b
以模数赋值 %= b

比较运算符

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

比特运算符

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

其它运算符

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

C和C++运算符


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK