C语言入门篇——操作符篇

news2024/12/24 9:40:18

目录

1、操作符分类

2、操作符的属性

3、算术操作符

4、移位操作符

5、位操作符

6、赋值操作符

7、单目操作符

8、关系操作符

9、逻辑操作符

10、条件操作符

11、逗号操作符

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


1、操作符分类

算术操作符(+,-,*,/,%)

移位操作符(<<,>>)

位操作符(&,|,^)

赋值操作符(=,+=,-=,/=,*=,%=,<<=,>>=)

单目操作符(!,-,+,&,sizeof,~,--,++,*,(类型))

关系操作符(>,>=,<,<=,!=,==)

逻辑操作符(&&,||)

条件操作符(exp1?exp2:exp3)

逗号表达式(exp1,exp2,exp3,-expN)

下标引用、函数调用和结构成员([],(),->)

2、操作符的属性

复杂表达式的求值有三个影响的因素:

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序

两个相邻的操作符先执行哪一个?取决于它们的优先级。如果两者的优先级相同,取决于它们的结合性

操作符优先级
操作符描述用用法示例结果类型结合性是否控制求值顺序
()聚组(表达式)与表达式相同N/A
()函数调用rexp(rexp,...,rexp)rexpL-R
[]下标引用rexp[rexp]lexpL-R
.访问结构成员lexp.member_namelexpL-R
.>访问结构指针成员rexp->member_namelexpL-R
++后缀自增lexp ++rexpL-R
--后缀自减lexp --rexpL-R
逻辑反! rexprexpR-L
~按位取反~ rexprexpR-L
+单目,表示正值+ rexprexpR-L
-单目,表示负值- rexprexpR-L
++前缀自增++ lexprexpR-L
--前缀自减-- lexprexpR-L
*间接访问* rexplexpR-L
&取地址& lexprexpR-L
sizeof取其长度,以字节 表示sizeof rexp sizeof(类型)rexpR-L
(类型)类型转换(类型) rexprexpR-L
*乘法rexp * rexprexpL-R
/除法rexp / rexprexpL-R
%整数取余rexp % rexprexpL-R
+加法rexp + rexprexpL-R
-减法rexp - rexprexpL-R
<<左移位rexp << rexprexpL-R
>>右移位rexp >> rexprexpL-R
>大于rexp > rexprexpL-R
>=大于等于rexp >= rexprexpL-R
<小于rexp < rexprexpL-R
<=小于等于rexp <= rexprexpL-R
==等于rexp == rexprexpL-R
!=不等于rexp != rexprexpL-R
&位与rexp & rexprexpL-R
^位异或rexp ^ rexprexpL-R
|位或rexp | rexprexpL-R
&&逻辑与rexp && rexprexpL-R
||逻辑或rexp || rexprexpL-R
?:条件操作符rexp ? rexp : rexprexpN/A
=赋值lexp = rexprexpR-L
+=以...加lexp += rexprexpR-L
-=以...减lexp -= rexprexpR-L
*=以...乘lexp *= rexprexpR-L
/=以...除lexp /= rexprexpR-L
%=以...取模lexp %= rexprexpR-L
<<=以...左移lexp <<= rexprexpR-L
>>=以...右移lexp >>= rexprexpR-L
&=以...与lexp &= rexprexpR-L
^=以...异或lexp ^= rexprexpR-L
|=以...或lexp |= rexprexpR-L
,以...或rexp,rexprexpL-R

3、算术操作符

算数操作符有+,-,*,/,%

加法运算符用于加法运算,使其两侧的值相加。相加的值(运算对象)可以是变量,也可以是常量

sum = num1 + num2

计算机会查看加法运算符右侧的两个变量,把它们相加,然后把和赋给变量sum

sum,num1,num2都是可修改的左值,每个变量都标识了一个可被赋值的数据对象。

但是表达式num1+num2是一个右值

减法运算符用于减法运算,使其左侧的数减去右侧的数,+和-运算符被称为二元运算符,这些运算符需要两个运算对象才能完成操作。

但+和-也能作为符号运算符,减号可用于标明或改变一个值的代数符号。

a = -100;

b = -a;

