概述
运算符也叫操作符,运算符可以对一个或多个操作数进行运算,并获取运算结果。例如: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
用途:
-
实现两个数的交互
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
-
加密解密
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 1101(93)
-------------------------
0000 0010 1110 1000(93<<3)
8.6 右移操作符(>> )
双目运算符。第一运算对象是移位对象,第二个运算对象是所移的二进制位数。
移位运算符是将数据看成二进制数,对其进行向右移动若干位的运算。右移一位相当于除以2,右移N位相当于除以2的N次方。
移位时
-
移出的位数全部丢弃
-
移出的空位如果是整数补0,负数补1
93 >> 3
0000 0000 0101 1101(93)
-------------------------
0000 0000 0000 1011(93>>3)
九、运算符优先级
运算符优先级是编程语言中一个重要的概念,它决定了表达式中运算符的计算顺序。通常,优先级最高的运算符最先进行计算,优先级最低的运算符最后计算。如果两个运算符的优先级相同,那么按照结合性(从左到右或从右到左)决定计算顺序。
下面是C#运算符的优先级从高到低的顺序表:
- 括号 ()
- 一元运算符 ++, --, !,等等。
- 乘法运算符 *, /, %
- 加法运算符 +, -
- 移位运算符 <<, >>
- 关系运算符 <, >, <=, >=
- 相等运算符 ==, !=
- 按位运算符 &
- 条件 AND 运算符 &&
- 条件 OR 运算符 ||
- 条件运算符 ?:
- 赋值运算符 =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
如下举例说明:
int a = 10;
int b = 20;
int c = 30;
int result = a + b * c; // 错误,应该先计算乘法
int result = (a + b)* c; // 正确,使用了括号改变优先级