操作符详解

时间:2023-02-19 12:59:30

这是一篇整理C操作符的博客,将C中最常见的字符进行了归纳汇总,对各种字符的作用做了一些理解性的阐述;

一、算术操作符

+   加操作符

将左右两个操作数相加;

-   减操作符

将左操作数减去右操作数;

*   乘操作符

将左右两个操作数相乘;

/   除操作符

将左操作数除以右操作数,左右操作数若都为整数,则计算结果无小数,左右操作数中若有一个浮点数,则计算结果为浮点数; 例如:

float a = 3 / 2;
float b = 3.0 / 2;
float c = 3 / 2.0;

上式中,a值为1,b、c值都为1.5;

%   取模操作符

左右操作数必须都为整型,将左操作数除以右操作数得到的余数即为取模的结果。

二、移位操作符

整数在内存中以补码存储,相关内容可见--->原码、反码以及补码

>>  左移操作符

二进制表示左边丢弃,右边补0;

>>  右移操作符

  • 算术右移:二进制表示右边丢弃,左边补原符号位;
  • 逻辑右移:二进制表示右边丢弃,左边补0;

三、位操作符

注意:位操作符的操作数必须位整数

& 按位与

对应的二进制位都为1取1,否则取0;

注意:此时为双目操作符(a&b);而取地址(&a)为单目操作符。

//按位与的应用
//求一个整数存储在内存中的二进制中1的个数
#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	int count = 0;
	for (int i = 0; i < 32; i++)
	{
		if (1 == ((a >> i) & 1))
		{
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

| 按位或

对应的二进制位有1位为1则取1,都为0则取0;

^ 按位异或

对应的二进制位相同取0,相异取1;

//异或的一个特殊用法
#include<stdio.h>
//不创建变量完成两个变量的数值交换
// 原理:归零律:a ^ a = 0
//       恒等律:a ^ 0 = a
//		 交换律:a ^ b = b ^ a
//		 结合律:a ^ b ^ c =(a ^ b) ^ c = a ^ (b ^ c)

int main()
{
	int a = 1;
	int b = 2;
	a = a ^ b;
	b = a ^ b;//b = (a ^ b) ^ b = a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a;
	a = a ^ b;//a = a ^ b ^ a = b ^ 0;
	printf("a = %d, b = %d\n", a, b);
	return 0;
}

四、赋值操作符

通过上述三类操作符可以构成复合赋值符,使代码更简洁

例如:

int a = 0;
a += 1;//等价于 a = a + 1;

五、单目操作符

  • ! 逻辑反操作
  • - 负值
  • + 正值
  • & 取地址
  • sizeof 操作数的类型长度(以字节为单位)

注:sizeof操作符()中的表达式不参与运算,原因是sizeof是在编译期间处理的,所以当程序运行时,不会执行()中的表达式;

  • ~ 对一个数的二进制按位取反
  • -- 前置、后置--
  • ++ 前置、后置++
  • * 间接访问操作符(解引用操作符)
  • (类型) 强制类型转换

六、逻辑操作符

  • && 逻辑与 双目操作符,左右条件均满足则为真,否则为假;
  • || 逻辑或 左右条件有一条满足则为真,都为假才为假;

七、条件操作符

? : 三目操作符

实例:

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	a = a > 0 ? 1 : 0;//a大于0,a = 1; 否则 a = 0;
	printf("%d", a);
}