【C语言】操作符大全(保姆级介绍)

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:C语言

🔥该篇将详细介绍各种操作符的功能。

目录:

  • 📘 前言
  • ① 算术操作符
  • ②移位操作符
  • ③位操作符
  • ④赋值操作符
  • ⑤单目操作符
  • ⑥关系操作符
  • ⑦逻辑操作符
  • ⑧ 条件操作符
  • ⑨ 逗号表达式
  • ⑩ 下标引用、函数调用和结构成员
  • ❤️ 结语

📘 前言

 操作符是编程中表示操作的符号或符号组合。它们用于执行算术、逻辑、比较和其他操作。

 操作符可以分为这几类:算术操作符;移位操作符;位操作符;赋值操作符;单目操作符;关系操作符;逻辑操作符;条件操作符;逗号表达式;下标引用、函数调用和结构成员。下面将会一 一介绍这些操作符。


① 算术操作符

+         -         *           /         %

📘前面的 + - * 就和数学的逻辑一样,都可以作用于整数和浮点数。

📘    / 计算后的结果是商。并且有两种除法,一个是整数除法,一个是浮点数除法。

  1. 整数除法 : 假如是 5 / 2 , 两个整数相除,会得到一个整数,即它的商,得到的结果自然就是 2 .
  2. 浮点数除法: 如果想让 5 /2的结果为 2.5 ,就必须执行浮点数除法,需要保证除数和被除数至少有一个是浮点数
    例如 : 5.0 / 2 ; 5 / 2.0 ; 5.0 / 2.0

在运用除法时,除数不可以为0。例如: int n = 0;int ret = 6 / n;

📘% 被称为取模操作符,也就是算余数。但是需要注意的是,它的操作数只能是整数,不可以是浮点数。 例如:可以 5%2,但是不可以 5% 2.0 。


②移位操作符

>>(右移)       <<(左移)
注意:移位操作符的操作数只能是整数

 在计算机中,计算机能够处理的是二进制信息,即由0和1组成的序列,这里的移位操作其实就是在移动二进制。在计算机中将一个十进制的数字转化为二进制,会出现3种不同的表现形式:原码,反码,补码
注意:

正整数的原码,反码,补码是相同的。
负整数的原码,反码,补码不同,需要计算得到。

  • 📙原码:根据正负,将整数直接写成的二进制序列。

例如:15 (十进制)它的二进制其实就是 1111。

 但是,15的默认类型为 int ,int 类型是4个字节,即32个bit,一个二进制位占1个bit,所以我们需要向前补充0。需要注意这里规定了最高位是符号位:0表示正,1表示负数。
  例如:

  • 📙反码:
    正整数的原码,反码,补码都相同。
    负整数的反码:原码的符号位不变,其它位按位取反(1变为0,0变为1)。

  • 📙补码:
    正整数的原码,反码,补码都相同。
    负整数的补码:反码+1。

例如:

1.整数在内存中存储的是补码。
2.计算的时候是使用补码来计算的。

所以这里移动的就是二进制的补码。

右移分为两种:

  1. 算术右移:右边丢弃,左边补原来的符号位。
  2. 逻辑右移:右边丢弃,左边直接补0。

📙 C语言没有明确规定使用哪种右移方式,但是一般编译器(例如:VS)上采用的是算术右移。

使用例子:

因为原码是根据正负直接写出的二进制序列,所以打印的时候是需要原码的。

a = -15的例子:

a = 15 的例子:

左移只有一种:左边丢弃,右边补0。

使用例子:

说明:

📙根据这些例子,我们可以发现一些信息:

  • 右移的操作,可以看成一个数据除以2后,再向下取整。
  • 左移的操作,可以看成一个数据乘2。

⚠警告:
1.对于移位运算符,不要移动负数位,这个是标准未定义行为,例如:a>>-1,这种表达式的结果是不可预料的,甚至不同的编译器处理的行为都是不一样的。
 2.需要在合法范围内移位。
 3.移位操作不会改变自身的值,例如a>>1,a本身的值不会改变。


