操作符二三事

本文详细介绍了C语言中的算术操作符,包括整数的除法和模运算,以及移位操作符的使用,如右移(算术和逻辑)。同时,讨论了整数的二进制表示,如原码、反码和补码,并通过示例展示了左移和右移的效果。文章还涵盖了位操作符,如按位与、按位或和按位异或,并提供了交换两个整数和计算二进制中1的个数的例题。此外,提到了逻辑操作符、条件操作符、逗号表达式和其他运算符的用法,以及表达式求值时的规则和注意事项。
摘要由CSDN通过智能技术生成

目录

算术操作符

移位操作符

整数的二进制表示

位操作符

例题

逻辑操作符(注意和按位与,按位或区别开来)

条件操作符

逗号表达式

其他运算符

表达式求值


算术操作符

  1. /要注意两个操作符都为整数时计算结果为整数,只要其中一个为浮点数计算结果为浮点数,得到的是商
  2. %只能用于整数,计算的是余数

移位操作符

(移动的是补码二进制位,因为整数在内存中存储的是补码)

(浮点数是不能进行移位操作符)

  1. >>右移操作符(取决于编译器)
    1. 算术右移(左边用原来的符号位,右边丢弃)
    2. 逻辑右移(左边直接补0,右边丢弃)

不要移动负数位,这个标准未定义

16进制里面 abcdef分别表示(10 11 12 13 14 15)

整数的二进制表示

  • 原码:把一个数按照正负直接翻译成二进制就是原码。

最高位表示符号位,最高位0表示正数,1表示负数

正整数原码,反码,补码是相同的。

  • 反码:原码的符号位不变,其他位按位取反
  • 补码:反码+1
​
//以3和-5为例计算左移右移后的结果
#include<stdio.h>
int main()
{
	int a = 3;
	//补码:00000000000000000000000000000011
	printf("%d\n",(a<<1));
	//a<<1补码:00000000000000000000000000000110---对应6
	int b = -5;
	//原码:10000000000000000000000000000101
	//补码:11111111111111111111111111111011
	//b>>1补码:11111111111111111111111111111101(vs采用的是算数位移,最高位补的是1)
	//b>>1原码:10000000000000000000000000000011--对应-3
	printf("%d\n",(b>>1));

	return 0;
}

​

位操作符

(二进制补码进行计算)

(只能对整数进行操作)

  • &按位与(有0为0,没0才为1)
  • | 按位或(有1为1,全为0才为0)
  • ∧按位异或(对应相同为0,相异为1)

例题

例1 不创建临时变量进行两个整数的交换

a∧a=0

0∧a=a

(多项异或满足交换律)

//不创建临时变量实现两个数的交换
#include<stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	printf("交换前:%d %d\n", a, b);
	a = a ^ b;
	b = a ^ b;//(就相当于b=a^b^b,此处的a是原来的a,最后所得结果也是原来的a)
	a = a ^ b;//(就相当于a=(a^b)^a,此时的a,b是原来初始的a,b,不是执行后被更改过的a和b)
	printf("交换后:%d %d", a, b);
	return 0;
}

例题2 求一个整数存在二进制内的1的个数

思路:

按位与&上一个1就可以知道一个数最低位是什么

向右移动1位

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

单目操作符:

对一个数的二进制按位取反

例3  把特定位置的0改成1

#include<stdio.h>
int main()
{
	int a = 3;
	//补码:00000000000000000000000000000011(假设要把从右到左的第5个0改成1)
	//就是要把a变成:00000000000000000000000000010011这串补码——对应19
	//我们可以在a的基础上按位|上00000000000000000000000000010000
				
				
	a = a|16;
	printf("%d ", a);
	return 0;
}

(类型)强制类型转换,是临时的状态

sizeof()和数组,主要数组名两个例外,数组名在传参时的注意点(可以回看关于数组那部分)

逻辑操作符(注意和按位与,按位或区别开来)

&&逻辑与:(计算成真为1 成假为0)(只要左边为假有0就不再计算右边的式子了,直接整体得0)

|| 逻辑或:(左边为真,右边就不再计算)

#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	//i = a++||++b||d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
	return 0;
}

 

条件操作符

(表达式1)?(表达式2) :(表达式3)

判断表达式1,如果表达式1为真,那么就执行表达式2,否则就执行表达式3

逗号表达式

从左向右依次计算,整个表达式的结果是最后一个表达式的结果

其他运算符

下标引用[ ],函数调用()

访问结构体(联合体)成员

  1. 指针—>成员
  2. 结构体(联合体)变量·成员

表达式求值

  • 隐形类型转换

整型提升:计算机CPU进行整型计算时,要先把char和short转换为int。

按照变量数据的符号位进行提升,在高位补符号位(负数补1,正数和无符号补0)

  • 算术转换(≥int类型计算时的类型统一)

要先把类型统一为排名高的计算

  • 优先级
  • 结合性
  • 是否控制求值顺序

会遇到一些问题表达式

操作路径会不同

计算表达式时操作数什么时候准备好呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值