Linux及C语言高级[3](C语言运算符)

338 阅读2分钟

“这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

一.运算符

  • 单算移关与,异或逻条赋,逗号

1.1单目运算符

符号规则
(+)(正)
(-)(负)
(*)(指针使用)
(&)(获取变量的地址)
(++)(自增)
(--)(自减)
(~)(按照位来取反)

int a=10;

++a; 在执行本句话的时候,a的值自加了1

a++; 在执行本句话的时候,a的值没有改变,这句话执行完之后 a的值自增了1。(原子操作效率更高)

做题的时候这个运算符是特别常见的,注意表达式的值!

语句表达式值a值
++a;1111
a++;1011

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);

运算符优先级