③位操作符

这里操作的也是二进制补码。

&         ^         |
注意:操作数必须为整数

  • 📙&按位与
    规则:对应二进制位有0则为0,两个同时为1才为1。
    例子:

    说明:
  • 📙| 按位或
    规则:对应的二进制位有1则为1,两个同时为0才是0。
    例子:

    说明:
  • 📙^ 按位异或
    规则:对应的二进制位相同为0,相异为1。
    例子:

    说明:

📙 ^ 按位异或 拥有一些特性:
1.一个变量 异或本身得到的值是0。例如: a ^ a 结果为0。
2.一个变量 异或0 得到的值是变量本身的值。例如:int a = 5; printf("%d", a ^ 0);得到的值是 5 。
3.按位异或满足交换律a^ a^ ba^ b^ a 得到的值是一样的。

 通过这些特性,我们可以完成不创建临时变量(第三个变量),实现两个整数的交换。

#include<stdio.h>
int main()
{int a = 2;int b = 4;printf("交换前:a = %d b = %d\n", a, b);//交换a = a ^ b;b = a ^ b;a = a ^ b;//printf("交换后:a = %d b = %d\n", a, b);return 0;
}

④赋值操作符

=        +=        -=        *=        /=        &=        ^=        |=         >>=         <<=

  • = 即为赋值,例如:将 0 赋值给 a , a = 0; .
  • 赋值操作符可以连续使用。
    int a = 0;int x = 1;int y = 2;a = x = y + 1;//从右至左连续赋值

虽然这种方式语法是允许的,但是分开写更加清晰,更易于调试。

    int a = 0;int x = 1;int y = 2;x = y + 1;a = x;
  • += 这种赋值是复合赋值a = a + 1;a+=1; 意思是一样的。像-= ,*= 等,其实都是类似的。

⑤单目操作符

只有一个操作数

!   -  +  & sizeof  ~  –  ++  *  (类型)

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

c语言中,0为假,非0为真。

  • 📙! (逻辑反操作)
  1. 可以逻辑反操作,将真变为假,将假变为真。例如:!0 —— 为真 ,结果是1,!2 —— 结果是假 ,为0。
  2. if (flag == 0)if (!flag) 意思是相同的。if (flag != 0)if (flag) 的意思是相同的。
  • 📙 – (负值) 和 +(正值)
    –(负值)可以得到一个变量的负值,例如:int a = 3;int b = -a;,这样b就被赋值为-3 。

  • 📙&(取地址)和 *(间接访问操作符)
    这两个操作符主要应用于指针。

#include<stdio.h>
int main()
{int a = 10;//pa是指针变量//&-取地址操作符-取出a的地址int* pa = &a;//这里的 * 是指针类型的一部分,不是操作符//*—解引用操作符(间接访问操作符)-通过pa中存放的地址,找到指向的空间(内容)*pa = 20;//找到空间int c = *pa;//找到内容return 0;
}
  • 📙sizeof(操作数的类型长度)
    sizeof是一个操作符,可以计算变量的大小,例如 sizeof(int)或者sizeof(a) ,对于这种里面是类型的,相当于计算该类型创建的变量的大小,注意:计算变量的时候,()可以去掉,例如sizeof a,这也正好说明了sizeof是一个操作符,而不是函数(函数的()是不可以省略的),但是括号里面是类型的话,是不可以的省略的sizeof int;//错误
  • 📙 ~ (对一个数的二进制补码取反)
    使用 ~ 可以让二进制补码的 1变成0 ,0变为1 。
    例如:
#include<stdio.h>
int main()
{int a = -1;//a的补码为:11111111 11111111 11111111 11111111int b = ~a;//b的补码为:00000000 00000000 00000000 00000000return 0;
}

一些应用:

15 的补码是00000000 00000000 00000000 00001111 , 如何让倒数第5个二进制位变成1 ?变化之后又如何变回原来的值?

