C语言操作符详细讲解

news2025/1/11 21:05:36

前言

本次博客一定会让刚刚学习C语言小白有所收获

本次操作符讲解不仅分类还会有代码示例

好好看 好好学 花上几分钟就可以避免许多坑

1 操作符的基本使用

1.1操作符的分类

按功能分

算术操作符: + 、- 、* 、/ 、%

移位操作符: >>  <<

位操作符: &     |   ^ 

赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、>>= 、&= 、|= 、^=

单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof(类型)

关系操作符: > 、>= 、< 、<= 、 == 、 !=

逻辑操作符: && 、||

(三目操作符)条件操作符: ? :

逗号表达式: ,

下标引⽤: []

 函数调⽤: ()

按性质分为 单目操作符 双目操作符 三目操作符

主要的区分是 单目为一个操作数 双目为两个操作数 三目操作符为三个操作数

1.2操作符的使用

1.21算术操作符

对于算术操作符来说,值得注意的点只有 / %

对于加减乘 任何数据都能实现,但是 除法

在遇到整数时,首先除数不能为0,其次除不尽是只会保留整数

比如 2 /1=2    1/2=0    5/3=1

当然如果是浮点数会保留的 1/2.0=0.5

如果是%(求模) 注意它只服务于整型数据取得的数为余数

大家看看代码呗

是不是   % 只能对整数有效

让大家看看结果

10/3只能保留3   10%3余下一个1

这里没有讲解   加减乘  大家可以自行操作,就是数学中的普通四则运算

1.22移位操作符

>>  <<

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

<< 左移操作符

移位规则:左边抛弃、右边补0

我们举两个例子来说明情况

注意整型在内存中的存储为补码,我们分别以 -1 与+1来进行左移操作

这是对一的左移

先画图

画的一般,但是能看

继续看-1的左移

我们看看代码

此时a 和 b的大小都变为2倍

>>右移操作符

位规则:⾸先右移运算分两种:

1. 逻辑右移:左边⽤0填充,右边丢弃

2. 算术右移:左边⽤原该值的符号位填充,右边丢弃

我们的编译器一般都是算术右移

直接看代码

#inlcude<stdio.h>
int main()
{
	int a = 2;
	int b = -2;
	printf("%d", a >> 1);
	printf(" %d", b >> 1);
	return 0;
}

看结果

所以左移操作符的作用是 在不溢出的情况下,使原有的数*2

右移操作符的作用是    在不溢出的情况下,使原有的数/2

1.23位操作符

& 按位与   | 按位或   ^ 按位异或  ~按位取反

位操作 这里只讲简单的原理即可

1& 按位与

画图吧

2  | 按位或

看图

3^ 按位异或

看图

4按位取反

看图

注意一下再char类型中是如此 它的范围为 -128~127

而short类型的  它的范围为-32768~32767

我们可以看看 它的-32768的原码为

1000 0000 0000 0000

值得注意的是它的补码也是 1000 0000 0000

ok 上述代码都可以通过代码实现

是不是对应上了

1.24赋值操作符:

= 、+= 、 -= 、 *= 、 /= 、%= 、>>= 、&= 、|= 、^=

其实这个没什么可讲的,就是赋值

看代码

int main()
{
	char a = 1;
	char b = 126;
	a = 28;//把28赋值给a
	a += 10;//a=a+10
	a -= 10;//a=a-10;
	a *= 10;//a=a*10;
	a /= 10;//a=a/10;
	a %= 10;//a=a%10;
	a >>= 10;//a=a>>10;
	a &= 1;//a=a&1;
	return 0;
}

1.25单⽬操作符

++   --   !   &   sizeof()

前置++   -- 

是先++ --后使用

后置 ++ --

是先使用后++ --

!是使非0的值变为0       使0变为1

简单举例子就好

