栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言【操作符】总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言【操作符】总结

操作符分类:

  1. 算术操作符  + - * /
  2. 移位操作符  >> <<
  3. 位操作符  & | ^
  4. 赋值操作符  =  +=  -=  <<=  >>=
  5. 单目操作符  ! ~ & ++ --
  6. 关系操作符 > < == !=
  7. 逻辑操作符 && ||
  8. 条件操作符  exp1?exp2:exp3
  9. 逗号表达式 exp1,exp2,exp3

一、算术操作符

顾名思义就是跟数学中的算术一样,加减乘除等

int a = 10;
int b = 20;

int c = a + b; //相加
//c == 30

int d = a - b; //相减
//d == -10 

int k = a * b; //相乘
//k == 200

int j = a / b; //相除
//j == 0 因为是int类型所以没有小数

int i = a % b; //取余
//i == 0

二、移位操作符

<< 左移 >>右移

    int a = 1;
	//00000000000000000000000000000001
	int b = a << 1;
	//左移就是将最后一位二进制位向左移一位
	//00000000000000000000000000000010
	printf("%d", b);
	//打印输出结果为十进制 也就是2

右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃

    int a = 3;
	//00000000000000000000000000000011
	int b = a >> 1;
	//左移就是将最后一位二进制位向右移一位
	//00000000000000000000000000000001
	printf("%d", b);
	//打印输出结果为十进制 也就是1

这里需要注意:对于移位运算符,不能移动负数位

在计算机中数据的存储是二进制形式,负数的原码如果直接计算的话结果是错误的,因此一般计算都是用补码计算再转换为原码输出

正数的补码是其原码本身,负数的补码是原码取反后加1 也就是反码加1

三、位操作符

&(与):即两个二进制位有一个为0 则结果就为0,两个都为1 结果才为1

| (或):即两个二进制位有一个为1 则结果就为1,两个都为0 结果才为0

^ (异或):即两个二进制位相同为0,不同为1

例题:交换两个变量(不创建临时变量)

思路:如果使用加的方法,就会出现溢出的情况。异或就可以很好的解决该问题,一个常数异或0等于这个常数,一个常数异或自己本身等于0,按照这个逻辑就可推断出

int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("交换前:a = %d b = %dn", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后:a = %d b = %dn", a, b);

	return 0;
}

四、赋值操作符

a+=b等价于 a=a+b,其他的赋值操作符同理

五、单目操作符

! 取反操作符    !1==0

~  按位取反操作符,将二进制的每一位都取反

&  取地址操作符

++ 相当于加1 但有两个区别 a++(++后置时),先用后加。相反当++前置时,先加后用

-- 和++同理

六、关系操作符

a>b 则a大于b

a

a==b 则a等于b 需注意比较关系是要用两个等号

a!=b 则a不等于b

七、逻辑操作符

&& 逻辑与 exp1&&exp2  如果两个表达式都为真 则整体为真 一个或两个为假则整体为假

|| 逻辑或 与逻辑与刚好相反

八、条件操作符

exp1?exp2:exp3

如果表达式1为真 则输出表达式2,如果表达式1为假 则输出表达式3

九、逗号表达式

从左向右依次执行。整个表达式的结果是最后一个表达式的结果

例题:

1、求一个整数二进制中1的个数

int main()
{
	int count = 0;
	int n;
	scanf("%d", &n);
	for (int i = 0; i < 32; i++)
	{
		if ((n & 1) == 1)
			count++;
		n >>= 1;
	}
	printf("%d", count);
	return 0;
}

2、两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    int c = a ^ b;
    int count = 0;
    for (int i = 0; i < 32; i++)
    {
        if ((c & 1) == 1)
            count++;
        c >>= 1;
    }
    printf("%d", count);
    return 0;
}

3、打印整数二进制的奇数位和偶数位

int main()
{
	int n;
	scanf("%d", &n);
	int a = sizeof(n) * 8;  //计算出这个整数的bit一共多少位
	printf("这个整数的所有偶数位为:");
	for (int i = a - 1; i >= 1; i -= 2)
	{
		printf("%d", (n >> i) & 1); //将数字的每一位偶数位右移到第一位再与1(先将最高偶数位右移)
	}
	printf("n");
	printf("这个整数的所有奇数位为:");
	for (int i = a - 2; i >= 0; i -= 2)
	{
		printf("%d", (n >> i) & 1); //将数字的每一位奇数位右移到第一位再与1(先将最高奇数位右移)
	}
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869551.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号