“这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战”
一.运算符
- (单算移关与,异或逻条赋,逗号)
1.1单目运算符
| 符号 | 规则 |
|---|---|
| (+) | (正) |
| (-) | (负) |
| (*) | (指针使用) |
| (&) | (获取变量的地址) |
| (++) | (自增) |
| (--) | (自减) |
| (~) | (按照位来取反) |
int a=10;
++a; 在执行本句话的时候,a的值自加了1
a++; 在执行本句话的时候,a的值没有改变,这句话执行完之后
a的值自增了1。(原子操作效率更高)
做题的时候这个运算符是特别常见的,注意表达式的值!
| 语句 | 表达式值 | a值 |
|---|---|---|
| ++a; | 11 | 11 |
| a++; | 10 | 11 |
int a=5;
a = ~a;
0xffff fffa; 补码
0x8000 0005; 反码
0x8000 0006; 源码====>-6
1.2算术运算符
( + - * / %)
2/3 ==>结果是0,分子小于分母的时候结果就是0
2.0/3 ==>结果是0.67,//前后为浮点都会这样
7.0%3❌
7%3.0❌
7%3=1
99%100=99
隐士类型转换:(如果在两个数做运算的时候,按照下面的类型进行转化)
char->short->int->unsigned->long->float->double
%:运算符的两侧不能有小数
int a = 423;
百 = a/100
十 = (a/10)%10
个 = a%10
1.3移 : >> 右移 << 左移
右移,除以2
左移,乘以2
eg:5,101
右移--->0010
左移--->1010
无符号的数左右移动的时候补充的是0
有符号(负数)数右移动的时候补充的是1,左移补充的是0
eg:负数10100110>>5得到11111101
11000000011001 (>>:00110000000110 <<:1100000001100100)
1.4 关系运算符
[>(大于) <(小于) ==(等于) != (不等于) >=(大于等于) <=(小于等于)]
1.5与 :& (按照位与)
0和任何数相与都为0,1和任何数相与都为任何数
0 & 0 = 0
0 & 1 = 0
1 & 1 = 1
变量a的值是215,请将a的bit3(3210)(口语中的第四位)清零,不改变其他位的值
a = a & (~(1<<3)) ; ==>a &= ~(1<<3);
a = a & (~(3<<20)); ==>a &= ~(3<<20); //将bit20,bit21 位清零
a = a & (~(0xf<<4));==>a &= ~(0xf<<4);
☞先转换成二进制,一位一位进行操作,清除几个位就几个1(二进制)
1.6异 : ^
相异为真,相同为假
0^0 = 0
0^1 = 1
1^1 = 0
a^=a; a = 0;
int a = 0b10101;
int b = 0b11101;
a^b = 0b01000;
int a=5,b=7;
a ^=b;
a = 0101
b = 0111
^
---------------差异化
a = 0010
b ^=a;
a = 0010
b = 0111
^
---------------把a赋给b
b = 0101
a ^=b;
a = 0010
b = 0101
^
---------------把b赋给a
a = 0111
1.7或 : |
0和任何数相或都为任何数,1和任何数相与都为1
0 | 0 = 0
0 | 1 = 1
1 | 1 = 1
变量a的值是215,请将a的bit10置位,不改变其他位的值
a |= (1<<10);
a |= ((0xf<<28)|(1<<25));
1.8逻辑运算符 : &&逻辑与; ||逻辑或; !非
!a =>认为a是真 0
!0 =>结果是 1
表达式0 && 表达式1
(a+b) && (b+c)
==>如果a+b为真,会计算b+c ,如果b+c也为真
==>整个表达式为真
==>如果a+b为假,不会计算b+c ,整个表达式为假
表达式0 || 表达式1
(a+b) || (b+c)
==>如果a+b为真,不会计算b+c ,整个表达式为真
==>如果a+b为假,会计算b+c ,
==>表达式的真或者假取决于b+c的真假
1.9条件运算符:三目运算符
a>b?a:b;
如果a>b为真取出a,否则取出b;
练习:
执行下列程序段后,变量a,b,c的值分别是
int x=10,y=9;
int a,b,c;
a=(--x==y++)?--x:++y;
b=x++;
c=y;
A、a=9,b=9,c=9 B、a=9,b=10,c=9
C、a=1,b=11,c=10 D、a=8,b=8,c=10
答案:D
1.10赋值运算符
- =(赋值)
- +=
- -=
- *=
- /=
- %=
- (>>=)
- (<<=)
- &=
- |=
- ^=
1.11逗号运算符
c = (e=a+b,f=c+d,e+f);
c = a+b+c+d
☞c的结果就是取()中最后一个逗号后的表达式的结果
1.12强制类型转换(2级)
float x = 123.456,y = 0.5;
int(x);❌
(int)x;(int)(x);✔
(int)x+y; //123.5
(int)(x+y); //123
二.运算优先级
📌口诀:单算移关与,异或逻条赋,逗号
同种运算符的方向 【单条赋】是从右向左运算的,其余的全是从左向右
常用的一些运算符优先级
| 分类 | 优先级 | 运算符 |
|---|---|---|
| 单目运算符 | 2 | (*(指针),!,++,--) |
| 算数运算符 | 3 | (*,/,%) |
| 4 | (+,-) | |
| 移动运算符 | 5 | (<<,>>) |
| 关系运算符 | 6 | (>,<,>=,<=) |
| 7 | (==,!=) | |
| 逻辑运算符 | 11 | (&&) |
| 12 | 两个竖杠(编辑不上去) | |
| 逗号运算符 | 15 | ( ,) |
eg:
x*=y+8;
x=x*(y+8);