#include<stdio.h>
int main()
{int a = 15;//00000000 00000000 00000000 00001111 //与00000000 00000000 00000000 00010000 按位或  就可以完成第一个问题a |= (1 << 4);printf("%d\n", a);//31//00000000 00000000 00000000 00011111 //与11111111 11111111 11111111 11101111 按位与  就可以完成第二个问题a&= ~(1 << 4);printf("%d\n", a);//15return 0;
}

实现多组输入

 scanf 读取失败返回的是 EOF(end of file) ,本质是 -1 。又因为~- 1得到的值是 0,然后将这个特点写在while循环中,就可以实现。

#include<stdio.h>
int main()
{int n = 0;//假设读取失败,就会返回EOF(-1),~ -1 就是0,就会停止循环。while (~scanf("%d", &n)){//一系列操作}return 0;
}
  • ++ 和 – (前置 或 后置)

 后置++,是先使用,后++,前置++,是先++,后使用 。后置++是在表达式结束后才++,前置++是即刻生效的,遇到就得先++。
 例如:int a = 0;int b = a++; 相当于,b = a, a = a + 1,int a = 0;int b = ++a 相当于,a = a + 1, b = a 。-- 的逻辑也是这样的。

  • (类型)——(强制转换类型)

例如:int a = (int)2.5;//结果为2 这里把 2.5 (double 类型) 强制转化为 int类型。需要注意,强制转换可能导致数据丢失,所以最好类型匹配。


⑥关系操作符

 >  >=  <  <=  !=  ==

这些是用来判断大小关系的。
其中 >= 为 大于等于 ; <= 为 小于等于; == 用于判断相等 ;!= 用于判断不等。这些判断也只能应用于适合的类型上。


⑦逻辑操作符

&&  ||

&& 为 逻辑与(并且) ,|| 为逻辑或(或者)。

注意:
逻辑操作符 && 和 || 包括 ! ,只关注真假,假用0表示,真用1表示。int a = 3 && 5; a 的结果为 1 。

特点:

  1. 对于&&,左边为假,右边就不计算。
  2. 对于| | ,左边为真,右边就不计算。

例子:

#include <stdio.h>
int main()
{int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++ && ++b && d++;printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);//1 2 3 4return 0;
}

#include <stdio.h>
int main()
{int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++||++b||d++;printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);//1 3 3 4return 0;
}


⑧ 条件操作符

exp1 ? exp2 :exp3

c语言中唯一的一个三目操作符(有三个操作数)。

例如:比较一个大小
int max = (firstNum > secondNum ? firstNum : secondNum);

📘这个操作符的效果类似于 if else 的效果,不建议将这个操作符运用的很复杂,这样会影响可读性。


⑨ 逗号表达式

exp1, exp2, exp3, … expN

其实就是用逗号隔开的表达式。
从左向右依次计算,逗号表达式的结果就是最后一个表达式的结果。
例:

    // 例1:int a = 1;int b = 2;int c = (a+=1,b+=2,b-a); //2
    //例2:int a = 2;int b = 0;if (a--,b += 2, a > 0)//逗号表达式{//处理}

一些代码也可以改写为逗号表达式。
将:

    //这个代码有点冗余a = get_val();count_val(a);while (a > 0){       //业务处理a = get_val();count_val(a);}

改写为:

while (a = get_val(), count_val(a), a>0)
{//业务处理
}

不仅代码的逻辑一样,而且还处理了代码冗余的问题。


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

[ ]    ()  .  ->

  • 📙 [ ] (下标引用)

操作数:一个数组名 + 一个索引值
例如,arr[5] 两个操作数分别为 arr 和 5 。

  • 📙( ) (函数调用)

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数(对于函数调用操作符来说,最少有1个操作数 )。

例如:ADD(3,2) 操作数有3个,一个是ADD,一个是参数 3 ,一个是参数 2 。test() 操作数有1个,只有 test。

注意:

  • 📙 . 和 -> (用于访问结构成员)