int main()
{
	int a = 0;
	int b = 1;
	int c = 1;
	if (++a)
		printf("++a是先加1在使用进入判断哦\n");
	if (!--b)
		printf("--b是先减去1在进入判断哦\n");
	if (c--)
		printf("c--是先使用才会减1哦\n");
	return 0;
}

看结果

 &   sizeof()

&作为单目操作符为去某个数据的地址与 双目操作符&按位与是不同的含义

sizeof()是计算某个数据所占的内存大小

看代码

int main()
{
	int a = 10;
	int* p = &a;
	*p = 20;//改变a的值
	int b = sizeof(p);//计算指针类型的大小
	int c = sizeof(b);//计算int类型的大小
	printf("%d %d %d ", a, b, c);
	return 0;
}

1.26关系操作符:

> 、>= 、< 、<= 、 == 、 !=

这其实更没有必要讲解l

其实就是数学里的比大小,如果成立返回1,不成立返回0

!=为不等于

看代码

所以懂了吗

1.27逻辑操作符

&& 、||

逻辑操作符也是一个很重要的操作符

&&逻辑与   (表达式1)&&(表达式2) 只有两个都为真时 整个式子才为真

||逻辑或       (表达式1)||(表达式2)只要一个为真时 整个式子就为真

给一个最简单的代码吧

int main()
{
	int a = 0 && 0;
	int b = 1 && 1;
	int c = 1 && 0;
	int a1 = 0 || 0;
	int b1 = 1 || 1;
	int c1 = 1 || 0;
	printf("%d %d %d",a,b,c);
	printf("%d %d %d", a1, b1, c1);
	return 0;
}

看结果

当然有注意点的

1两端其实可以是表达式的

2对于(表达式1)&&(表达式2)只要 表达式1为假 那么表达式二直接不运算,整个式子的值为0

3对于(表达式1)||(表达式2)只要 表达式1为真 那么表达式而同样不计算 ,整个式子的值就为1

1.28(三目操作符)条件操作符

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

如果表达式1为真则执行表达式1否者执行表达式2

很简单

看代码

int main()
{
	int a = 10;
	int b = 20;
	//三目操作符
	int c = 10 > 20 ? 10 - 20 : 10 + 20;
	int d = a>10?10:20;
	//注意后面的表达式只能是一个确切的值,不能是一个赋值表达式
	//a > b ? a + 20 : b =30;//error
	printf("%d %d %d %d", a, b, c, d);
	//还有一种用途,可以用在打印里头 条件打印
	printf(a > b ? "*" : "1");
	return 0;
}

1.29逗号表达式:

是从左到右依次执行代码,取最后一个表达式的值为返回值 看语法

(表达式1,表达式2,表达式3,表达式4,表达式5,表达式6······,表达式n)

 ,  只是一个小小的逗号可能还看不出什么,我们还是看代码说话

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int d = (a = 30, b++, c += 60, 20);
	//那么此时 a为30 b为21 c为90 d取上最后一个表达式的值为20
	//看结果
	printf("%d %d %d %d", a, b, c, d);
	return 0;
}

1.30下标引用 函数调⽤

 []   ()

下标引用  主要用于数组中调用任意位置中的元素

当然他也可以对指针使用等效于 a[0]==*(a+0)

函数调用符号更没什么好讲了,用于函数的调用以及定义

还是举例看代码就好

void haha(int a,int b);//这是函数声明,用了 ()
int main()
{
int a=20;
int *p=&a;
int c=p[0];//算是解引用的一种
int arr[20]={0};//对数组的定义
return 0;
}

至此几乎所有的操作符的基本使用都讲解完了接下来看看优先级以及结合性

1.3操作符的属性

分为优先级、结合性

先上一张图

1.31优先级结合性

优先级 优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是 不⼀样的

比如

3 + 4 * 5;

上⾯示例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法 的优先级高于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4

结合性

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右 结合(从右到左执⾏),⽐如赋值运算符( = )

5 * 6 / 2;

上⾯⽰例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6 , 再计算 6 / 2

