关于运算符的一些知识点

1、可以用关键字代替逻辑运算符:

#define debug qDebug()<<
int main(int argc, char *argv[])
{
    debug (true and false);
}

 2、c++没有明确规定表达式的求值顺序,不能假定表达式是从左到右求值的,为了避免奇怪的运行结果,要避免在同一个表达式同时读写同一个对象(如避免写v[i] = i++这种代码)。

3、逗号运算符、逻辑与(&&)、逻辑或(||)规定它们左侧运算对象先被求值。

  • 逗号运算符一般形式为:表达式1, 表达式2。求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。(如:y = ( x = a + b),(b + c);)
  • &&只有在左侧运算对象求值结果为true的时候才会求右侧的值
  • ||只有在左侧求值结果为false时才会求右侧的值
C++运算符优先级表
优先级 运算符 说明 结合性
1 :: 范围解析 自左向右
2 ++   -- 后缀自增/后缀自减
() 括号
[] 数组下标
. 成员选择(对象)
−> 成员选择(指针)
3 ++   -- 前缀自增/前缀自减 自右向左
+   − 加/减
!   ~ 逻辑非/按位取反
(type) 强制类型转换
* 取指针指向的值
& 某某的地址
sizeof 某某的大小
new, new[] 动态内存分配/动态数组内存分配
delete, delete[] 动态内存释放/动态数组内存释放
4 .*   ->* 成员对象选择/成员指针选择 自左向右
5 *   /   % 乘法/除法/取余
6 +   − 加号/减号
7 <<   >> 位左移/位右移
8 <   <= 小于/小于等于
>   >= 大于/大于等于
9 ==   != 等于/不等于
10 & 按位与
11 ^ 按位异或
12 | 按位或
13 && 与运算
14 || 或运算
15 ?: 三目运算符 自右向左
16 = 赋值
+=   −= 相加后赋值/相减后赋值
*=   /=   %= 相乘后赋值/相除后赋值/取余后赋值
<<=   >>= 位左移赋值/位右移赋值
&=   ^=   |= 位与运算后赋值/位异或运算后赋值/位或运算后赋值
17 throw 抛出异常
18 , 逗号 自左向右

 4、一些运算符可以重载:

5、重载函数形式是:operator后面加运算符,a+b相当于a.operator+(b)

6、预置含义:++a等价于a+=1和a=a+1,但不适用于此规则, 编译器不会根据A::operator+()和A::operator=()生成::operator+=()的定义。一个类默认带有赋值运算、取地址运算、顺序(逗号)运算的含义的,可以选择去除这些含义:

#define debug qDebug()<<
struct ceshi
{
    int frist;
    int second;
    ceshi(int one = 0,int two = 0):frist{one},second{two}
    {
    }
    void operator =(const ceshi&) = delete;
    void operator &() = delete;
    void operator ,(const ceshi&) = delete;
};

int main(int argc, char *argv[])
{
    ceshi a(4,5);
    ceshi b = a;
    a = b;
    &a;
    a,b;
}

注:ceshi b = a;是调用(拷贝/移动)构造函数而不是operator=()。

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/113817131
今日推荐