【C语言】操作符详解

文章目录

  • 前言
  • 一、操作符分类
  • 二、用法详述
    • 1.算数操作符
    • 2.移位操作符
      • 2.1左移操作符
      • 2.2右移操作符
      • 2.3==警告==:
    • 3.位操作符
      • 3.1 ==&== 按位与
      • 3.2 ==|== 按位或
      • 3.3 ==\^== 按位异或
    • 4.赋值操作符
    • 5.单目操作符
      • 5.1逻辑反操作符 ==!==
      • 5.2 自增、自减操作符 ==++、--==
      • 5.3 按位取反 ==~==
    • 6.关系操作符
    • 7.逻辑操作符
    • 8.条件操作符
    • 9.逗号表达式
    • 10.下标引用、函数调用和结构成员
  • 三、表达式求值
    • 1.隐式类型转换
    • 2.算术转换
    • 3.操作符的属性
      • 3.1==操作符优先级==
  • 总结


前言

操作符的掌握是学习C语言的重要基础,操作符的用法至关重要,今天就带大家了解一下操作符的详细用法。


一、操作符分类

操作符 符号
算数操作符 ‘+’ 、 ‘-’ 、 ‘*’ 、 ‘/’ 、 ‘%’
移位操作符 << (左移操作符) >> (右移操作符)
位操作符 ‘&’、‘|’、‘^’
赋值操作符 =
单目操作符 ‘!’、‘-’、‘+’、‘&’、‘~’、‘- -’、‘*’、‘++’
关系操作符 ‘>’、‘<’、‘<=’、‘>=’、‘!=’、‘==’
逻辑操作符 ’&&‘、‘||’
条件操作符 exp1 ? exp2 : exp3
逗号操作符 exp1, exp2, exp3, …expn
下标引用、函数调用和结构成员 ‘[ ]’、‘()’、‘.’、‘->’

二、用法详述

1.算数操作符

由于算术操作符比较简单,只简要介绍下注意点

1.除了 % 操作符之外,其他几个操作符均可以作用于整数和浮点数。
2.对于 / 操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法。
【C语言】操作符详解_第1张图片
【C语言】操作符详解_第2张图片
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2.移位操作符

移位操作符的操作数只能是整数,并且移位操作符都是对二进制位进行操作
计算机内储存数值均采用补码

2.1左移操作符

左移操作符规则比较简单,即左边抛弃,右边补0
【C语言】操作符详解_第3张图片

2.2右移操作符

右移运算分为两种

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

【C语言】操作符详解_第4张图片

2.3警告

对于移位操作符,不要移动负数位,这个是C语言标准中没有定义的。
例如:

int num = 10;
num >> -1;//这样是错误的

3.位操作符

规则很简单,还是对二进制位进行操作,不过操作数必须为整数

3.1 & 按位与

例如:

000000101
000010100    //进行按位与
000000100    //只有两个都为1,按位与才为1,否则都为0

给一道利用按位与的经典题目:

#include 
//统计一个数的二进制中1的个数
int main()
{
	int num = 0;
	scanf("%d", &num);
	int count = 0;
	while (num)
	{
		num = num & (num - 1);//每次操作都会把最右边的1变为0
		count++;              //这样直到都为0的时候循环才结束
	}
	printf("%d\n", count);
	return 0;
}

还有一个小技巧就是一个数按位与1,能得到其二进制的最后一位数,这样就能通过右移操作+按位与来得到一个数的所有二进制位。

for (i = 0; i < 32; i++)
	{
		printf("%d", (num >> i) & 1);
		//假设一位数是用32个二进制位表示的话
	}

3.2 | 按位或

两个数按位或只要有一个二进制位为1就是1,只有两个均为0才是0

000000101
000010100 
000010101 //按位或

3.3 ^ 按位异或

规则简单总结来说就是:相同为0,相异为1

000000101
000010100 
000010001   //按位异或

给一道按位异或和按位与相结合的题目:

