IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c】操作符详解(二) -> 正文阅读

[C++知识库]【c】操作符详解(二)

哈喽大家好,大家好,欢迎收看本期博客 !?

我是Mr.tan

今天呢,给大家分享剩下的c语言中的操作符,希望对大家学习c语言能有所帮助。


一、赋值操作符

操作符:描述:用法案例:结合性:
=赋值a = 2R-L
+=以……加a += 2R-L
-=以……减a -= 2R-L
*=以……乘a *= 2R-L
/=以……除a /= 2R-L
%=以……整数取余a %= 2R-L
>>=以……右移a >>= 2R-L
<<=以……左移a <<= 2R-L
&=以……与a &= 2R-L
|=以……或a |= 2R-L
^=以……异或a ^= 2R-L

1、赋值

对于赋值操作符,我们经常能用到,当我们对我们的身高和颜值不满意时,我们可以用赋值操作符来制定我们的目标。比如:

int tall = 175;//目前身高
tall = 185;//目标身高
int face_score = 70;//目前颜值分数
face_score = 90;//目标颜值分数

2、连续赋值

当我们知道连续赋值的工作原理时,我们很容易理解,但是对于连续赋值也是有缺陷的,它不方便调试,当我们想观察每一步的细节时,它是观察不到位的。

int a = 10;
int b = 0;
b = a = a + 3;

所以未来大家在写代码的过程中,是不建议这种写法的,同样的语句我们可以分开写,这样不仅方便我们的调试,观察时也清晰。

int a = 10;
int b = 0;
a = a + 3;
b = a;

?3、复合赋值

在看复合赋值之前,我们先观察下面两段代码:

//代码1
int main()
{
	int a = 8;
	a = a + 1;
	printf("a=%d\n",a);
	int b = 8;
	b = b >> 2;
	printf("b=%d\n", b);
	int c = 8;
	c = c * 3;
	printf("c=%d\n", c);
	int d = 8;
	d = d | 1;
	printf("d=%d\n", d);
	return 0;
}
//代码2
int main()
{
	int a = 8;
	a += 1;
	printf("a=%d\n",a);
	int b = 8;
	b  >>= 2;
	printf("b=%d\n", b);
	int c = 8;
	c *= 3;
	printf("c=%d\n", c);
	int d = 8;
	d |= 1;
	printf("d=%d\n", d);
	return 0;
}

但我们仔细对比两个程序,我们会发现当我们对变量自身操作后,再将值赋给自己时,我们可以将常规写法改写成复合赋值的形式,这样就充分的运用了我们所学的知识。复合赋值中的其它操作符也能写成这样,在此我们就不一一列举了。


二、单目运算符

操作符:描述:用法案例:结合性:
逻辑反!a
R-L
+正号+3
R-L
-负号-2
R-L
&取地址&a
R-L
*解引用*pa
R-L
sizeof操作数类型长度sizeof(int)
R-L
~按位取反~2
R-L
++前、后缀自增++2、2++
(前缀)R-L(后缀)L-R
--前、后缀自减--1、1--
(前缀)R-L(后缀)L-R
()强制类型转换(int) 3.6
R-L

1、逻辑反操作

对于这个运算符,它的作用就是把真变成假,把假变成真(如图所示)。当我们看见第一段程序时,我们会发现if语句中的条件为假,将不运行printf语句。

//代码段1
int main()
{
	int flag = 0;
	if (flag)
	{
		printf("谭谭粉丝最帅!\n");
	}
	return 0;
}

//代码段2
int main()
{
	int flag = 1;
	if (!flag)
	{
		printf("谭谭粉丝最帅!\n");
	}
	return 0;
}

但是我们将if语句中的条件之前加上逻辑反操作的运算符,它将执行printf语句,并打印出“谭谭粉丝最帅!”(如图所示)。?

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("谭谭粉丝最帅!\n");
	}
	return 0;
}

?2、正负号

对于正负号,我想大家应该是非常了解了吧!在变量的初始化时,我们可以给int、float、double等类型的值赋一个正数(正号省略不写),也可以赋一个负数(在变量之前加一个减号);

