【c语言】-- 操作符汇总(万字详解)

news2025/1/8 4:34:24

📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。

c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。

本章来学习操作符。

让我们开启c语言学习之旅吧

温馨提示:这篇文章干货非常多,感兴趣小伙伴一定要认真看完哦,越到后面越精彩。

目录

1.操作符分类

2.算术操作符

​​​​​​  3.移位操作符       

3.1右移操作符

3.2左移操作符

4.位操作符 

4.1按位与

​编辑

  

4.2按位或

 4.3 按位异或

5.赋值操作符

6.单目操作符 

6.1单目操作符介绍

  6.2详细介绍,前置(+ +,- -), 后置(+ +,- -)

6.3强制类型转换

7.关系操作符

8.逻辑操作符

9.条件操作符

10.逗号表达式 

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

1. [  ] 下标引用操作符

2.( )函数调用操作符

3.访问一个结构的成员

12.表达式求值

12.1隐式类型转换

12.2 算术转换

 12.3 操作符的属性

结语


1.操作符分类

算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用.函数调用和结构成员

本章就是围绕这些操作符来展开讲解。

2.算术操作符

+        -        *        /        % 

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

例如:

 注意:想要得到浮点数,两个操作数必须有一个为浮点数

​​​​​​  3.移位操作符       

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

移位操作符移动的是二进制(如果是负整数移动的是补码)

补码的详细讲解请看这篇文章:http://t.csdn.cn/GQF16

3.1右移操作符

#include <stdio.h>
int main()
{
	int a = 15;
	int b = a >> 1;
	return 0;
}

整个移位的操作是怎样完成的呢?结果又是怎样的呢?

请看图分析

移动规则:

首先右移运算分两种:

1.逻辑移位

   左边用零填充,右边丢弃

2.算术移位

   左边用该值的符号位填充,右边丢弃 

注:在c语言中没有明确规定是采用算术右移还是逻辑右移,一般编译器上采用的是算术右移 

上面这个问题是不能说明是算术右移还是逻辑右移

算术右移VS逻辑右移

3.2左移操作符

移动规则:左边丢弃,右边补0

警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:

int num = 10;
num>>-1;//error

4.位操作符 

位操作符

&   按位与
|     按位或
^    按位异或
注:他们的操作数必须是整数。


4.1按位与

规则:对应的二进制位有0为0,两个同时为1则为1

 程序分析

  


4.2按位或

   规则:对应的二进制位有1则为1,两个同时为0才是0

程序分析


 4.3 按位异或

   规则:对应的二进制位相同为0,相异为1

程序分析


来一道变态的面试题

不能创建临时变量(第三个变量),实现两个数的交换。

#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}

分享一下我的理解方法吧

在这个过程中他是没有进位的,所以根本不会产生数据溢出

5.赋值操作符

     赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。


赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?


那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。

符合赋值符

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

这些操作符该怎么用呢?

比如:

int x=10;
x=x+10;
可以写成
x+=10;

其他的运算符也是一样的道理,可以这样写更加简洁

6.单目操作符 

6.1单目操作符介绍

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

 单目操作符只有一个操作数。

注:sizeof不是函数,是一个操作符,是用来计算创建类型变量的大小,单位是字节。

  6.2详细介绍,前置(+ +,- -), 后置(+ +,- -)

这两个操作符在我们的程序中应用非常多,也非常容易出错。

我们用几个例子来介绍这两操作符

#include <stdio.h>
int main()
{
	int a = 1;
	int b = a++;   //计算规则:b=a,a=a+1
	printf("a=%d b=%d", a, b);
	return 0;
}

运行结果:a=2,b=1;

注:后置++,先使用,后++(后置- -同理)

#include <stdio.h>
int main()
{
	int a = 1;
	int b = ++a;   //计算规则:a=a+1,b=a
	printf("a=%d b=%d", a, b);
	return 0;
}

运行结果:a=2,b=2;

注:前置++,先++,后使用(前置- -同理)

6.3强制类型转换

C语言中的强制类型转换(Type Casting)是指将一个数据类型的值转换为另一个数据类型。有时候我们需要将一个表达式中的值转换成另一种数据类型,这种转换就称为强制类型转换。

 使用规则