#include 
//求两个数二进制中不同位的个数
int main()
{
	int a = 0, b = 0;
	int count = 0;
	scanf("%d %d", &a, &b);
	int ret = a ^ b;  //利用按位异或的特点,将不一样的二进制全部变成1
	while (ret)
	{
		ret = ret & (ret - 1);//这样用刚刚讲过的技巧来统计1的个数
		count++;              //这样便巧妙求出两个数二进制位不同的个数
	}
	printf("%d\n", count);
	return 0;
}

4.赋值操作符

赋值操作符很简单,没啥要点,但要记住的一点就是赋值操作符的左边必须得是变量,不能是常量,表达式。其结合顺序是从右向左

5.单目操作符

所谓单目操作符就是只有一个操作数的操作符,大多数很简单,这里举出一些有代表性的操作符。

5.1逻辑反操作符 !

//只要不是0的数,进行逻辑反操作之后结果都是0
int a = 5;
printf("%d\n", !a);//打印的结果就是0
//0对其进行罗基反操作得到的结果就是1
int a = 0;
printf("%d\n", !a);//结果为1

5.2 自增、自减操作符 ++、–

这里需要注意的是前置和后置的区别
后置操作符是先使用变量的值再进行自增自减操作
前置操作符是先对变量进行自增自减操作,再使用变量的值

【C语言】操作符详解_第5张图片
【C语言】操作符详解_第6张图片

5.3 按位取反 ~

一言以蔽之,就是对每个二进制位进行取反,0变为1,1变为0

6.关系操作符

没什么需要关注的,大于等于和小于等于需要注意等号的位置,正好就是中文读法的顺序。
还有在比较相等的时候,==操作符和=操作符这两个是不一样的,前者是判断两个表达式是否相同,后者是进行赋值操作。

7.逻辑操作符

逻辑操作符比较简单,举几个例子就明白了。

1&&2---->1
1&&0---->0  //两个操作数有一个为0,表达式结果就是0,只有两个都是真,
             //结果才是1
1||2---->1
1||0---->1  //两个操作数只有要有一个1,结果就为1,只有两个都是0,
            //结果才为0

需要注意的是,当使用逻辑或时,只要左边的表达式为真,就不会再判断右边的表达式。
【C语言】操作符详解_第7张图片

8.条件操作符

exp1 ? exp2 : exp3
简单来说就是exp1为真,就执行exp2,否则就执行exp3.

int a = 10;
	if (a > 5)
	{
		b = 3;
	}
	else
	{
		b = -3;
	}
	//上面的代码可以浓缩成下面者一句代码
	a > 5 ? b = 3 : b = -3;

9.逗号表达式

逗号表达式就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

【C语言】操作符详解_第8张图片

10.下标引用、函数调用和结构成员

这些操作符都涉及指针和结构体的时候会用到,在那里会重点用到,在这里就不再给大家讲述这些操作符了。

三、表达式求值

1.隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

负数整型提升,高位补充符号位,即1
正数整型提升,高位同样补充符号位,为0
无符号整形提升,高位补0

int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
//c只要参与表达式运算,就会发生整形提升,表达式 +c ,
//就会发生提升,所以 sizeof(+c) 是4个字节。
//表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,
//但是 sizeof(c) ,就是1个字节。

2.算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类
型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

long double
double
float
unsigned long int
long int
unsigned int
int
//如果某个操作数的类型在上面这个列表中排名较低,
//那么首先要转换为另外一个操作数的类型后执行运算,
//要注意算术转换由高到低会存在精确缺失问题。

3.操作符的属性

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。
    两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

3.1操作符优先级

【C语言】操作符详解_第9张图片

(图片截自百度百科)
不过,需要注意的是即使知道,操作符的优先级、求值顺序和结合性也不一定能唯一确定表达式的值,但此时代码一定是存在问题的,要具体问题具体分析。

总结

看完本文即能比较详细了解各种操作符的用法。
码字不易,如果觉得不错的话,记得点赞,收藏和关注哦,您的关注就是我更新的最大动力。

你可能感兴趣的:(C语言,c语言,c++)