c语言笔记------运算符

=运算符====
运算符分类

目标操作数

 1.单目运算符
  int a = 5;
  -a -5  ++a  --a  ~a a<<  a>> &a  * .....
  !a
 2.双目运算符
  + -  *  /  |  &  % .....
  a+b  a-b    
 
 3.三目运算符(有且只有一个,条件运算符)
   a?b :c;
   a条件成立,执行b
         否则执行c
  int a = 100, b = 50;
  a > b ? printf("a > b\n"):printf("a不大于b\n");  
  
功能分类

 1.算数运算符
  + - * / % ++  --。。。。
 
 2.关系运算符
 >  <  >=  <=  == != 
 
 3.逻辑运算符(条件)
 !  &&   ||     
 !(条件1)   
 (条件1&&条件2)  
 (条件1||条件2)  
 
 4.位运算符 很重要!!!!
  bit ,直接操作数据的二进制位,在硬件控制中,会大量使用
    
  ~ & | ^ >>  << 
  
 5.特殊的运算符
   1.赋值运算符 =  
    a = 10; //从右往左进行赋值  =两边的数据类型得一致
    a = b;  	
   
   2.复合运算符
   +=  -=  *= |= 。。。。。
   
   3.条件运算符 (三目运算符)
   
   4.sizeof  计算数据所占内存的大下
   
   5.逗号运算符 , 
    int a = 10, b = a;
	int x =(a++,b++,a+b);
	printf("a %d b %d  x %d \n",a,b,x);//?
   
   6.return 数值
     在main函数中使用,结束main,结束整个程序
	 在其他函数使用,结束掉当前函数,数值就是当前函数的返回值 
	 
6.地址运算符
 &    *   
 & 取址符 &a 通过变量获取地址
 * 取值符 (解引用) *地址 通过某个内存地址获取对应内存里面的数据  
 
7.分量运算符 (结构体)
 .  ->  
 
 . 通过结构体变量访问结构体成员
 ->通过结构体指针访问结构体成员

部分运算符解析:

    1.注意运算符的优先级 
      int  a = 10, b = 20 ,c;
	  c = (a+b); 
	  如果不知道使用的运算符优先级等级,可以使用括号表名想要先运算的对象
	  a+++++b 如果碰到类似于这种毫无意义的代码或者题目直接pass掉 
	  
    2. / 如果计算的是两个整数,保存的位置是整数类型的,结果也是整数,没有小数部分
      		
	3. %(取余) 计算的是两个整数,结果也是整数 
      a%b  a 和 b 得是整数   结果也是整数
	  
	4.使用  /  % 进行数据分割
	  12    1    2  
	  12/10  1 
	  12%10  2
	
	  求123 各个位上的数据 
      123/100  1
	  (123/10)%10 12%10 2
	  123%10       3    
      
    5.  ++  -- 应用  
	   ++变量自身加1
	   --变量自身减1
	   ++ -- 即可以作为前缀 ,也可以作为后缀
	   前缀  ++a  先加再用
	   后缀  a++  先用再加 
	   
   6.自己写代码不要出现有歧义的语句
	   
	a+++++b+++c ?
	a++;
	b++;
	c++;
	a+b+c;?
	
   7.关系运算符的结果只有两种
   >  <  >=  <=  == !=   
   真  假
   
   a>b 条件  条件成立  条件不成立
             真        假
			非0         0    
 if(条件表达式)
 {
 
 }
  if(0)//假
  {
  
  }
  if(1)//真
  {
  
  }
  if(2)//真			 
  {
  
  }
  if(-8)//真
  {


  }   
 
  8.逻辑运算符
   !  !(条件1)  非假既真 非真既假
        
   &&  (条件1&&条件2) 
       只有当条件1和条件2都成立时,整个条件才成立 
       
   ||  (条件1||条件2) 
       只要两个条件中有一个成立,整个条件就成立  
	   
  9.不要漏掉== 的等号
   比较大小  ==   a==b
   赋值      =    a=b  
  
  10.复合运算符的应用
    +=  -=  *= |= 。。。。。
	当需要改变变量自身的值的时候经常用到
    ++   -- 
    int a = 5;
    a+=5;//等价于 a = a+5 	
		
  11.使用=时,同一个表达式不能连续赋值
    a=b=c;//错误的写法 
    a=b;
  	b=c;
	
	c>b>a;//错误的写法
	(b>a&&b<c)//正确的写法 
	
	
  12.强制类型转换
   int a ;
   float b = 12.34;

   a = (int)b ;	

练习
1.分析以下程序执行后的结果
int a = 12;
int b = a++;
int c = (a++,b++,a+b);
int d = ++a;
a++;
b++;
printf(“a %d b %d c %d d %d \n”,a,b,c,d);
最终a b c d的值

2.把1234的各个位的数单独计算出来
      求123 各个位上的数据 
      123/100  1
	  (123/10)%10 12%10 2
	  123%10       3         
	 
 1234 /1000  1
 1234 /100 %10   12%10  2   
 1234 /10 %10    123    3 
 1234 %10   4

===位运算符 很重要!!!!=
1.嵌入式开发领域,可能接触到很多硬件

比如 51单片机 寄存器 操作配置引脚 8bit寄存器

位序 7 6 5 4 3 2 1 0

P0 – 0100 0000
P0 = 0X40;

2.在linux中,一般也需要直接操作内存,以达到操作硬件目的
也会大量用到位运算符

3.常见位运算符(针对于无符号整型数据)
按位取反 unsigned char a = 5 ;0000 0101 ~a 1111 1010

& 按位与 1&0 0 1&1 1 0&0 0
unsigned char a = 5
0000 0101 & 1010 1110 0000 0100

| 按位或 1|0 1 1|1 1 0|0 0
unsigned char a = 5
0000 0101 | 1010 1110 1010 1111

^ 按位异或 1^0 1 0^1 1 1^1 0 0^0 0
unsigned char a = 5
0000 0101 | 1010 1110 1010 1011

向右位移
1>>3 0001
<< 向左位移
1<<3 1000

应用场景:

1.对数据的某一位置零,其他位保持不变、
1010 0101 第5位置零 其他位不变

1010 0101
&
1101 1111 0010 0000 ~(1<<5)
1000 0101

a = a & (~(1<<5));

总结公式:
把a的第b位置零,其他位保持不变
a = a & (~(1<<b))

2.对数据的某一位置1,其他位保持不变
1010 0101 第6位置1 其他位不变

1010 0101
|0100 0000 1<<6
1110 0101

总结公式:
把a的第b位置1,其他位保持不变
a = a | (1<<b)

3.数据的切割
把二进制数据转换成16进制去切割
4bit的二进制数据对应 1个16进制位
1010 0101 0xA5
12 1 2
12/10 1
12%10 2

0XA5/(1<<4)  0XA
0XA5%(1<<4)  0X5

4.数据的拼接

把两个4bit的数据拼接成一个 8bit位的数据
0xA  0X5   --->0XA5
	 
1  2    12  1*10+2

(0XA<<4)|0X5  0XA5 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值