C语言操作符总结

今天分享一个自己刚整理完的C语言操作符的知识点

C语言基本操作符分为以下几类:

  1. 算术操作符
  2. 移位操作符
  3. 位操作符
  4. 赋值操作符
  5. 单目操作符
  6. 关系操作符
  7. 逻辑操作符
  8. 条件操作符
  9. 逗号表达式

算术操作符

+      -       *       /       %

1.除"%“外其他几个操作符均可用于整数和浮点数。
2.对于”/"来说,计算的两个数为整数则执行整数除法,若含有浮点数,则执行浮点数除法。
实例演示:

double a = 4.5;
int b = 3;
int c = 5;
printf("%d\n",c%b);
printf("%.3lf\n",a/c);
printf("%d\n",c/b);

结果为2;0.900;1


移位操作符

<<左移操作符              >>右移操作符

例子:有符号数
逻辑右移1位:1000 0001 -> 0100 0000 依次右移,最低位移出,最高位补0。(逻辑左移和他一样的方法)
算术右移1位:1000 0001 -> 1100 0000 依次右移,最低位移出,最高位补符号位的数字1。
算术左移1位:1000 0001 -> 1000 0010 依次左移,最高位符号位保持不变,最低位补0。
:移位操作符右边的数字不能为负数!


位操作符

&       按位与
|       按位或
^       按位异或

:他们的操作数必须是整数

&:就是先转化为二进制数进行 & 操作,有0则为0,全1为1
| :就是先转化为二进制数进行 | 操作,有1则为1,全0为0
^:就是先转化为二进制数进行 ^ 操作,相同为0,不同为1

int num1 = 1;    
int num2 = 2;    
printf("%d\n",num1 & num2);    
printf("%d\n",num1 | num2);    
printf("%d\n",num1 ^ num2);

结果为 0;3;3
两个比较经典的 ^ 操作符使用实例:
1.不允许建立临时变量,完成两个数的交换。

#include <stdio.h> 
int main() 
{    
   int a = 10;    
   int b = 20;    
   a = a^b;    
   b = a^b;    
   a = a^b;    
   printf("a = %d  b = %d\n", a, b);    
   return 0; 
}

2.求一个整数存储在内存中的二进制中1的个数

#include <stdio.h> 
int main() 
{    
    int num = -1;    
    int i = 0;    
    int count = 0;//计数    
    while(num)
    {        
        count++;        
        num = num&(num-1);    
    }    
    printf("二进制中1的个数 = %d\n",count);    
    return 0; 
} 

这个解法可能一般是想不到的,但是这样做就很巧,因为一个数他如果不为0,那么他的二进制序列里一定含有1,这样就只需要,用他和自身-1的&值是否为0来判断,这样做是一个目的那就是每次都消掉二进制序列里最右边的1,每消掉一个count就++,这样循环几次后结果为0,不满足条件退出循环后的count结果则是二进制序列中1的个数。


赋值操作符

int a = 10;
int b = 20;
上面的 “=” 就是赋值操作符,可千万不要理解为等于的意思
还有一系列的复合赋值符:
+=   -=   *=   /=  %=  >>=  <<=  &=  |=   ^=

单目操作符

!                      逻辑反操作
-                       负值
+                       正值
&                       取地址
sizeof                 操作数的类型长度(以字节为单位) 
~                      对一个数的二进制按位取反
--                     前置,后置 --
++                     前置,后置++
*                      间接访问操作符(解引用操作符)
()                     强制类型转换

操作实例:

#include<stdio.h>
int main()
{
    int a = -10;
	int b = 20;
	int *ptr = NULL;
	printf("%d\n", !5);
	printf("%d\n",!0);
	a = -a;
	printf("%d\n", a);
	ptr = &a;
	printf("%d\n",*(ptr));
	double d = (double)b;
	printf("%.2lf\n",d);
	printf("%d\n",sizeof(a));
	printf("%d\n",sizeof(ptr));
	int c = b++;
	printf("%d %d\n",c,b);
    return 0;
}

运行结果如下图

1.&是获取变量a在内存中的地址。
2.*(ptr)是对指针进行解引用,获取其所存的值。
3.强制类型转换,有一点就是大范围向小范围转换时精度会损失。
4.不管什么类型的指针永远都是4个字节。
5.拿上面的代码来说不管前置还是后置++,b的值最终都是21,b都会+1,
  但是对于c的值来说如果是++b的话,c的值就是21,因为他会先将b++再
  赋给c,但是是b++的话,c的值就是20,因为他会先把b的值赋给c,再将
  b的值++。

关系操作符

>                大于
>=               大于等于
<                小于
<=               小于等于
!=               不等于
==               等于

关系运算符都很简单就没什么可讲的了,但有一点需要注意就是一定要把赋值符 “ = ” 和 关系操作符 “ == ” 区分开,不要混为一谈。


逻辑操作符

&&                 按位与
||                 按位或

这里要区分开 “&&” 和 “ & ” ,“ || ” 和 “ | ”
举个例子:

&&:计算原则是只要有一边为false则结果为false,两边全为true则结果为true。
1&&2  -> 在计算时首先将1和2转化为Boolean型,非0的数,则为1(true),
         0则为0(false),所以转化后为 true&&true -> true ->1。
1&2  -> 在计算时首先将1和2转化为二进制数,然后按位进行与操作,有0则为0
        全1则为1,转化后为 01^10 -> 00 ->0。
||:计算原则为操作符两边有1则为1,全0为0。
    这两个结果是不相同的,虽然中间的某些步骤是一样的,所以在遇到此类问题时一定要细心!

区别:

&&和||是短路运算符,
&和|是非短路运算符;
&&和||运算符第一个表达式不成立的话,后面的表达式不运算,直接返回。而&和|对所有表达式都得判断.


条件操作符

exp1 ? exp2 : exp3
   这是一个三目运算符,算是挺实用的一个,他的运算规则是先判断exp1的条件是否为真
为真的话则执行exp2,为假则执行exp3,他和一个if条件语句等价。

逗号表达式

exp1, exp2, exp3, …expN
   逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行。
整个表达式的结果是最后一个表达式的结果 。
这个表达式可能见到的少一些,但是如果遇到的话要知道他怎么算的。

举个例子:

#include<stdio.h>
int main()
{
    int a = 1; 
	int b = 2; 
	int c = (a>b, a = b + 10, a, b = a + 1); 
	printf("%d",c);  
    return 0;
}

结果为13,因为执行到最后一条语句的时候,a已经等于12了,然后再执行b=a+1,所以b=13。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值