以这种形式使用的负号被称为一元运算符,一元运算符只需要一个运算对象,C90标准添加了一元+运算符,它不会改变运算对象的值或符号。

乘法运算符用*号来表示,使其两侧的值相乘。相乘的值(运算对象)可以是变量,也可以是常量

除法运算符用/号来表示,/左侧的值是被除数,右侧的值是除数。有着整数除法和浮点数除法,整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。在C语言中,整数除法结果的小数部分被丢弃,在一过程被称为截断。

当/操作符的两个操作符都为整数,执行整数除法;而只要有浮点数执行的就是浮点数除法。

求模运算符用%号来表示,求模运算符用于整数计算。求模运算符给出其左侧整数除以右侧整数的余数。求模运算符的两个操作数必须位整数,返回的是整除之后余数,不能用于浮点数。

4、移位操作符

移位运算符有左移运算符(<<)和右移运算符(>>)。用二进制数做案例。

左移运算符(<<)将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。左侧运算对象移出左末尾段位的值丢失,用0填充空出的位置。

(0000 0001)<< 2        //表达式

(0000 0100)                //结果值

 右移运算符(>>)将左侧运算对象每一位的值向右移动其右侧对象指定的位数。左侧运算对象移出右末端位的值。对于无符号类型,用0填充空出的位置(逻辑移位);对于有符号类型,其结果取决于机器,空出的位置可用0填充,或者用符号位(最左端的位)的副本填充(算术右移)。

移位运算符针对2的幂提供快速有效的乘法和除法:

number << n        number乘于2的n次幂

number >> n        如果number为非负,则用number除以2的n次幂

移位运算符还可用于从较大单元中提取一些位

5、位操作符

位运算符有按位取反~,按位与&,按位或|,按位异或^

都是作用于整形数据,包括char。之所以叫位运算符,是因为整型操作都是针对每一个位进行,不影响它左右两边的位。

一元运算符~把1变为0,把0变为1。

~(1001 1010)  --- 》 (0110 0101)

二元运算符&通过逐位比较两个运算对象,生成一个新值。对于每个位,只有两个运算对象中响应的位都为1时,结果才为1(从真/假方面看,只有当两个位为都为真时,结果才为真)

(1001 0011) & (0011 1101) --- 》 (0001 0001 )

二元运算符|,通过逐位比较两个运算对象,生成一个新值。对于每个 位,如果两个运算对象中相应的位为1,结果就为1(从真/假方面看,如果两个运算对象中相应的一个位为真或两个位都为真,那么结果为真)。

(1001 0011) | (0011 1101) ---》 (1011 1111)

二元运算符^逐位比较两个运算对象。对于每个位,如果两个运算对象 中相应的位一个为1(但不是两个为1),结果为1(从真/假方面看,如果两 个运算对象中相应的一个位为真且不是两个为同为1,那么结果为真)。

(1001 0011) ^ (0011 1101) ---》 (1010 1110)

一道有趣的面试题:不能利用临时变量,如何实现两个数的交换,读者可以想想有哪几种方法?

6、赋值操作符

赋值运算符可以给自己定义的变量重新赋值,例如:

int score = 60;

score = 99;

赋值运算符可以和前面的算术运算符,位运算符,移位运算符组成复合赋值符,这是C语言语法所允许的。

赋值运算符允许连续使用,例如:

a = b = c + 1;

7、单目操作符

单目操作符包括!,~,+,-,&,sizeof,--,++,*,(类型)

这里就不介绍!,~,+,-,前面或后面已经有介绍了,这里主要介绍其他几个。

这里的&可不是按位与&,而是取地址符&,取地址符就是获取当前变量的内存地址,想要获得那个变量的地址,就用&后面跟上那个变量。&后只能跟变量,不能跟常量,因为常量是一个立即数,不是容器,没有地址。

前面就提到过sizeof一嘴,这里再对sizeof进行进一步了解,sizeof运算符以字节为单位返回运算对象的大小(在C中,1字节定义为char类型占用的空间大小。过去,1字节通常是8位,但是一些字符集可能使用更大的字节)。运算对象可 以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如, float),则必须用圆括号将其括起来。

