【C生万物】 操作符篇

news2024/9/21 16:43:20

欢迎来到 Claffic 的博客 💞💞💞

前言: 

我觉得学习语言,最直接的就是懂不懂符号,而符号中最突出的就是操作符,这期带大家认识认识C语言中的操作符及其使用。


目录

Part1:算数操作符

Part2:移位操作符

1.左移操作符

2.右移操作符

Part3:位操作符

Part4:赋值操作符

Part5:单目操作符

Part6:关系操作符

Part7:逻辑操作符

Part8:条件操作符

Part9:逗号表达式

Part10:下标,函数调用,结构成员

1.下标引用操作符[ ]

2.函数调用操作符( )

3.访问结构体成员

Part11:表达式求值

1.隐式类型转换

2.算数转换

3.操作符的属性


Part1:算数操作符

+   -   *   /   %

其实就是常见的加减乘除,再加上一个取模(取余数);

不过它们的使用也遵照一些规则:

•  除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数
• 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
• 操作符的两个操作数必须为整数。返回的是整除之后的余数

Part2:移位操作符

移位操作符包括这两个:

<<     左移操作符
>>     右移操作符

注:移位操作符的操作数只能是整数 

1.左移操作符

位移规则:

左边抛弃,右边补0

实例:

注意:num本身的值不会变化,除非将左移后的结果赋值给num

2.右移操作符

位移规则:

右移运算分为两种类型:

• 逻辑移位
左边用 0 填充,右边丢弃
• 算术移位
左边用原该值的符号位填充,右边丢弃

先说逻辑位移:

 这个还是好理解的

算数位移:

符号位就是最左边的一位,原来的符号位是1,那么右移后补1即可,最后要还原回原码

Part3:位操作符

&     //按位与:只有对应的两个二进位均为1时,结果位才为1,否则为0
|     //按位或:只要对应的二个二进位有一个为1时,结果位就为1,否则为0
^     //按位异或:当两对应的二进位相异时,结果位为1,否则为0

 注:位操作符的操作数只能是整数 

举个例子: 

按位与:

按位或:

按位异或:

对于异或操作符,有下列结论:

位操作符有什么用呢?
这里有一个常见好用的作用:
统计一个整数在存储中二进制的1的个数

#include <stdio.h>
int main()
{
     int num = -1;
     int i = 0;
     int count = 0;//计数
     while(num)
     {
         count++;
         num = num&(num-1);
     }
     printf("二进制中1的个数 = %d\n",count);
     return 0;
}

Part4:赋值操作符

这种操作符就是方便:

当赋值的对象是本身时,起到修改自身的效果,此时就可以利用赋值操作符。

比如:

int x = 10;
x = x + 2; // 写法1
x += 2;    // 写法2

是不是很简洁?
类似的,有符合赋值操作符:

+=    x = x + n
-=    x = x - n
*=    x = x * n
/=    x = x / n
%=    x = x % n
>>=    x = x >> n
<<=    x = x << n
&=    x = x & n
|=    x = x | n
^=    x = x ^ n

Part5:单目操作符

先看看单目操作符包括哪些吧:

!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问操作符(解引用操作符)
(类型)      强制类型转换

! , - , + , sizeof 不再多说;

取地址&: 

就是字面意思,得到某一个量的地址,在指针那块会经常用到;

二进制按位取反~:

这个意思好理解,就是按照补码,0对应位取反得1,1对应位取反得0,

不过并不常用... ...

前置、后置++/--:

先来解释++/--:

相当于 x += 1 / x -= 1;

在原数的基础上加/减1,原数改变。

那么这个前置和后置是什么意思?

看下面这几段代码:

#include<stdio.h>
int main()
{
	int i = 10;
	while (i--)
	{
		printf("%d ", i);
	}
	return 0;
}

输出: 9 8 7 6 5 4 3 2 1 0

#include<stdio.h>
int main()
{
	int i = 10;
	while (--i)
	{
		printf("%d ", i);
	}
	return 0;
}