运算符的优先级顺序很多,下⾯是部分运算符的优先级顺序(按照优先级从⾼到低排列),建议⼤概 记住这些操作符的优先级就⾏,其他操作符在使⽤的时候查看下⾯表格就可以了

我们可以列出几个优先级问题的代码,一般而言优先级不需要特殊记忆,只要多敲多练即可


看看代码

int main()
{
	int a = 10;
	//看看,如果我们要让a先左移两位再按位与上一个1,就必须要加上括号
	//否则此时是先2与1逻辑与再左移
	int d =(a<<2)&1;
	return 0;
}
//这个很容易搞错,大家以后会遇到这样的代码

再看一个例子

int main()
{
	int arr[20] = {0};
	int** parr = &arr;
	//不加上括号的话编译器无法知道 是先执行 * 还是[] 所以要加上()
	(*parr)[10] = 1;
	return 0;
}

这类例子还有很多,基本上都是解引用的优先级一样不知道先使用那个解应用

对于结合性只需记忆一个点

1 赋值操作符都是从右往左

2三目操作符从右往左

3其他基本都是从左往右

总结

大家还是要多练,才能有理解,祝大家开心

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

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

相关文章

内存池的实现与场景分析

内存管理库 jemalloc 内存管理&#xff0c;C 语言。tcmalloc 内存管理&#xff0c;C。在头文件中引入即可。 确定 block 的大小、不确定 block 的释放时间&#xff0c;如何设计内存池 ? #include <stdio.h> #include <stdlib.h>// gcc mem_pool_v1.c -o mem_poo…

Linux: 进程优先级

Linux: 进程优先级 一、进程优先级概念二、如何查看进程优先级三、如何修改进程的优先级&#xff08;PRL vs NI&#xff09;四、为何优先级PRL必须限定范围五、进程其他特性 一、进程优先级概念 优先级的本质就是排队&#xff0c;而排队则是资源不足所引起的。在计算机中&#…

Sublime 彻底解决中文乱码

1. 按ctrl&#xff0c;打开Console&#xff0c;输入如下代码&#xff1a; import urllib.request,os; pf Package Control.sublime-package; ipp sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHand…

LLM:函数调用(Function Calling)

1 函数调用 虽然大模型能解决很多问题&#xff0c;但大模型并不能知晓一切。比如&#xff0c;大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月&#xff0c;GPT-4 是 2023 年12月)。另外&#xff0c;大模型没有“真逻辑”。它表现出的逻辑、推理&#xff0c;是训练文本的统计…

spring注解@EventListener实现监听原理

文章目录 EventListener使用方式EventListener实现原理1.引入时机2 初始化时机3 作用时机->将加了EventListener注解的方法识别出来&#xff0c;并封装为监听器&#xff0c;加载spring容器中 总结 EventListener使用方式 package com.cyl.listener;import org.springframew…

区间预测 | Matlab实现带有置信区间的GRNN广义回归神经网络时间序列未来趋势预测

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 Matlab实现带有置信区间的GRNN广义回归神经网络时间序列未来趋势预测 带有置信区间的GRNN(广义回归神经网络)时间序列未来趋势预测结合了广义回归神经网络(GRNN)的预测能力和置信区间的统计度量,以提供对未来…

Linux系统下NAT网卡出现问题,无法上网的解决办法

NTA连接无法上网&#xff0c;如果你试过网上所有教程&#xff0c;检测了Windows环境和Ubuntu环境没问题&#xff0c;且无法启动系统服务、ping网络失败、重置虚拟机网络配置器也无效等种种以下所列原因无法解决&#xff0c;可能在于没有获取IP地址&#xff0c;才不能上网 netw…

Taskflow:运行时交互(Interact with the Runtime)

Taskflow允许您通过将运行时对象作为任务的参数与调度运行时进行交互。这主要用于设计从Taskflow的现有设施扩展的专用并行算法。 创建Runtime对象 Taskflow允许静态任务和条件任务接受引用的tf::Runtime对象&#xff0c;该对象提供一组方法与调度运行时交互。以下示例创建一…