#include <stdio.h>
int main()
{
	int a = (int)3.14;
	return 0;
}

把一个浮点型强制转换成整形

需要注意的是,强制类型转换可能会导致数据精度的损失或溢出

7.关系操作符

关系操作符就是用来比较关系的

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

这些关系运算符比较简单,但是在使用的时候要注意一些陷阱

警告:

在编程的过程中== 和=不小心写错,导致的错误。

8.逻辑操作符

逻辑操作符

&&(并且)   逻辑与
|| (或者)   逻辑或

两个同时满足(并且)

只要一个满足(或者) 

逻辑与和或的特点:

#include <stdio.h>
int main()
{
  int i = 0,a=0,b=2,c =3,d=4;
  i = a++ && ++b && d++;  结果为1,2,3,4


  i = a++||++b||d++;  结果为1,2,3,4
  printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
  return 0;
}

注:&&操作符左边为假,右边不再计算。

        ||操作符左边为真,右边不再计算。

 结果为真用1表示,结果为假用0表示。

9.条件操作符

条件操作符也称三目操作符(有三个操作数)

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

表达式1成立,执行表达式2,不执行表达式3。

表达式1不成立,不执行表达式2,执行表达式3.

使用方法:比如说我们要求两个数的最大值

你会发现这个表达式等价于if语言,完全可以把它转换成if语句的。

10.逗号表达式 

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

exp1, exp2, exp3, …expN

就像这么一个代码

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?

c的结果是13,从左往右依次计算,最后把b=a+1的结果赋值给c。

注意:一定要从左往右计算,因为左边表达式的结果,会影响右边表达式的结果。 

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

1. [  ] 下标引用操作符

操作数:一个数组名 + 一个索引值

例如:

int  arr [10] ;     //创建数组

arr [9] = 10;      //实用下标引用操作符

[ ] 的两个操作数是arr和9。

2.( )函数调用操作符

接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

例如:

#include <stdio.h>
int main()
{
	int len = strlen("abc");   这个( )就是函数调用操作符 
	printf("%d", len);         操作数是:strlen  "abc"
	return 0;
}

函数调用操作符的操作数是:函数名 + 函数的参数 

3.访问一个结构的成员

 .   结构体 . 成员名
->  结构体指针 -> 成员名

结构体是一种自定义类型

#include <stdio.h>
struct Book
{
	char name[30];      //结构体成员
	char author[20];
	float price;
};
int main()
{
	struct Book b1 = {"c语言","小王",66.8f};  //结构体变量  
	struct Book b2 = {"数据结构","小李",88.8f};  //定义了一本书
	printf("%s %s %f\n", b1.name, b1.author, b1.price);   //结构体成员访问
	printf("%s %s %f\n", b2.name, b2.author, b2.price);
	return 0;
}

 操作数:结构体变量 . 成员名

#include <stdio.h>
struct Book
{
	char name[30];      //结构体成员
	char author[20];
	float price;
};
void print(struct Book * p)
{
	printf("%s %s %.1f\n", p->name,p->author,p->price);   //结构体成员访问
}
int main()
{
	struct Book b1 = { "c语言","小王",66.8f };  //结构体变量  定义了一本书
	print(&b1);
	return 0;
}

这样也能实现相同的效果

操作数:结构体指针 -> 成员名

12.表达式求值

表达式求值的顺序一部分是由操作符的优先级结合性决定的。

有些表达式的操作数在求值的过程中可能需要转换为其他类型。

12.1隐式类型转换

c的整型算术运算总是至少以缺省整型类型的精度来进行的。

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型,这种转换称为整型提升

整型提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。


因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。


通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。

 实例

#include <stdio.h>
int main()
{
	char c1 = 5;
	char c2 = 127;
	char c3 = c1 + c2;
	printf("%d\n\n ", c3);
	return 0;
}

这个代码如何进行整形提升呢?

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

char c1 = 5

变量c1的二进制位(补码)中只有8个比特位:

00000101  -  c1里面放的值

因为 char  为无符号的  char