输出:9 8 7 6 5 4 3 2 1

第二种相比第一种少了 0 ;

说明 前置--是先--,再使用后置--是先使用,再--,++相同。

间接访问操作符(解引用操作符) *:

这个操作符就是由地址寻找所指量的操作符

Swap(int* a, int* b) // 传递的是地址
{
	int tmp = *a; // 解引用操作,通过地址找到a;
	*a = *b;
	*b = tmp;
}
int main()
{
	int a = 10;
	int b = 20;
	Swap(&a, &b);
	printf("a = %d, b = %d", a, b);

	return 0;
}

Part6:关系操作符

>
>=
<
<=
!=        用于测试“不相等”
==        用于测试“相等”

这部分其实没啥好讲的,

注意判断相等 “==” 不要写成赋值 “=” 。 

Part7:逻辑操作符

就两个:

&&          逻辑与
||          逻辑或

它们与按位操作符是有些相近的:

&        这是按位与

|         这是按位或

两边放表达式还是好理解的,如果放数字呢?

像 1 && 2 ,1与2都是非0,都为真,逻辑与操作后是真,返回1;

1 || 0 ,1为真,0为假,逻辑或操作后是真,返回1;

Part8:条件操作符

exp1 ? exp2 : exp3

这个条件操作符其实就是三目操作符啦

它就相当于:

if (exp1)
        exp2;
else
        exp3;

Part9:逗号表达式

exp1, exp2, exp3, …expN

逗号表达式就是用逗号把表达式隔开;

从左向右执行;

整个表达式的结果是最后一个表达式的结果

可以看一个实例:

int main()
{
	//代码1
	int a = 1;
	int b = 2;      // a = 12      b = 13
	int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);

	return 0;
}

输出结果:12   13   13

Part10:下标,函数调用,结构成员

1.下标引用操作符[ ]

int arr[10];//创建10个元素的数组
arr[9] = 10;//使用下标引用操作符。
//[ ]的两个操作数是arr和9。

2.函数调用操作符( )

接受一个或者多个操作数:

第一个操作数是函数名,剩余的操作数就是传递给函数的参数。 

#include <stdio.h>
void test1()
{
	printf("Hello world\n");
}
void test2(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	test1();			 // 使用()作为函数调用操作符。
	test2("abcdef"); 
	return 0;
}

3.访问结构体成员

.      结构体.成员名
->     结构体指针->成员名
struct Stu
{
	char name[10];
	int age;
	char sex[5];
};

int main()
{
	struct Stu stu;
	struct Stu* pStu = &stu;//结构成员访问

	stu.age = 20;//结构成员访问
	pStu->age = 20;//结构成员访问

	return 0;
}

Part11:表达式求值

1.隐式类型转换

先说什么是整型提升:

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

再来看看整型提升是如何进行的:

整形提升是按照变量的数据类型的符号位来提升的。

//负数的整形提升
char c1 = -1; // 一个char类型1个字节大小,8个比特位
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111

//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001

//无符号整形提升,高位补0

2.算数转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
// 排名看先后
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
但是算数转换要合理

3.操作符的属性

说一个操作符有什么属性,也就是有什么影响的因素:

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

操作符优先级表:

// 表达式1
a*b + c*d + e*f;
代码 1 在计算的时候,由于 * + 的优先级高,只能保证, * 的计算是比 + 早,但是优先级并不
能决定第三个*比第一个+早执行。
//表达式2
c + --c;

同上,操作符的优先级只能决定自减--的运算在+的运算的前面,但是我们并没有办法得知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义

的。
//代码3-非法表达式
int main()
{
    int i = 10;
    i = i-- - --i * ( i = -3 ) * i++ + ++i;
    printf("i = %d\n", i);
    return 0;
}

这个结果取决于编译器,这里就不展示结果,因为没有参考价值。 


总结: 