两个操作数的使用方式 :
.    结构体变量.成员名
->   结构体指针->成员名

例如:

struct Person
{char name[20];int age;
};
int main()
{struct Person s = { "张三",20 };printf("姓名:%s,年龄:%d\n", s.name, s.age);// 用 . 访问struct Person* p = &s;printf("姓名:%s,年龄:%d\n", p->name, p->age); //用-> 访问return 0;
}

❤️ 结语

文章到这里就结束了,如果对你有帮助,你的点赞将会是我的最大动力,如果大家有什么问题或者不同的见解,欢迎大家的留言~

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

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

相关文章

基于微信小程序的宠物领养平台的设计与实现(Java+spring boot+微信小程序+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的宠物领养平台的设计与实现&#xff08;Javaspring boot微信小程序MySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java…

RT-Thread 线程管理(学习一)

RT-Thread是支持多任务的操作系统&#xff0c;多任务通过多线程的方式实现。线程是任务的载体&#xff0c;也是RTT中最基本的调度单位。 线程执行时的运行环境称为上下文&#xff0c;具体来说就是各个变量和数据&#xff0c;包括所有的寄存器变量、堆栈、内存信息等。 特点 …

在大规模推荐系统中整合 ML 模型的经验教训

一、说明 在这篇博文中&#xff0c;我们分享了将 Netflix 大规模搜索和推荐系统的多个相关机器学习模型整合到一个统一模型中的系统设计经验。给定不同的推荐用例&#xff0c;许多推荐系统将每个用例视为单独的机器学习任务&#xff0c;并为每个任务训练定制的 ML 模型。相比之…

VBA Excel自定义函数的使用 简单的语法

一个简单的教程&#xff0c;实现VBA自定义函数。 新建模块 复制后面的代码放进来 函数的入口参数不定义&#xff0c;则认为是一块区域&#xff1b; 反之&#xff0c;如FindChar1 As String&#xff0c;则认为是输入的单值。 循环和分支如下例子&#xff0c;VB比较接近自然语…

IDEA 配置注释模板

目录 一、配置类模板注释 二、配置方法注释 一、配置类模板注释 打开IDEA&#xff0c;打开settings(快捷键&#xff1a;Ctrl Alt s)&#xff0c;选择Editor&#xff0c;找到File and Code Templates&#xff0c;设置需要配置注释的文件类型&#xff0c;如下图所示&#xf…

入门超值型32位单片机MM32G0001开发板

灵动微入门级超值型MM32G0001系列MCU。采用48MHz ArmCortex-M0内核&#xff0c;提供16KB Flash和2KB SRAM&#xff0c;并提供丰富的外设资源。适用于多种多样的入门级32位MCU市场&#xff0c;可覆盖广泛的8/16位MCU升级需求。MM32G0001在各种温度范围内的闪存擦写寿命与数据保存…

MySQL执行更新的流程

一、加载缓存数据 引擎要执行更新语句的时候 &#xff0c;比如对“id10”这一行数据&#xff0c;他其实会先将“id10”这一行数据看看是否在缓冲池里&#xff0c;如果不在的话&#xff0c;那么会直接从磁盘里加载到缓冲池里来&#xff0c;而且接着还会对这行记录加独占锁。 二…

MySQL数据库初体验

目录 一、数据库的基本概念 二、主流的数据库介绍 三、关系数据库与非关系数据库 1.关系数据库 一、数据库的基本概念 数据&#xff1a;描述事物的符号记录&#xff0c;包括数字、文字、图形、声音、档案记录等。以“记录的”形式按统一的格式进行存储 表&#xff1a;行(…

js判断类型:typeof Object.prototype.toString instanceof constructor有什么区别?一文讲清楚

相信很多小伙伴在使用js的过程中&#xff0c;经常会需要对js的数据类型进行判断&#xff0c;而js中可以对数据类型进行判断的方法有很多种&#xff0c;最常见的有typeof、Object.prototype.toString、instanceof、constructor这四种&#xff0c;那么他们有什么区别呢&#xff1…

软件测试之可靠性测试

CNAS标识 软件可靠性测试主要目的是通过在有使用代表性的环境中执行软件&#xff0c;以证实软件需求是否正确实现&#xff0c;为进行软件可靠性估计采集准确的数据&#xff0c;并找出所有对软件可靠性影响较大的错误。可靠性测试的特点是不同于硬件可靠性测试&#xff0c;主要…

最新Nmap入门技术

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 点击图片五折购书 Nmap详解 Nmap&#xff08;Network Mapper&#xff0c;网络映射器&#xff09;是一款开放源代码的网络探测和安全审核工具。它被设计用来快速扫…

KUKA机器人零点标定的具体方法

KUKA机器人零点标定的具体方法 在进行机器人校正时,先将各轴置于一个定义好的机械位置,即所谓的机械零点。这个机械零点位置表明了同轴的驱动角度之间的对应关系,它用一个测量刻槽表示。 为了精确地确定机器人某根轴的机械零点位置,一般应先找到其预校正位置,然后去掉测量…

64位ATT汇编语言调用自己编写的两个数相加函数,使用printf输出,发现报错Segmentation fault

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810&#xff0c;uname -r看到内核版本是3.10.0-957.el7.x86_64&#xff0c;gcc --version可以看到gcc版本是12.2.0&#xff0c;gdb --version可以看到gdb版本是12.1。 twoNumberPlus.s里边的内容如下&#x…

芯科科技宣布推出下一代暨第三代无线开发平台,打造更智能、更高效的物联网

第三代平台中的人工智能/机器学习引擎可将性能提升100倍以上 Simplicity Studio 6软件开发工具包通过新的开发环境将开发人员带向第三代平台 中国&#xff0c;北京 - 2023年8月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&…

提速换挡 | 至真科技用技术打破业务壁垒,助力出海破局增长

各个行业都在谈出海&#xff0c;但真正成功的又有多少&#xff1f; 李宁出海十年海外业务收入占比仅有1.3%&#xff0c;走出去战略基本失败。 京东出海业务磕磕绊绊&#xff0c;九年过去国际化业务至今在财报上都不配拥有姓名。 几百万砸出去买量&#xff0c;一点水花都没有…

小研究 - JVM 逃逸技术与 JRE 漏洞挖掘研究(一)

Java语言是最为流行的面向对象编程语言之一&#xff0c; Java运行时环境&#xff08;JRE&#xff09;拥有着非常大的用户群&#xff0c;其安全问题十分重要。近年来&#xff0c;由JRE漏洞引发的JVM逃逸攻击事件不断增多&#xff0c;对个人计算机安全造成了极大的威胁。研究JRE安…

如何使用Wireshark进行网络流量分析?

如何使用Wireshark进行网络流量分析。Wireshark是一款强大的网络协议分析工具&#xff0c;可以帮助我们深入了解网络通信和数据流动。 1. 什么是Wireshark&#xff1f; Wireshark是一个开源的网络协议分析工具&#xff0c;它可以捕获并分析网络数据包&#xff0c;帮助用户深入…

生成模型 -- GAN

文章目录 1. 生成模型与判别模型1.1 生成模型 2. VAE3. GAN3.1 GAN-生成对抗网络3.2 GAN-生成对抗网络的训练3.2.1 判别模型的训练&#xff1a;3.2.2 生成网络的训练&#xff1a; 4. LeakyReLU5. GAN代码实例 1. 生成模型与判别模型 生成模型与判别模型 我们前面几章主要介绍了…

ARM开发,stm32mp157a-A7核(UART总线实验)

1.目标&#xff1a;键盘输入一个字符a,串口工具显示b&#xff1b; 键盘输入一个字符串"nihao",串口工具显示"nihao"&#xff1b; 2.框图分析&#xff1a; 3.代码&#xff1a; ---.h头文件--- #ifndef __UART4_H__ #define __UART4_H__#include "st…

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于TSO-XGBoost金枪鱼算…