所以整形提升的时候,高位补充符号位,即为0

00000000000000000000000000000101   -  整形提升和的结果

char c2 = 127

变量c1的二进制位(补码)中只有8个比特位:

011111111    - c2里面放的值

因为  char  为无符号的  char

所以整形提升的时候,高位补充符号位,即为0

000000000000000000000000011111111    -  整形提升和的结果

char c3 = c1+c2;

00000000000000000000000000000101    - c1

000000000000000000000000011111111    - c2

00000000000000000000000010000100    - c1+c2的结果

10000100    -   c3(截断)

以%d的形式打印  (%d是10进制的形式打印有符号的整数)

打印的是整型,c3是char类型,又要发生整形提升

因为  char  为有符号的  char

所以整形提升的时候,高位补充符号位,即为1

11111111111111111111111110000100    -  提升后的结果(补码)

11111111111111111111111110000011     -  反码

10000000000000000000001111100     -   原码   (这就是最终的结果啦) 

所以这个程序的运行结果是:- 124.

12.2 算术转换

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

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

警告:
但是算术转换要合理,要不然会有一些潜在的问题。

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

 12.3 操作符的属性

复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。


结语

如果给篇文章对大家有帮助,希望大家点一个免费的赞作为鼓励。

谢谢大家!!!!

制作不易,如果有疑问评论区见。

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

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

相关文章

【正点原子STM32连载】第四十章 红外遥控实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…

管理类联考——逻辑——知识篇——形式逻辑——二、性质模态——haimian

性质 考点分析 定义分类 思维导图 模态 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量112 定义分类 断定事物发生可能性的命题就是模态命题。 按照可能性的高低&#xff0c;我们可以将模态命题分为如下几类&#xff1a; ①必然发…

Android12 设置系统默认不休眠-迅为RK3588开发板

修改文件&#xff1a; device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults. xml 文件&#xff0c;如下图所示&#xff1a; - 60000 0x7fffffff 更多详情 公众Hao/B站&#xff1a;迅为电子

MFC第九天 CRect类的封装和窗口坐标系转换及获取窗口ID 以及对CTime类与COleDateTime类简介

文章目录 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介CRect类的封装窗口坐标系转换及获取窗口IDCTime类与COleDateTime类简介关于设置日期控件上的时间问题 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介 CRect类的…

300黑客共闯沙盒|赛宁数字化靶场助力第十六届全国大学生信息安全竞赛

6月24日&#xff0c;由中央网信办网络安全协调局指导、教育部高等学校网络空间安全专业教学指导委员会主办、福州大学承办的第十六届全国大学生信息安全竞赛—创新实践能力赛华东南分区选拔赛&#xff08;简称“分区赛”&#xff09;圆满结束。赛宁网安基于数字化靶场打造的“赛…

3、数仓之采集工具MaxWell(MaxWell简介、MaxWell原理、MaxWell部署、MaxWell使用)

1、Maxw简介 1.1 MaxWell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数…

100页干货!一文看懂10+行业领域发展趋势

导读&#xff1a; 当前全球经济环境及疫情的变化&#xff0c;使得中国各行业的发展呈现向好趋势&#xff0c;但市场仍充满诸多不确定性。 在今年伊始&#xff0c;罗兰贝格重磅发布了《“预见2023”中国行业趋势报告》&#xff08;文中简称《报告》&#xff09;&#xff0c;囊…

学生台灯怎么选对眼睛好的?看完再买不踩坑!

我们都知道&#xff0c;对眼睛最好的光就是自然的太阳光&#xff0c;但并不是每时每刻都能享受到太阳光般的光源&#xff0c;所以现在有很多台灯的出现&#xff0c;而护眼台灯是对眼睛最好的&#xff0c;不过护眼台灯的挑选也有一些需要注意的细节&#xff01; 1、全光谱&#…

Lancet Microbe -- 新冠轻症者可能是“超级传播者”

一项对有意感染SARS-CoV-2的人群的研究提供了关于病毒传播的丰富见解&#xff0c;比如&#xff0c;某些特定人群是“超级传播者”&#xff0c;他们向空气中释放的病毒远比其他人多。 该论文描述了一项具有争议的“挑战性研究”的数据&#xff0c;在这项研究中&#xff0c;科学家…