CleanMyMac X中文---让Mac焕发新生,Mac优化与清理的终极利器

CleanMyMac X是一款专为Mac用户设计的综合性系统优化工具。通过智能扫描&#xff0c;它能够快速识别并清理Mac磁盘上的垃圾文件、重复文件、无用语言安装包、iTunes缓存、邮件附件等&#xff0c;有效释放磁盘空间&#xff0c;提升Mac电脑的运行速度。此外&#xff0c;CleanMyMa…

灵途科技助力家电智能创新

从智能家电到个护健康&#xff0c;科技无时无刻不在刷新我们对智慧生活的认知&#xff0c;我们也从未像今天这样近距离贴近智慧生活的朴素本质——传感技术。灵途科技专注光电感知技术&#xff0c;持续为智能家电客户提供成熟的全方位感知解决方案。步入发展第八年&#xff0c;…

本地搭建多人协作ONLYOFFICE文档服务器并结合Cpolar内网穿透实现公网访问远程办公

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…

【OpenGL】(1) 环境搭建:运行简单的 OpenGL 教学示例程序

&#x1f4ad; 写在前面&#xff1a;我们尽可能地让大家以 最简单粗暴且无脑的方式&#xff0c;带大家配置好 OpenGL 环境&#xff0c;并跑出我们第一个示例程序。再次声明&#xff0c;本专栏所有教学都是基于 Windows上使用 VS2022 (X64) 的。本专栏主要内容是关于 3D 计算机图…

【讲解下Gitea】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

anaconda navigator updater 版本更新失败

打开后&#xff0c;更新界面持续很久 使用命令行查看版本 执行conda update anaconda-navigator 第一次执行中间失败&#xff0c;重新执行&#xff0c;更新成功

基于深度学习YOLOv8+PyQt5的水底海底垃圾生物探测器检测识别系统(源码+数据集+配置说明)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;323海底 获取完整源码7000张数据集配置说明文件说明远程操作配置环境跑通程序 效果展示 基于深度学习YOLOv8PyQt5的水底海底垃圾生物探测器检测识别系统设计&#xff08;源码数据集配置文件&#xff09; 各文件说明 程序运…

网页布局案例 浮动

这里主要讲浮动 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*{padding: 0;margin: 0;}.header{height: 40px;background-color: #333;}.nav{width: 1226px;heig…

【Java 多线程】从源码出发,剖析Threadlocal的数据结构

文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类&#xff0c;里面数据结构的设计很有意思&#xff0c;很巧妙。但是我们平时使用它的时候常常容易对它的使用…

学习【Redis高级篇】这一篇就够了

目录 1. 分布式缓存1-1. Redis持久化RDB持久化AOF持久化RDB与AOF对比总结 1-2. Redis主从集群全量同步增量同步主从优化总结 1-3. Redis哨兵哨兵作用集群监控原理集群故障恢复原理RedisTemplate访问哨兵总结 1-4. Redis分片集群散列插槽集群伸缩故障转移 2. 多级缓存2-1. 浏览器…

linux ubuntu 在保存文件不被允许,但是root权限

现象&#xff1a;MobaXterm_Personal_2登录到服务器&#xff0c;切换到root用户&#xff0c;然后使用MobaXterm_Personal_2自带的编辑器&#xff0c;编写文件&#xff0c;进行保存不被允许&#xff1b;查看目录root是有权限进行修改文件的&#xff0c;然后使用vim进行修改保存&…

【AcWing】蓝桥杯集训每日一题Day7|贡献法|4261.孤独的照片(C++)

4261.孤独的照片 AcWing 4261. 孤独的照片&#xff08;每日一题&#xff09; - AcWing难度&#xff1a;简单时/空限制&#xff1a;1s / 64MB总通过数&#xff1a;9889总尝试数&#xff1a;26088来源&#xff1a;USACO 2021 December Contest Bronze算法标签贡献法乘法原理 题目…