这篇博客进行了操作符的讲解,不要问操作符为什么长这样,能理解的理解并尝试取用一下,不能理解的先好好记住,刚开始有操作符不会用是很正常的,建议多走读代码,进而自己能敲出自己的代码~

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

直方图均衡化(调节图像亮度、对比度)

直方图均衡化&#xff08;调节图像亮度、对比度&#xff09; 本篇目录 &#x1f984; 一、前言 &#x1f984; 二、直方图均衡化概念 &#x1f984; 三、直方图均衡化实例 &#xff08;1&#xff09;、灰度图像的均衡处理实例 ①、卡通人物灰度图像均衡处理 ②、卡通猫头…

音频编辑开发SDK Audio DJ Studio for .NET Crack

11.7版本--Audio DJ Studio for .NET是 MultiMedia Soft 开发的 .NET Windows Forms 自定义控件&#xff0c;可以轻松地向使用Microsoft Visual Studio编写的Winform和WPF 应用程序添加声音播放和混音功能&#xff1b;由于与 DirectShow 编解码器和 BASS 库的集成&#xff0c;两…

【UITableView和UITableViewCell的常见属性 Objective-C语言】

一、UITableView和UITableViewCell的常见属性, 1.我们说,这些属性里面, 2.这些是不是都是单元格的属性, 1)这个imageView:是单元格里面的图片框,是不是指的是这个啊, 2)这个textLabel:是指的这个标题上面这个Label吧, 3)这个detailTextLabel:是指的标题下面这…

安装tomcat8,配置服务启动脚本,部署jpress应用

1. 简述静态网页和动态网页的区别。 静态网站顾名思义就是不能动的网站&#xff0c;其中的内容一旦做好就固定了。而动态网站是一种网页编程技术&#xff0c;它可以使得浏览器和服务器可以交互&#xff0c;根据服务器的不同请求动态的生成网页内容。 3. 简述 Webl.0 和 Web2.…

基于STM32的倒车雷达系统设计

目录 前言 一、绪论 1.1 设计背景 1.2 设计内容 二、系统硬件设计 2.1 硬件系统框图 2.2 主控制电路 2.3 超声波电路 2.4 OLED显示电路 2.5 键盘输入电路 2.6 声光报警模块电路 三、系统软件设计 3.1 系统主程序设计 3.2 OLED显示程序设计 3.3 键盘设定程序设计…

设计模式-结构型模式之外观模式

4. 外观模式4.1. 模式定义外观模式(Facade Pattern)&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。外观模式…

C++11 make_shared函数和std::make_unique详解

make_shared的使用: shared_ptr<string> p1 make_shared<string>(10, 9); shared_ptr<string> p2 make_shared<string>("hello"); shared_ptr<string> p3 make_shared<string>(); 好处&#xff1a;减少分配次数 std::s…

大厂面试内幕:阿里内部整理出的5000页Java面试复盘指南,起飞!!!

互联网的技术岗一直是高薪的代名词&#xff0c;特别是大厂&#xff0c;应届生的年薪基本都20W起&#xff0c;比一般的公司高多了。 看下面这张网上热传的大厂应届生薪酬表就知道了&#xff0c;SP offer甚至能拿到30W以上。 技术社区也有晒出高薪offer的同学&#xff1a; 除了薪…

Unity LOD 技术

Unity LOD 技术 LOD(Level of detail) 多层次细节&#xff0c;常用的Unity 优化技术 它是根据物体在游戏画面中所占视图百分比来调用显示不同精度的模型 说白了就是 当物体距离摄像机距离较近时显示高精度模型 当物体距离摄像机距离较远时显示低精度模型 优点&#xff1a;优化…

Python深度学习实现DIY专属个人表情包

引言&#xff1a; 在现代社交媒体的时代&#xff0c;表情包已经成为了人们日常生活中不可或缺的一部分。表情包可以用来表达情感、传递信息&#xff0c;甚至成为一种文化符号。然而&#xff0c;随着表情包的日益普及&#xff0c;大量的表情包已经不能满足人们的需求&#xff0…