C 语言规定,sizeof 返回 size_t 类型的值。这是一个无符号整数类型, 但它不是新类型。C有一个 typedef机制(后面再介绍),允许程序员为现有类型创建别名。

++和--,递增运算符和递减运算符,执行简单的任务,将其运算对象递增(减)1,该类运算符以两种形式出现。第1种方式,++出现在其作用的变量前面, 这是前缀模式;第2种方式,++出现在其作用的变量后面,这是后缀模式。 两种模式的区别在于递增行为发生的时间不同。下面用一些例子来仔细地查看两者地区别:

num1后缀递加是原来的值,num2前缀递加是原来的值+1,当我们再次打印num1的值的时候,发现num1的值实际上是加1了,这里就是前缀和后缀的区别了,前缀++先加1再赋值,后缀++先赋值再加1。初学者有可能在这里会陷入混乱。但是提供一个记忆方法:

 “前缀++处于前,所以理应先++后赋值;后缀++处于后,所以理应先赋值后++”

前缀加加和后缀加加除了上面的区别,还有着操作符优先级的优先关系,后缀比前缀的优先级要高,这是要牢记的!

间接访问操作符,通过一个指针访问它所指向的地址的过程称为间接访问或解引用指针。这个用于执行间接访问的操作符是单目操作符*。当我们定义了一个指针变量的时候,当我们使用*得到的值就是该指针变量指向地址的变量的值。

在C语言中,类型之间的转换是允许的。而(类型)就是其中一种,被称为强制类型转换。

强制转发语法:

目标类型 变量名 = (目标类型)源变量名

可以把高类型数据转换为低类型数据,虽然有可能存在隐患,但实际上是可以转换的,高数据类型转换为低数据类型会产生丢失

低数据类型到高数据类型排序如下:

