运算符总结

C++部分操作符 &&、|| 其前后各接一逻辑值,返回两逻辑值之“与”运算逻辑值和“或”运算逻辑值。如:
'A'&&34.3f的返回值是逻辑真,为1;34&&0的返回值是逻辑假,为0。
0||'B'的返回值是逻辑真,为 1;0||0的返回值是逻辑假,为0。 
&
|
^ 其前后各接一数字,返回两数字之“与”运算、“或”运算、“异或”运算值。如前面所说,先将两侧的数字转成二进制数,然后对各位进行与、或、异或操作。如:
4&6的返回值是4,4转为00000100,6转为00000110各位相与得,00000100,为4。
4|6的返回值是6,4转为00000100,6转为00000110各位相或得,00000110,为6。
4^6的返回值是2,4转为00000100,6转为00000110各位相异或得,00000010,为2。 
! 其后接数字,逻辑取反后接的数字。逻辑值就是“真”或“假”,为了用数字表示逻辑值,在 C++中规定,非零值即为逻辑真,而零则为逻辑假。因此3、43.4、'A'都表示逻辑真,而0则表示逻辑假。逻辑值被应用于后续的判断及循环语句中。而逻辑取反就是先判断“!”后面接的数字是逻辑真还是逻辑假,然后再将相应值取反。如:
!5的返回值是0,因为先由5非零而知是逻辑真,然后取反得逻辑假,故最后返回0。
!!345.4的返回值是1,先因345.4非零得逻辑真,取反后得逻辑假,再取反得逻辑真。虽然只要非零就是逻辑真,但作为编译器返回的逻辑真,其一律使用1来代表逻辑真。 
~ 其后接数字,取反后接的数字。取反是逻辑中定义的操作,不能应用于数字。为了对数字应用取反操作,电脑中将数字用二进制表示,然后对数字的每一位进行取反操作(因为二进制数的每一位都只能为1或0,正好符合逻辑的真和假)。如~123的返回值就为-124。先将123转成二进制数01111011,然后各位取反得10000100,最后得-124。
这里的问题就是为什么是8位而不是16位二进制数。因为123小于128,被定位为char类型,故为8位(关于char是什么将下篇介绍)。如果是~123ul,则返回值为4294967172。 
>>
<< 其前后各接一数字,将左侧数字右移或左移右侧数字指定的位数。与前面的 ~、&、|等操作一样,之所以要提供左移、右移操作主要是因为CPU提供了这些指令,主要用于编一些基于二进制数的算法。
<<将左侧的数字转成二进制数,然后将各位向左移动右侧数值的位数,如:4,转为00000100,左移2位,则变成00010000,得16。
>>与<<一样,只不过是向右移动罢了。如:6,转为00000110,右移1位,变成00000011,得3。如果移2位,则有一位超出,将截断,则6>>2的返回值就是00000001,为1。
左移和右移有什么用?用于一些基于二进制数的算法,不过还可以顺便作为一个简单的优化手段。考虑十进制数3524,我们将它左移2位,变成352400,比原数扩大了100倍,准确的说应该是扩大了10的2次方倍。如果将3524右移2位,变成35,相当于原数除以100的商。
同样,前面4>>2,等效于4/4的商;32>>3相当于32/8,即相当于32除以2的3次方的商。而4<<2等效于4*4,相当于4乘以2的2次方。因此左移和右移相当于乘法和除法,只不过只能是乘或除相应进制数的次方罢了,但它的运行速度却远远高于乘法和除法,因此说它是一种简单的优化手段。 