Sangfor华东天勇战队:AspectJWeaver反序列化利用链

依赖&#xff1a; <dependencies><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency> </dependencies>测试类&#xff1a; import java…

基于Matlab实现SVM算法的手写字体识别(附上完整仿真源码+数据 )

手写字体识别是一个重要的人工智能应用领域。在本文中&#xff0c;我们将展示如何使用MATLAB实现手写数字的识别。 首先&#xff0c;我们需要准备一个手写数字数据集。在本文中&#xff0c;我们将使用MNIST数据集&#xff0c;这是一个广泛使用的手写数字数据集&#xff0c;包含…

界面组件DevExpress WinForm v23.1新版亮点 - 皮肤矢量图标全新升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

【机器学习】正则化对过拟合和欠拟合的影响

模型过拟合和欠拟合的图像特征 偏差大表示欠拟合&#xff0c;而方差大表示过拟合&#xff0c;我们这一节再深入探讨下过拟合和欠拟合问题。一个经典的图如下&#xff1a; 其中d1为欠拟合&#xff0c;d4为过拟合&#xff0c;而d2则刚刚好。回顾下刚刚说的使用训练集和交叉验证…

JavaScript知识点DOM 模型详细讲解

DOM 模型 DOM 全称是 Document Object Model 文档对象模型 大白话&#xff0c;就是把文档中的标签&#xff0c;属性&#xff0c;文本&#xff0c;转换成为对象来管理。 Document 对象 Document对象的理解&#xff1a; ​ 第一点&#xff1a;Document 它管理了所有的 HTML 文…

三次登录验证和验证码功能实现

三次登录验证和验证码功能实现 最近手头上的事忙的差不多了&#xff0c;就想着自己写写小demo玩一下&#xff0c;结果突然看到我们旧系统的登录好像有点拉胯&#xff0c;然后就自己写了个小demo&#xff0c;指不定哪天就用上了呢 一、pom文件 首先当然是pom文件啦&#xff0…

【JS】1724- 重学 JavaScript API - Drag and Drop API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API 8. WebStorage API 9. WebSockets API 10. Fullscreen API 11. Geolocation API ❞ &#x1f3dd; 1. 快速…

ThinkPHP6.0 数据迁移工具 migration 入门使用教程

文章目录 安装数据库迁移工具创建迁移文件执行迁移回滚参考资料 开始前需要做好的准备工作&#xff1a; 搭建好 PHP 开发环境&#xff08;推荐 phpstudy&#xff0c;PHP>7.2.5&#xff0c;MySql5.7.x&#xff09;。安装好 ThinkPHP6.0&#xff0c;并做配置可正常连接到 MySq…

docker安装nginx,发布部署vue项目

场景 前后端项目&#xff0c;实现前后端简单部署到服务器。前端vue&#xff0c;后端springboot。服务器ubuntu&#xff08;18.04&#xff09;<linux系统同理>. 后端通过(nohup java -jar xxx.jar &) 指令简单部署。该文主要说明部署前端vue项目。 部署vue需要安装ng…

一文看懂51单片机和stm32区别,怎么用怎么学怎么选

一文看懂51单片机和stm32区别&#xff0c;怎么用怎么学怎么选 对于初学单片机的童鞋而言&#xff0c;开始会有这样的疑问&#xff1f;到底选哪个怎么选呢&#xff1f; 1、工业控制51优于stm&#xff1f; 2、没区别,51就是个入门级,不过也有贵的,我用的就是51,用的还可以&…

PG系列4:linux下编译安装PG15

文章目录 一. 源码安装1.1 下载并解压1.2 安装依赖包1.3 开始编译安装1.4 创建用户1.5 创建目录及修改权限1.6 设置环境变量1.7 初始化数据库1.8 启动和关闭数据库 二. 验证2.1 查看数据库后台进程2.2 验证和登陆数据库2.3 查看数据库版本2.4 查看数据库运行状态2.5 修改白名单…