如何对图片批量重命名?

对于爱好摄影的朋友们来说&#xff0c;不管是手机还是相机拍摄的照片&#xff0c;在导入电脑后&#xff0c;它们的文件名通常都是一串长长的乱码。这不仅会导致桌面看起来杂乱无章&#xff0c;还会给我们查找图片带来很多不便&#xff0c;有时候丢失几张图片都发现不了。不过&a…

7、在vscode上利用cmake构建多文件C++工程

文章目录 &#xff08;1&#xff09;创建如下工程文件夹&#xff1a;其中头文件放在include文件夹中&#xff0c;源文件放在src文件夹中&#xff08;2&#xff09;在vscode上打开工程文件夹&#xff0c;在对应的文件夹内建立相应的文件1&#xff09;目录结构2&#xff09;各文件…

【C语言督学训练营 第十一天】三篇文章吃透数据结构中的线性表(二)----- 链表的增删改查与销毁

文章目录 前言一、链表1.基本介绍2.增删改查原理与实战 总结与源码 前言 谭浩强老师说过&#xff1a;“指针是c语言的灵魂”&#xff0c;今天说到的链表就是由C语言的灵魂所筑&#xff0c;学会了链表之后可以使用链表轻松实现树、图等数据结构&#xff0c;可以轻松化解考研数据…

《无线神经调节的微创技术治疗慢性顽固性疼痛:初步观察报告》

**全文概况 **&#xff1a;该文件讨论了一种新型无线和微创神经调节设备&#xff0c;用于治疗之前曾经失败的患者慢性顽固性疼痛。该设备通过经皮植入的电极远程控制&#xff0c;进行高频背根节神经刺激或周围神经刺激。该系统对于患有腰腿疼痛的患者有重要潜力&#xff0c;因为…

车载 Android开发面试习题整合~

随着车联网技术的不断发展和普及&#xff0c;越来越多的汽车厂商开始使用 Android 操作系统作为车载娱乐和信息娱乐系统的核心。在这个趋势下&#xff0c;车载 Android 应用开发程序员的需求也日益增加。 像一些车企大厂在广招这方面的技术人才。给原本处于落寞的Android 开发行…

PTA:C课程设计(7)

山东大学&#xff08;威海&#xff09;2022级大一下C习题集&#xff08;7&#xff09;函数题7-6-1 递增的整数序列链表的插入7-6-2 查找学生链表7-6-3 统计专业人数7-6-4 建立学生信息链表编程题7-7-1 查找书籍7-7-2 找出总分最高的学生函数题 7-6-1 递增的整数序列链表的插入…

五子棋透明棋盘界面设计(C语言)

五子棋透明棋盘设计&#xff0c;漂亮的界面制作。程序设置双人对奕&#xff0c;人机模式&#xff0c;对战演示三种模式。设置悔棋&#xff0c;记录功能&#xff0c;有禁手设置。另有复盘功能设置。 本文主要介绍透明的玻璃板那样的五子棋棋盘的制作。作为界面设计&#xff0c;…

「Bug」OpenCV读取图像为 None 分析

头一次遇到 OpenCV 无法读取图像&#xff0c;并且没有任何提示&#xff0c;首先怀疑的就是中文路径&#xff0c;因为大概率是这个地方出错的&#xff0c;但是修改完依旧是None&#xff0c;这就很苦恼了&#xff0c;分析了下出现None的原因&#xff0c;大概有以下三种情况&#…

ssm--MyBatis基础day01

1.MyBatis概述 1.1 ORM框架 对象关系映射&#xff08;Java中的对象 对应 数据库中的表&#xff09; 1.2 官网地址 mybatis 1.3 MyBatis Plus MyBatis-Plus (baomidou.com)官网 1.4 JPA Java 持久层API 2. MAVEN引入 2.1 配置maven 2.2 导入MyBatis <dependency>…

带你们偷瞄编程绕不开的C语言(三)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C专栏》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以帮到…