C++的优先级 
  优先级 操作符      结合性 
  1       ::             左 
  2       . -> [] ()   左 
  3 ++ -- ~ ! - + & * () sizeof new delete castname_cast<type> 单目操作符 右 
  4 .* ->* 左 
  5 * / % 左 
  6 + - 左 
  7 << >> 左 
  8 < <= > >= 左 
  9 == != 左 
  10 & 左 
  11 ^ 左 
  12 | 左 
  13 && 左 
  14 || 左 
  15 ?: 右 
  16 = *= /= %= += -= <<= >>= &= |= ^= 右 
  17 throw 左 
  18 , 左 
  C的优先级 
  一、赋值运算符 
  赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。符号为‘=’。这里并不是等于的意思,只是赋值,等于用‘==’表示。 
  注意:赋值语句左边的变量在程序的其他地方必须要声明。 
  得已赋值的变量我们称为左值,因为它们出现在赋值语句的左边;产生值的表达式我们称为右值,因为她它们出现在赋值语句的右边。常数只能作为右值。 
  例如: 
  count=5; 
  total1=total2=0; 
  第一个赋值语句大家都能理解。 
  第二个赋值语句的意思是把0同时赋值给两个变量。这是因为赋值语句是从右向左运算的,也就是说从右端开始计算。这样它先total2=0;然后total1=total2;那么我们这样行不行呢? 
  (total1=total2)=0; 
  这样是不可以的,因为先要算括号里面的,这时total1=total2是一个表达式,而赋值语句的左边是不允许表达式存在的。 
  二、算术运算符 
  在C语言中有两个单目和五个双目运算符。 
  符号 功能 
  + 单目正 
  - 单目负 
  * 乘法 
  / 除法 
  % 取模 
  + 加法 
  - 减法 
  下面是一些赋值语句的例子, 在赋值运算符右侧的表达式中就使用了上面的算术运算符: 
  Area=Height*Width; 
  num=num1+num2/num3-num4; 
  运算符也有个运算顺序问题,先算乘除再算加减。单目正和单目负最先运算。 
  取模运算符(%)用于计算两个整数相除所得的余数。例如: 
  a=7%4; 
  最终a的结果是3,因为7%4的余数是3。 
  那么有人要问了,我要想求它们的商怎么办呢? 
  b=7/4; 
  这样b就是它们的商了,应该是1。 
  也许有人就不明白了,7/4应该是1.75,怎么会是1呢?这里需要说明的是,当两个整数相除时,所得到的结果仍然是整数,没有小数部分。要想也得到小数部分,可以这样写7.0/4或者7/4.0,也即把其中一个数变为非整数。 
  那么怎样由一个实数得到它的整数部分呢?这就需要用强制类型转换了。例如: 
  a=(int) (7.0/4); 
  因为7.0/4的值为1.75,如果在前面加上(int)就表示把结果强制转换成整型,这就得到了1。那么思考一下a=(float) (7/4);最终a的结果是多少? 
  单目减运算符相当于取相反值,若是正值就变为负值,若是负数就变为正值。 
  单目加运算符没有意义,纯粹是和单目减构成一对用的。 
  三、逻辑运算符 
  逻辑运算符是根据表达式的值来返回真值或是假值。其实在C语言中没有所谓的真值和假值,只是认为非0为真值,0为假值。 
  符号 功能 
  && 逻辑与 
  || 逻辑或 
  ! 逻辑非 
  当表达式进行&&运算时,只要有一个为假,总的表达式就为假,只有当所有都为真时,总的式子才为真。当表达式进行||运算时,只要有一个为真,总的值就为真,只有当所有的都为假时,总的式子才为假。逻辑非(!)运算是把相应的变量数据转换为相应的真/假值。若原先为假,则逻辑非以后为真,若原先为真,则逻辑非以后为假。 
  还有一点很重要,当一个逻辑表达式的后一部分的取值不会影响整个表达式的值时,后一部分就不会进行运算了。例如: 
  a=2,b=1; 
  a||b-1; 
  因为a=2,为真值,所以不管b-1是不是真值,总的表达式一定为真值,这时后面的表达式就不会再计算了。 
  四、关系运算符 
  关系运算符是对两个表达式进行比较,返回一个真/假值。 
  符号 功能 
  > 大于 
  < 小于 
  >= 大于等于 
  <= 小于等于 
  == 等于 
  != 不等于 
  这些运算符大家都能明白,主要问题就是等于==和赋值=的区别了。 
  一些刚开始学习C语言的人总是对这两个运算符弄不明白,经常在一些简单问题上出错,自己检查时还找不出来。看下面的代码: 
  if(Amount=123) …… 
  很多新人都理解为如果Amount等于123,就怎么样。其实这行代码的意思是先赋值Amount=123,然后判断这个表达式是不是真值,因为结果为 123,是真值,那么就做后面的。如果想让当Amount等于123才运行时,应该if(Amount==123) …… 
  五、自增自减运算符 
  这是一类特殊的运算符,自增运算符++和自减运算符--对变量的操作结果是增加1和减少1。例如: 
  --Couter; 
  Couter--; 
  ++Amount; 
  Amount++; 
  看这些例子里,运算符在前面还是在后面对本身的影响都是一样的,都是加1或者减1,但是当把他们作为其他表达式的一部分,两者就有区别了。运算符放在变量前面,那么在运算之前,变量先完成自增或自减运算;如果运算符放在后面,那么自增自减运算是在变量参加表达式的运算后再运算。这样讲可能不太清楚,看下面的例子: 
  num1=4; 
  num2=8; 
  a=++num1; 
  b=num2++; 
  a =++num1;这总的来看是一个赋值,把++num1的值赋给a,因为自增运算符在变量的前面,所以num1先自增加1变为5,然后赋值给a,最终a也为5。b=num2++;这是把num2++的值赋给b,因为自增运算符在变量的后面,所以先把num2赋值给b,b应该为8,然后num2自增加1变为 9。 
  那么如果出现这样的情况我们怎么处理呢? 
  c=num1+++num2; 
  到底是c=(num1++)+num2;还是c=num1+(++num2);这要根据编译器来决定,不同的编译器可能有不同的结果。所以我们在以后的编程当中,应该尽量避免出现上面复杂的情况。 
  六、复合赋值运算符 
  在赋值运算符当中,还有一类C/C++独有的复合赋值运算符。它们实际上是一种缩写形式,使得对变量的改变更为简洁。 
  Total=Total+3; 
  乍一看这行代码,似乎有问题,这是不可能成立的。其实还是老样子,'='是赋值不是等于。它的意思是本身的值加3,然后在赋值给本身。为了简化,上面的代码也可以写成: 
  Total+=3; 
  复合赋值运算符有下列这些: 
  符号 功能 
  += 加法赋值 
  -= 减法赋值 
  *= 乘法赋值 
  /= 除法赋值 
  %= 模运算赋值 
  <<= 左移赋值 
  >>= 右移赋值 
  &= 位逻辑与赋值 
  |= 位逻辑或赋值 
  ^= 位逻辑异或赋值 
  上面的十个复合赋值运算符中,后面五个我们到以后位运算时再说明。 
  那么看了上面的复合赋值运算符,有人就会问,到底Total=Total+3;与Total+=3;有没有区别?答案是有的,对于A=A+1,表达式A被计算了两次,对于复合运算符A+=1,表达式A仅计算了一次。一般的来说,这种区别对于程序的运行没有多大影响,但是当表达式作为函数的返回值时,函数就被调用了两次(以后再说明),而且如果使用普通的赋值运算符,也会加大程序的开销,使效率降低。 
  七、条件运算符 
  条件运算符(?:)是C语言中唯一的一个三目运算符,它是对第一个表达式作真/假检测,然后根据结果返回两外两个表达式中的一个。 
  <表达式1>?<表达式2>:<表达式3> 
  在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式2的值;如果为假,则返回表达式3的值。 
  例如: 
  a=(b>0)?b:-b; 
  当b>0时,a=b;当b不大于0时,a=-b;这就是条件表达式。其实上面的意思就是把b的绝对值赋值给a。 
  八、逗号运算符 
  在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。 
  假设b=2,c=7,d=5, 
  a1=(++b,c--,d+3); 
  a2=++b,c--,d+3; 
  对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3,为8,所以a=8。对于第二行代码,那么也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=3。 
  还有其他的如位逻辑运算符,位移运算符等等,我们等到讲位运算时再说明。 
  九、优先级和结合性 
  从上面的逗号运算符那个例子可以看出,这些运算符计算时都有一定的顺序,就好象先要算乘除后算加减一样。优先级和结合性是运算符两个重要的特性,结合性又称为计算顺序,它决定组成表达式的各个部分是否参与计算以及什么时候计算。 
  下面是C语言中所使用的运算符的优先级和结合性: 
  优先级 运算符 结合性 
  (最高) () [] -> . 自左向右 
  ! ~ ++ -- + - * & sizeof 自右向左 
  * / % 自左向右 
  + - 自左向右 
  << >> 自左向右 
  < <= > >= 自左向右 
  == != 自左向右 
  & 自左向右 
  ^ 自左向右 
  | 自左向右 
  && 自左向右 
  || 自左向右 
  ?: 自右向左 
  = += -= *= /= %= &= ^= |= <<= >>= 自右向左 
  (最低) , 自左向右 
