运算符和优先级

这篇博客详细介绍了各种编程语言中常见的运算符,包括赋值运算符、算术运算符、自增自减运算符、关系运算符、逻辑运算符、三目运算符、逗号运算符和位运算符。同时,还讲解了运算符的优先级,帮助读者理解运算符的工作原理和计算顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

运算符也叫操作符,运算符可以对一个或多个操作数进行运算,并获取运算结果。例如:2+3,其操作数是2和3,而运算符则是“+”。主要的运算符有:赋值运算符,算术运算符,关系运算符,逻辑运算符和位运算符。

名称符号
赋值运算符=、+=,-=,*=,/=,%=,>>=,<<= ,&=,
算术运算符+、-、*、/、%
关系运算符==、!=、>、>=、<、<=
逻辑运算符&&、||、!
自增自减运算符++、–
三目运算符?:
逗号运算符,
位运算符&、|、~、^、<<、>>

一、赋值运算符

1.1 简单赋值运算符

赋值号"=",它的作用是将一个表达式的值赋给一个左值。当左、右操作数的类型不同时,编译器会隐式进行转换,将右操作数转为左操作数。

int a, b, c;
a=3;
b=4;
c = (a + b)*(2*a - b) // 得出14
1.2 复合赋值运算符

复合赋值表达形式:变量 双目运算符=表达式。如a+=5

它等效于:变量=变量 运算符 表达式

复合算术赋值(+=,-=,*=,/=,%=)

复合位运算赋值(&=,|=,^=,>>=,<<=)

例如:

a+=5   等价于a=a+5
x*=y+7 等价于x=x*(y+7)
r%=p   等价于r=r%p

二、算术运算符

算术运算符是用来处理四则运算的符号,这是最简单,也最常用的符号,尤其是数字的处理,几乎都会使用到算术运算符。

运算顺序是先乘除,后加减,如果有括号就先算括号内后算括号外,同一级运算顺序是从左到右

操作符:+、-、*、/、%

注意:

  • 除法运算符对整数运算时,结果只取整数部分
  • 求模运算符的操作数只能是整型
  • 加法运算中,任何值和字符串相加,先将该值转为字符串,再做拼串操作

三、自增自减运算符

自增自减运算属于单目运算符又叫一元运算符,操作数是一个。自增运算符 ++使操作数的值加1,其操作数必须为可变。自增运算符++可以置于操作数前面,也可以放在后面,如下:

int num=0;
int tmp=0;
num++;
++num;
tmp=++num;//先自增再赋值
tmp=num++;//先赋值再自增

++前置与后置的区别:

  • 无其它操作

    num++和++num,结果都是一样的

  • 有其它操作,比如赋值

    tmp=++num,num自增1后赋值给tmp

    tmp=num++,num先赋值给tmp后自增1

四、关系运算符

关系运算符可以比较两个值之间的大小关系,如果关系成立它会返回true,如果关系不成立则返回false。

操作符:==、!=、>、>=、<、<=

非数值比较时,先都转为数值,然后比较大小。

对于两侧都是字符串时,比较其 unicode 编码的大小。

在C++中,将非零值和true都判断为真。将0和false都判断为假。

五、逻辑运算符

逻辑运算的数据和结果都是布尔类型。

! 逻辑非,对一个布尔值进行取反操作。

&& 逻辑与,都为true才返回true,如果前一个值为false,则不会继续往后判断,并直接返false。

|| 逻辑或,有一个true就返回true,如果前一个值为true,则不会继续往后判断,并直接返回true。

口诀:或真且假

六、三目运算符

使用形式:<条件表达式>?<表达式1> : <表达式2>

当条件表达式运算结果为真时,返回表达式1的值。

当条件表达式运算结果为假时,返回表达式2的值。

max=(a>b)?a:b->就是将a和b二者中较大的一个赋给max。

例如:
⑴ m<n ? x : a+3
等价于:(m<n) ?(x) :(a+3)
⑵ a++>=10 && b–>20 ? a : b
等价于:(m<n) ?(x) :(a+3)  
等价于(a++>=10 && b–>20) ? a : b
⑶ x=3+a>5 ? 100 : 200
等价于:x= (( 3+a>5 ) ? 100 : 200 )

七、逗号运算符

多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。

int num1,num2,a=2,b=7,c=5;
num1 = (++a,b--,c+3);
num2 = ++a,b--,c+3;

