【C/C++】操作符

本文详细介绍了C++中的运算符优先级,包括单目、双目、三目运算符等,并通过实例讲解了运算符的用法。同时,讨论了运算符重载的原则和限制,强调了重载时不改变运算符的优先级、结合性和语法结构。此外,还列举了C++中不可重载的运算符和运算符重载的选择规则。
摘要由CSDN通过智能技术生成

操作符

运算符优先级顺口溜:
淡云一笔,鞍落三服

  1. 淡:单目运算符
  2. 云:算法运算符
  3. 一:移位运算符
  4. 笔:比较运算法
  5. 鞍:按位运算符
  6. 落:逻辑运算符
  7. 三:三目运算符
  8. 服:赋值运算符

~(补码运算符)

int x = 1;
int y = ~x; //1.
cout << y;
//输出'254'

解释:

x = 0000 0001
~x = 1111 1110,-x为负数,负数在计算机中用补码表示,所以符号位不变,取反加1
y = 1 0000 0010,1000 0010(BIN) = -2(DEX)

操作符1

++操作符

int i1 = 4int y1 = i1++; //如大家所知,点调用、再自增 y1 = 4 , i1 = 5; 
int i2 = 4;
int y2 = ++i2; //先自增再调用 y2 = 5 , i2 = 5; 

大体上是类似的,但是i++在计算时会用到中间变量,会占用更多的内存和时间,所以++i更好

C++不能重载的操作符

1"."(类成员访问运算符) 
(2" .*"(类成员指针访问运算符) 
(3"::"(域运算符) 
(4"sizeof"(长度运算符) 
(5" ?:"(条件运算符/三目运算符)
(6dynamic_cast7static_cast8reinterpret_cast
 (9) const_cast
 (10) typeid(获取类型信息)

运算符重载后,优先级和结合性怎么办?

用户重载新定义运算符,不改变元运算符的优先级和结合性。这就是说,对运算符重载不改变运算的优先级和结合性,并且运算符重载后,也不改变运算符的语法结构,即单目运算符的语法结构只能冲仔尾单目运算符,双目运算符只能重载为双目运算符。

编译程序如何选用那一个运算符函数?

运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。编译程序对运算符重载的选择,遵循着函数重载的算则原则。当遇到不很明显的运算时,编译程序将去寻找参数相匹配的运算符函数。

重载你算符有哪些限制?

  • 不可臆造新的运算符。必须把重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中。

  • 重载运算符坚持4个“不能改变”

    • 不能改变运算符操作数的个数;
    • 不能改变运算符原有的优先级;
    • 不能改变运算符原有的结核性;
    • 不能改变运算符原有的语法结构。

    6 运算符重载时必须遵循哪些原则?

    运算符重载可以是程序更加简洁,是表达式更加直观,增加可读性。但是运算符重载使用不宜过多,否则会带来一定麻烦。

    使用重载运算符是应遵循如下原则:

    1. 重载运算符含义必须清楚
    2. 重载运算符不能有二义性

补充运算符优先级

以下是C++编程语言中的所有运算符的优先级和结合性列表。

优先级运算符叙述示例重载性结合性
1::作用域解析(C++专有)Class::age = 2;由左至右
2++后缀递增i++
2--后缀递减i–
2{}组合{i++;a*=i;}
2()函数调用或变量初始化c_tor(int x, int y) : _x(x), _y(y * 10) {}
2[]数组访问array[4] = 2;
2.以对象方式访问成员obj.age = 34;
2->以指针方式访问成员ptr->age = 34;
2dynamic_cast运行时检查类型转换(C++专有)Y& y = dynamic_cast<Y&>(x);
2static_cast未经检查的类型转换(C++专有)Y& y = static_cast<Y&>(x);
2reinterpret_cast重定义类型转换(C++专有)int const* p = reinterpret_cast<int const*>(0x1234);
2const_cast更改非常量属性(C++专有)int* q = const_cast<int*>§;
2typeid获取类型信息(C++专有)std::type_info const& t = typeid(x);
3++前缀递增++i由右至左
3--前缀递减–i
3+一元正号int i = +1;
3-一元负号int i = -1;
3! not逻辑非 !的备用拼写if (!done) …
3~ compl按位取反 ~的备用拼写flag1 = ~flag2;
3(*type*)强制类型转换int i = (int)floatNum;
3*取指针指向的值int data = *intPtr;
3&取变量的地址int *intPtr = &data;
3sizeof某某的大小size_t s = sizeof(int);
3new动态内存分配(C++专有)long* pVar = new long;
3new[]动态数组内存分配(C++专有)long* array = new long[20];
3delete动态内存释放(C++专有)delete pVar;
3delete[]动态数组内存释放(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;
16+=以和赋值a += 3;
16-=以差赋值b -= 4;
16*=以乘赋值a *= 5;
16/=以除赋值a /= 2;
16%=以取余数赋值a %= 3;
16<<=以比特左移赋值flags <<= 2;
16>>=以比特右移赋值flags >>= 2;
16&= and_eq以比特AND赋值 &=的备用拼写flags &= new_flags;
16^= xor_eq以比特XOR赋值 ^=的备用拼写flags ^= new_flags;
16|= or_eq以比特OR赋值 |=的备用拼写flags |= new_flags;
17throw抛出异常throw EClass(“Message”);
18,逗号运算符for (i = 0, j = 0; i < 10; i++, j++) …由左至右
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值