### 数据结构中常见运算符及其用法总结 #### 1. 基本概念 在编程语言中,运算符是对数据执行特定操作的符号。这些运算符可以分为多种类别,每种都有不同的用途和行为。对于数据结构而言,了解并掌握常用运算符有助于更高效地设计算法和解决问题。 --- #### 2. 主要分类及用法 ##### (1)算术运算符 算术运算符主要用于数计算,支持加、减、乘、除等基本操作。 - **加法 (`+`)** 和 **减法 (`-`)**:完成两个数之间的相加或相减[^1]。 - **乘法 (`*`)** 和 **除法 (`/`)**:分别用于求积和商。 - **取模 (`%`)**:返回两数相除后的余数。 示例代码: ```python a = 10 b = 3 print(a + b) # 输出 13 print(a % b) # 输出 1 ``` --- ##### (2)比较运算符 比较运算符用来判断两个的关系,通常返回布尔类型的 `True` 或 `False`。 - **等于 (`==`)** 和 **不等于 (`!=`)**:检查两者是否相同或不同。 - **大小关系 (`<`, `>`, `<=`, `>=`)**:评估数间的相对顺序[^1]。 示例代码: ```python x = 5 y = 7 print(x < y) # 输出 True print(x == y) # 输出 False ``` --- ##### (3)逻辑运算符 逻辑运算符用于组合条件表达式,适用于控制流语句。 - **AND**:只有当所有条件均为真时才返回真[^2]。 - **OR**:只要有一个条件为真就返回真[^2]。 - **NOT**:反转当前条件的结果[^2]。 示例代码: ```sql SELECT * FROM users WHERE age >= 18 AND active = TRUE; -- 查询年龄大于等于18岁且账户活跃的用户 ``` --- ##### (4)位运算符运算符直接作用于二进制位级别上的数据,广泛应用于底层开发。 - **按位与 (`&`)**:逐位对比,仅当对应位置都为1时结果才是1[^2]。 - **按位或 (`|`)**:只要有任一位为1,则该位结果即为1。 - **按位异或 (`^`)**:如果两位不同则结果为1,否则为0[^2]。 - **左移 (`<<`)** 和 **右移 (`>>`)**:将比特序列整体向指定方向移动若干位。 示例代码: ```c++ int num1 = 6; // 二进制表示为 0110 int num2 = 3; // 二进制表示为 0011 printf("%d\n", num1 & num2); // 输出 2 (0010) ``` --- ##### (5)赋运算符运算符负责把右侧的赋予左侧变量。 - **简单赋 (`=`)**:最基础的形式。 - **复合赋(如 `+=`, `-=` 等)**:简化连续的操作过程[^1]。 特殊说明:“`=|`”并非标准写法,而应写作“`|=`”,它是C/C++中的复合赋运算符之一,代表先做按位或再重新赋给原变量[^4]。 示例代码: ```cpp unsigned char flag = 0x0F; flag |= 0xF0; // 结果变为 0xFF ``` --- ##### (6)成员访问与指针解引用 针对面向对象程序设计以及动态内存管理场景下特别重要的一类符号。 - 对象属性获取(`.`)[^3]。 - 地址间接寻址(`->`)或者显式强制转换类型cast[]()等等高级特性均涉及此类别定义方式。 --- #### 3. 运算符重载 某些现代编程语言允许自定义已存在运算符的行为模式,这便是所谓的“运算符重载”。例如,在C++里面可以通过声明特殊的函数名为`operator关键字`来实现这一目标[^3]。 实例展示如何让两个自定义类别的实例能够互相叠加起来形成新的实体: ```cpp class Vector { public: int x, y; Vector(int X, int Y): x(X), y(Y){} // 定义 "+" 的含义 Vector operator+(const Vector& other){ return Vector(this->x + other.x, this->y + other.y); } }; // 测试部分 Vector v1(1, 2), v2(3, 4); Vector result = v1 + v2; cout << "(" <<result.x<< ", "<<result.y<<")"; // 应打印 "(4, 6)" ``` --- #### 4. 小结 综上所述,无论是哪种具体的运算符种类,它们都在各自的领域发挥着不可替代的作用。熟悉这些工具不仅可以让我们的编码更加简洁优雅,而且还能显著提高运行效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值