int main()
{
	int a = -3 ;
	int b = 4;
	printf("a=%d b=%d\n",a,b);
	return 0;
}

?3、取地址符与解引用符

? ??取地址符

创建变量的本质,一定是在内存中开辟一段存储空间。而内存中的每一个单元都有自己的编号,假设创建一个int类型的变量,那么整形变量中的4个字节都有自己的地址,如果我们想观察首个字节的地址,我们只需要在变量之前加一个&,而打印出来的结果是一个十六进制的数字。?

int main()
{
	int a = 10 ;
	char b = 0;
	printf("%p\n",&a);
	printf("%p\n",&b);
	return 0;
}

? 解引用

当我们想把这个数值存起来的时候,我们可以把它放进pa里面去,那么我们就可以把pa认为是一个指针变量,pa是专门用来存放a的地址。对于int* pa = 0这一语句中的*是告诉我们pa是指针变量,而它前面的int*是告诉我们pa所指的a的类型,而pa为变量名。pa里面存的是a的地址,当有一天我们想通过pa找到我们的a,只需要在pa的前面加上解引用操作符,如果单纯的只想得到a的地址,只需要pa即可。

int main()
{
	int a = 10 ;
	char b = 0;
	int* pa = &a;
	*pa = 20;
	printf("%d\n", a);
	printf("%p\n", pa);
	return 0;
}

?4、sizeof

? sizeof是求操作数的类型长度的,而%zu是专门打印sizeof的返回值的。

int main()
{
	int a = 10 ;
	int* pa;
	int arr[10];
	printf("%zu\n",sizeof(a));
	printf("%zu\n", sizeof(pa));
//sizeof(数组名),数组名表示整个数组,不是首元素的地址,它是求整个数组的大小,单位为字节
	printf("%zu\n", sizeof(arr));
	return 0;
}

int main()
{
	short m = 5;
	int a = 2;
	printf("%zu\n", sizeof(m = a + 5));//sizeof内部放的表达式不计算
	printf("%d\n", m);
	return 0;
}

对于代码段中的语句,a为int类型的变量,在内存中占用四个字节,m为short类型的变量,在内存中占两个字节。把a加5之后放到m中去会发生截断,因为把int类型的变量占用的内存空间比short类型大,它放不下,所以表达式最终会取决于short类型,而sizeof是求操作数的类型长度的,所以最后打印出来的结果前者为2。sizeof内部放的表达式不计算,所以打印出来的m为5

而对于sizeof的写法有三种形式:

//三种正确写法
printf("%zu\n",sizeof(a));
printf("%zu\n", sizeof a);
printf("%zu\n", sizeof(int));

//错误写法
printf("%zu\n",sizeof int);

注意:如果sizeof后面为变量的类型,那么小括号是不能省略的,这是一种错误的写法,编译器会报错。

?5、自增自减运算符? ?

? ? ?前置++与前置--

int main()
{
	int a = 10;
	int x = 0;
	int y = 0;
	x = ++a;
	printf("%d\n", a);
	//先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
	y = --a;
	printf("%d\n", a);
	//先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
	printf("%d %d", x, y);
	return 0;
}

??后置++与后置--

int main()
{
	int a = 10;
	int x = 0;
	int y = 0;
	x = a++;
	printf("%d\n", x);
	printf("%d\n", a);
	//先对a先使用,再增加,这样x的值是10;之后a变成11;
	y = a--;
	printf("%d\n", y);
	printf("%d\n", a);
	//先对a先使用,再自减,这样y的值是11;之后a变成10;
	return 0;
}

让我们通过一个例题来彻底学会自增自减的运算关系,当我们观察完代码之后请看下方的表格,表格中的各结果标明的非常清楚。

int main()
{
   int a=2;
   int b=2;
   int c=2;
   int d=2;
   a++;
   b--;
   ++c;
   --d;
   return 0;
}
表达式:表达式执行前变量值:表达式执行后变量值:表达式的值:
a++232
b--212
++c233
--d211

6、按位取反

int main()
{
	int a = 3;
	//00000000 00000000 00000000 00000011  按位取反前的补码
	//11111111 11111111 11111111 11111100  按位取反后的补码
	//11111111 11111111 11111111 11111011  按位取反后的反码
	//10000000 00000000 00000000 00000100  按位取反后的原码  
	printf("%d\n", ~a);
	return 0;
}