对于给num1赋值的代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是(c+3)的值为8,所以num1的值为8。

对于给num2赋值的代码,也有三个表达式,这时的三个表达式为num2 = ++b、c–、d+3,(因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但num2=4(第2行代码运算完时,a=3,即第3行代码运行时,a的值为4)。

八、位运算符

参与运算的量,均以补码形式按二进制位进行运算。

运算符用来对二进制位进行操作,对于位运算符来说,左右操作数均为整数,才有意义。

8.1 按位与

按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。两位同时为1,结果才为1,否则为0。参与运算的两个数均以补码出现。

按位与运算通常用来对某些位清0或保留某些位。例如把a的高八位清 0 ,保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。

运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

 short a = 57;
 93 & a
   0000 0000 0101 1101
 & 0000 0000 0011 1001 
 -------------------------
   0000 0000 0001 1001
8.2 按位或

按位或运算符“|”是双目运算符。 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

 short a = 57;
 93 | a
   0000 0000 0101 1101
 | 0000 0000 0011 1001 
 -------------------------
   0000 0000 0111 1101
8.3 按位异或

只有在两个比较的位不同时其结果是1,否则结果为0。即:相同为0,不同为1。

运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

 short a = 57;
 93 ^ a
   0000 0000 0101 1101
 ^ 0000 0000 0011 1001 
 -------------------------
   0000 0000 0110 0100

用途:

  1. 实现两个数的交互

    int a = 8,b = 12
    a=a^b; 1000^1100=0100
    b=a^b; 1100^0100=1000
    a=a^b; 0100^1000=1100
    则a = 12,b = 8
    
  2. 加密解密

    int age=57;
    int key=93;
    第一次异或进行加密
       0000 0000 0101 1101(明文)
     ^ 0000 0000 0011 1001(秘钥)
     -------------------------
       0000 0000 0110 0100(密文)
      
    第二次异或进行解密
       0000 0000 0110 0100(密文)
     ^ 0000 0000 0011 1001(秘钥)
     -------------------------
       0000 0000 0101 1101(明文)
    
8.4 按位取反

按位取反:二进制每一位取反,0变1,1变0

运算规则:转二进制补码,取反(即0变1, 1变0)

因为计算机底层都是以补码进行计算的,故以补码的方式进行的,转二进制后取反

~3
由于3是正数,正数的原码补码反码都是一样的,所以3的补码:0000 0011
~0000 0011
-------------
 1111 1100~-7
-7原码:1000 0111
-7反码:1111 1000
-7补码:1111 1001
~1111 1001
-------------
 0000 0110~-7
8.5 左移操作符(<<)

双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。

移位运算符是将数据看成二进制数,对其进行向左移动若干位的运算。左移一位相当于该数乘以2,左移N位相当于该数乘以2的N次方。

移位时

  • 移出的位数全部丢弃

  • 移出的空位补0

93 << 3 
0000 0000 0101 110193-------------------------
0000 0010 1110 100093<<3
8.6 右移操作符(>> )

双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。

移位运算符是将数据看成二进制数,对其进行向右移动若干位的运算。右移一位相当于除以2,右移N位相当于除以2的N次方。

移位时

  • 移出的位数全部丢弃

  • 移出的空位如果是整数补0,负数补1

93 >> 3
0000 0000 0101 110193-------------------------
0000 0000 0000 101193>>3

九、运算符优先级

运算符优先级是编程语言中一个重要的概念,它决定了表达式中运算符的计算顺序。通常,优先级最高的运算符最先进行计算,优先级最低的运算符最后计算。如果两个运算符的优先级相同,那么按照结合性(从左到右或从右到左)决定计算顺序。

下面是C#运算符的优先级从高到低的顺序表:

  1. 括号 ()
  2. 一元运算符 ++, --, !,等等。
  3. 乘法运算符 *, /, %
  4. 加法运算符 +, -
  5. 移位运算符 <<, >>
  6. 关系运算符 <, >, <=, >=
  7. 相等运算符 ==, !=
  8. 按位运算符 &
  9. 条件 AND 运算符 &&
  10. 条件 OR 运算符 ||
  11. 条件运算符 ?:
  12. 赋值运算符 =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

如下举例说明:

int a = 10;
int b = 20;
int c = 30;
int result =  a + b * c; // 错误,应该先计算乘法
int result = (a + b)* c; // 正确,使用了括号改变优先级
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值