char -> short -> int -> long(unsigned char -> unsigned short -> unsigned int -> unsigned long

8、关系操作符

关系操作符包括>,>=,<,<=,!=,==

就跟数学里的比较一样,但是要记住一点不能使用数学思维去写判断,下面用一个案例来说明原因:

 一些初学者可能会写出类似的判断语句,但是结果却不如意,因为当执行完第一个关系运算符之后会返回真(1)或者假(0),此时进行第二个关系运算符运算的时候,结果很有可能和实际的结果不一样,在这种多个比较之间需要用到逻辑操作符(&&,||)

9、逻辑操作符

逻辑操作符有逻辑与&&,逻辑或||和逻辑非!

3种逻辑运算符
逻辑运算符含义
&&
||

逻辑运算符两侧的条件必须都为真,整个表达式才为真。逻辑运算符的优先级比关系运算符低,所以不必在子表达式两侧加圆括号。

假设exp1和exp2是两个简单的关系表达式(如a > b或c == 1000),那么:

当且仅当exp1和exp2都为真时,exp1 && exp2才为真;

如果exp1或exp2为真,则exp1 || exp2为真;

如果exp1为假,则!exp1为真;如果exp1为真,则!exp1为假。

同时需要记得一点,逻辑运算符是执行短路求值的,何为短路求值?

在逻辑与&&中,当第一个判断条件为假的时候直接结束,不对第二个判断条件进行判断;在逻辑或||中,当第一个判断条件为真的时候直接结束,不对第二个判断条件进行判断。

10、条件操作符

C提供条件表达式(conditional expression)作为表达if else语句的一种 便捷方式,该表达式使用?:条件运算符。该运算符分为两部分,需要 3 个运算对象。

条件运算符是C语言中唯一的三元运算符。条件操作符的格式:expr1?expr2:expr3

如果 expr1 为真(非 0),那么整个条件表达式的值与 expr2 的值相同;如果expr1为假(0),那么整个条件表达式的值与 expr3的值相同。

但是条件操作符也是一个有趣的操作符,看下面这段代码:

int main(void)
{
	int a = 10, b = 20;
	int c = 0;

	c = (a > b ? a : b);

	printf("a=%d,b=%d,c=%d\n", a, b, c);    //运行之后发现c的值和a的值一样

	return 0;
}

运行之后发现c的值和a的值是一样的,条件操作符返回的是一个变量,可以赋值。

11、逗号操作符

表达式说明:

表达式1,表达式2,表达式3,...... ,表达式n

逗号表达式的要领:
(1) 逗号表达式的运算过程为:从左往右逐个计算表达式。
(2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。
(3) 逗号运算符的优先级别在所有运算符中最低。

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

[]下标引用操作符

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

下标引用操作符允许对数组单个元素直接赋值

()函数调用操作符

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

访问一个结构的成员

. 结构体.成员名

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

当我们通过访问结构体变量访问成员变量的时候,我们直接使用直接访问符(.),当我们通过访问结构体指针访问成员变量的时候,我们使用简洁访问(->)。

通过一个案例来展示一下:

 

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

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

相关文章

办公必备!不再被格式问题困扰,轻松搞定文档转换!

大家平时在工作中会需要将文档转换为其他格式吗&#xff1f; 日常工作中&#xff0c;经常碰到需要文件格式转换的情况&#xff0c;对于掌握了一些转换技能的朋友说&#xff0c;文件格式转换自然不在话下 对于不熟练的朋友来说&#xff0c;想要轻松转换文件格式&#xff0c;就…

c++ std::enable_shared_from_this作用

enable_shared_from_this 是什么 std::enable_shared_from_this 是一个类模板&#xff0c;用来返回指向当前对象的shared_ptr智能指针。在说明它的作用前我们可以看一下如下代码&#xff1a; demo.cpp #include <memory> #include <iostream>class A { public:A…

web实验(3)

应用JavaScript编写留言的功能&#xff0c;在文本中输入文字提交后&#xff0c;在下方进行显示。 提示&#xff1a;可将下方内容以列表体现&#xff0c;提交时动态创建列表的项。可使用以下两种方式之一的方法&#xff1a; 使用CreateElenment动态创建li标签及li中的文本 在列…

PADS-LOGIC项目原理图设计

最小板原理图设计 目录 1 菜单与工具使用 2 常用设置 2.1选项卡 2.2 图纸设置 2.3 颜色设置 3 设计技巧 3.1 模块化设计思路 3.2 元件放置 3.3 走线及连接符 4 原理图绘制 4.1 POWER原理图设计 4.2 MCU原理图设计 4.2.1晶振电路 4.2.2复位电路 4.2.3 BOOT电路 …

Windows 11快捷键功能大全 28个Windows 11快捷键功能介绍

Windows 11快捷键功能大全 28个Windows 11快捷键功能介绍 1. WinA 打开快速设置面板2. WinB 快速跳转系统托盘3. WinC 打开Microsoft Teams4. WinD 快速显示桌面5. WinE 打开资源管理器6. WinF 一键提交反馈7. WinG 启动Xbox Game Bar8. WinH 语音听写9. WinI 打开设置10. WinK…

如何正确高效地学习android开发?

每一个能成为行业大佬的人&#xff0c;一定有自己独特的方法… 之所以能成为大佬&#xff0c;是因为他们会有自己独特的见解&#xff0c;在一次次的尝试中不断否定&#xff0c;然后一次次的确定&#xff0c;一个程序员想要精益求精&#xff0c;必须要有高效的学习方法和良好的…

Spring Cloud Alibaba基于Sentinel实现限流降级自定义配置结果

hello&#xff0c;你好呀&#xff0c;我是灰小猿&#xff0c;一个超会写bug的程序员&#xff01; sentinel作为SpringCloudAlibaba的基本组件&#xff0c;在进行熔断、限流、降级等方面具有十分重要的作用&#xff0c;而且其基于Web界面对接口进行限流配置&#xff0c;使得实时…

环形链表II(链表篇)

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…

伪原创文章生成器-伪原创工具在线使用

文章伪原创工具 在如今数字时代&#xff0c;内容创作已经成为了一项必不可少的营销策略。然而&#xff0c;创作原创内容需要相当的时间和精力&#xff0c;尤其是对于需要大量输出内容的企业或个人而言。这时&#xff0c;文章伪原创工具就成为了一种快速、高效的选项。在本文中…

Doris(15):物化视图

1 概念 物化视图是将预先计算&#xff08;根据定义好的 SELECT 语句&#xff09;好的数据集&#xff0c;存储在 Doris 中的一个特殊的表。 物化视图的出现主要是为了满足用户&#xff0c;既能对原始明细数据的任意维度分析&#xff0c;也能快速的对固定维度进行分析查询。 首…

【C++】布尔类型(bool)

目录​​​​​​​ 1、缘起 2、笔记整理 4、用法 4.1、布尔变量的定义和初始化 4.2、布尔类型的运算符 4.3、布尔类型的条件语句 4.4、布尔类型的循环语句 5、总结 1、缘起 最近在 BiliBili 黑马程序员学习 C 编程语言&#xff0c;今天学习到了 布尔&#xff08;b…

算法套路十二——回溯法之排列型回溯

算法套路十二——回溯法之排列型回溯 该节是在第十节回溯法之子集型回溯的基础上进行描写&#xff0c;组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求&#xff0c; 故请首先阅读第十节算法套路十——回溯法之子集型回溯 算法示例一&#xff1a;LeetCode46. 全…

windows环境安装tensorflow-gpu-2.10.1

Tensorflow 2.10是最后一个在本地windows上支持GPU的版本 1. 通过.whl文件方式安装2.创建anaconda虚拟环境3.安装对应的cuda与cudnn版本&#xff0c;local不必装cuda和cudnn4. 测试tensorflow gpu是否可用 1. 通过.whl文件方式安装 .whl文件的下载地址&#xff1a; tensorflow…

Linux — 线程概念和线程控制

目录 一、 线程的概念 什么是线程&#xff1f; 线程的优点 线程的缺点 线程异常 线程用途 二、线程的控制 创建线程 pthread_create函数 线程终止 pthread_exit函数 pthread_cancel函数 线程等待 pthread_join函数 分离线程 一、 线程的概念 之前的文章说过每个进程有…

IDE后端启动JetLinks 物联网基础平台(2.x)

目录 一、官网 二、文档中心 三、下载源码 四、安装依赖 五、IDE配置 六、修改配置文件&#xff1a;jetlinks-standalone/src/main/resources/application.yml 七、启动项目&#xff08;项目会自动建表&#xff09; 一、官网 JetLinkshttps://www.jetlinks.cn/#/ 二、…

率先实现One-box量产后,这家厂商重磅发布智能底盘“三步走”战略

率先实现One-box和Two-box产品量产之后&#xff0c;利氪科技向业界发布了重要的产品布局规划及进展。 在4月18日开幕的上海国际车展上&#xff0c;利氪科技重磅发布了全新的智能化线控底盘产品矩阵&#xff0c;同时发布了智能底盘“三步走”计划。据了解&#xff0c;利氪科技将…

数据结构(五)—— 栈与队列

文章目录 前言一、基础1.1 stack1.2 queue 二、题2.1 232 用栈实现队列2.2 225 用队列实现栈2.3 20 有效的括号2.4 1047 删除字符串中的所有相邻重复项 前言 灵魂四问&#xff1a; 1、C中stack&#xff0c;queue 是容器么&#xff1f; 答&#xff1a;不是&#xff0c;而是容器…

高数基础3

目录 极限的概念&#xff0c;性质以及存在准则 求极限的方法 ​编辑 常用的基本极限 1的无穷次方常用的结论 例题&#xff1a; 方法2&#xff1a;利用等价无穷小代换求极限 例题&#xff1a; 常用的等价无穷小 利用有理运算法则求极限 例题 极限的概念&#xff0c;性质以…

【C语言】函数讲解(上)

【C语言】函数讲解&#xff08;上&#xff09; 1.函数是什么2.C语言中函数的分类2.1库函数2.1.1如何学会使用库函数 2.2.自定义函数 3.函数的参数3.1实际参数&#xff08;实参&#xff09;3.2形式参数&#xff08;形参&#xff09; 4.函数调用4.1传值调用4.2传址调用4.3练习 所…

Redis分布式锁实现方案

一、什么是分布式锁&#xff0c;与本地锁有什么区别 本地锁&#xff1a; 解决同一进程内多个线程操作同一资源的问题。 分布式锁&#xff1a; 解决多个进程同时操作同一资源的问题。 二、Redis的SETNX Redis之所以能实现分布式锁&#xff0c;得益于Redis的单线程处理模式&am…