~是对一个数的二进制按位取反 .将a按位取反后的原码转换为十进制数为-4,与我们打印出来的结果完全契合。

?7、强制类型转换

(1)、将实数转换为整数时,系统采用的是截断方式,而不是4舍5入。

int main()
{
	int a;
	a = (int)3.8;
	printf("%d\n", a);
	return 0;
}

?(2)、对变量进行强制类型转换后,变量的数据类型不变,而是得到一个所需类型的数据。

int main()
{
	double x = 3.6;
	int i; 
	i = (int)x;
	//i为3,x为3.6,x为double型,i为整型。
	printf("%d\n", i);
	printf("%zu\n", sizeof(x));
	printf("%zu\n", sizeof(i));
	return 0;
}


三、关系操作符

操作符:描述:用法案例:结合性:
==等于2 == 2
L-R
>大于a > b
L-R
>=大于等于a >= c
L-R
<小于b < d
L-R
<=小于等于b <= f
L-R
!=不等于a != f
L-R

对于关系运算符,我想大家不管是在数学中还是在c语言中都已经再熟悉不过了,在这里要注意的有:

1、两个=为判断是否相等,而一个=为赋值,在写代码的过程中千万不要把它们搞混;

2、==不能比较两个字符串的内容,实际上比较的是两个字符串的首字符的地址;

3、关系运算符的优先级低于算术运算符,高于赋值运算符;

4、我们将判断的结果进行打印后,?1 为“真”,表示条件成立,而?0 为“假”,表示条件不成立。


四、逻辑运算符

运算符:描述:用法案例:结合性:
&&逻辑与a && b
L-R
||逻辑或c || d
L-R

1、逻辑与

//代码1
int main()
{
	int a = 2;
	int b = 4;
	if (a && b)
	{
		printf("小比特,大梦想!");
	}
	return 0;
}

//代码2
int main()
{
	int a = 2;
	int b = 0;
	if (a && b)
	{
		printf("小比特,大梦想!");
	}
	return 0;
}

?逻辑或的两边同时为真,整个式子才为真,只要有一个为假,整个式子就为假。对于代码段中的表达式a&&b,先看a的值等不等于0,如果a等于0就不再计算b;如果a不等于0再去计算b;

2、逻辑或

//代码1
int main()
{
	int a = 0;
	int b = 4 - 4;
	if (a || b)
	{
		printf("小比特,大梦想!");
	}
	return 0;
}

//代码2
int main()
{
	int a = 2 + 3;
	int b = 4 - 4;
	if (a || b)
	{
		printf("小比特,大梦想!");
	}
	return 0;
}

?对于逻辑或的运算,先判断逻辑或左边的表达式,当左边的表达式不等于0的时候就不要再计算右边的表达式,如果左边的表达式等于0的时候再计算右边的表达式即可。而逻辑或的两边只要有一个为真,整个式子就为真,如果两边都为假,则整个式子为假。

逻辑与的优先级别高于逻辑或,而他们两个都低于关系运算符,并且都高于赋值运算!


五、条件操作符

操作符:描述:用法案例:结合性:
? :条件操作符a > b ? 2 : 3
L-R
int main()
{
	int a = 3;
	int b = 2;
	int c;
	c = ((a > b) ? 4 : -1);
	printf("%d\n", c);
	return 0;
}

如果a>b则c的值为4,否则c的值为-1;这段代码充分的展现了条件操作符的作用!


六、逗号表达式

操作符:描述:用法案例:结合性:
,逗号a=2+3,b=a-1,c=b*2
L-R
int main()
{
	int a = 1;
	int b = 2;
	int c = (a =a + 2, b = b + 3, a = a + b,b = a + 1);
	printf("%d\n", c);
	return 0;
}

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

欢迎大家的收看本期内容,今天的内容到此结束了,对于c语言操作符的详解到这里就跟大家告别一段落了,让我们期待下一篇的文章到来吧!

如果喜欢,那就一键三连吧!!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:25:04  更:2022-08-06 10:25:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 2:24:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码