一篇搞定C语言操作符(详解含示例)

news2024/10/7 6:41:54

目录

一.操作符是什么?

基本特征

语义

优先级

结合性

二.操作符的分类

三.操作符各类详解

1.算数操作符(+     -     *     /     %)

(1)优先级:

(2)除法操作符(/)的计算规则及注意事项

(3)取余操作符(%)的计算规则

(4)算术操作符示例代码

2.移位操作符(>>   <<)

(1)优先级:

(2)计算规则及注意事项

(3)移位操作符示例代码

3. 位操作符(&  ^  |)

 (1)优先级

(2)计算规则及注意事项

(3)面试例题

(4)位操作符示例代码

4.赋值操作符( =   +=   -=    *=   /=   %=  ………)

(1)优先级(赋值操作符的优先级都很低)

 (2)运算规则

(3)赋值操作符示例代码

5.单目操作符

(1)单目操作符的介绍

(2)单目操作符有哪些?

(3)sizeof和数组

(4)sizeof与数组示例代码:

6.关系操作符(<    >    <=    >=)

(1)优先级

 (2)关系操作符的介绍

(3)运算结果值

(4)注意事项

(5)示例代码

7.逻辑操作符(&&   ||)

(1)什么是逻辑操作符?

(2)优先级

(3)计算规则

(4)计算机在计算时的特点:

(4)例题

8.条件操作符(  :    ?  )

(1)优先级

(2)运算规则:

(3)代码示例

9.逗号表达式(   ,  )  

(1)优先级

(2)逗号表达式的介绍及运算规则

例题:

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

(1)优先级

(2)下标引用操作符( [ ])

(3)函数调用操作符(  ( ) )

(4)结构体成员访问操作符(  ->     .  )

四.操作符优先级表(含记忆规律)

1.运算符优先级和结合性一览表

2.表中规律:


一.操作符是什么?

指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。

基本特征

语义

每个操作符都有自己的语义,具体取决于它所操作的类型。 

优先级

每个操作符都有优先级。 

结合性

每个操作符都有结合性。  操作符的结合性定义了操作符对操作数执行操作的顺序,例如:右结合性表示该操作符对其操作数从右向左执行操作。

二.操作符的分类

操作符分类
算数操作符 +      -      *      /     %
移位操作符<<     >>     
位操作符&      |        ^     
赋值操作符=      +=      -=     *=     /=      ……
单目操作符!   sizeof    +      -      ~     &     *   ……
关系操作符>        <        >=      <=      !=
逻辑操作符&&      ||
条件操作符?      :
逗号表达式,
下标引用,函数调用和结构体成员[ ]       ()      .      ->

三.操作符各类详解

1.算数操作符(+     -     *     /     %)

(1)优先级:

 

(2)除法操作符(/)的计算规则及注意事项

这里重点要讲的是除法的计算

2.1除法计算分类

(1)整数除法 (除号两端都是整数)

(2)浮点数除法   (两端有一个是小数就执行浮点数除法)

2.2计算规则及注意事项

注:除法中,被除数不能等于0

整数除法的结果只保留了整数部分,小数点后的直接舍去    如 15 / 5 =3       3 / 2 =1

注意:这里不是四舍五入,是将小数部分直接舍去哦!

浮点数除法的结果整数和小数部分都保留,结果精度一般是小数点后6位

例如    3 / 2.0 =1.500000   

           3.0 / 2 = 1.500000

           3.0 / 2.0 = 1.500000

注意:两端至少有一个为小数即可

(3)取余操作符(%)的计算规则

注:取余操作符的两端都必须为整数

3.1计算规则: 

例如     5 % 2 = 1 (5除2等于2余数为1)

            99 % 10 = 9

(4)算术操作符示例代码

int main()
{
	printf("%d\n",3+5);
	printf("%d\n",4-2);
	printf("%d\n",5*7);
	printf("%d\n",15/5);
	printf("%d\n",3/2);
	printf("%d\n",99%10);

	return 0;
}

输出:

 


2.移位操作符(>>   <<)

(1)优先级:

 

(2)计算规则及注意事项

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

2.1计算规则

首先移位操作符移动的是操作数的补码二进制信息

(1)右移操作符   

右移操作符运算及示例:

 注意:移位操作符操作数本身不会发生改变 ;例如上述的   b = a>>1

其中b=7  ;而a 本身还是 15

2.2左移操作符

计算规则:左边丢弃,右边补0

 

(3)移位操作符示例代码

int main()
{
	int a = 15;
	int b = -15;
	int c = 6;
	int m = -6;
	int d = a >> 1;
	int e = b >> 1;
	int f = c << 1;
	int g = m << 1;
	printf("%d %d %d %d \n",d,e,f,g);

	return 0;
}

 输出:


3. 位操作符(&  ^  |)

注意:和移位操作符一样,也是操作二进制的补码

 (1)优先级

(2)计算规则及注意事项

注意:他们的操作数必须是整数

(1)按位与&

计算规则

两个数对应的二进制有0则为0,全1才为1;

(2)按位异或(^)

计算规则

两个数对应的二进制位相同为0,相异为1;

常见结论:a^0=a;

                  a^a=0;

                  a^b^a=b;  (支持交换律)

                  a^a^b=b;

(3)面试例题

题目描述:不创建临时变量交换a,b的值

参考代码:

#include <stdio.h>
int main()
{
	int a = 10;
    int b = 20;
    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;
}

(3)按位或 ( | )

计算规则

两个数对应的二进制有1则为1,全0才为0;

(4)位操作符示例代码

int main()
{
	int a = 3;
	int b = -5;
	printf("a=%d b=%d\n",a,b);
	printf("a&b=%d\n",a&b);
	printf("a|b=%d\n",a|b);
	printf("a^b=%d\n",a^b);
	printf("a^a=%d\n",a^a);
	printf("a^0=%d\n",a^0);
	printf("a^b^a=%d\n",a^b^a);
	printf("a^a^b=%d\n",a^a^b);

	return 0;
}

输出

 



4.赋值操作符( =   +=   -=    *=   /=   %=  ………)

(1)优先级(赋值操作符的优先级都很低)

 (2)运算规则

他们的运算规则基本相同;

赋值操作符
符号运算规则
a=33赋给a
a+=3a=a+3
a-=3a=a-3
a*3a=a*3
a/=3a=a/3
a%=3a=a%3
a<<=3a=a<<3
a>>=3a=a>>3
a&=3a=a&3
a|=3a=a|3
a^=3a=a^3

           

(3)赋值操作符示例代码

int main()
{
	int a = 9;
	printf("a=%d\n",a);
	printf("a+=3的值为%d\n",a+=3);
	printf("a-=3的值为%d\n",a-=3);
	printf("a*=3的值为%d\n",a*=3);
	printf("a/=3的值为%d\n",a/=3);
	printf("a%=2的值为%d\n",a%=2);
	printf("a|=5的值为%d\n",a|=5);
	printf("a&=3的值为%d\n",a&3);
	printf("a^=2的值为%d\n",a^2);
	printf("a<<=1的值为%d\n",a<<=1);
	printf("a>>=1的值为%d\n",a>>=1);

	return 0;
}

输出:

 


5.单目操作符

(1)单目操作符的介绍

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

(2)单目操作符有哪些?

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

注意:sizeof不是函数,是操作符

        计算的是类型创建的大小(单位字节)

(3)sizeof和数组

(4)sizeof与数组示例代码:

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	char ch[6] = { 'a','b','c','d','e','f' };
	int a = sizeof(arr);                            //40
	int b = sizeof(ch);                             //6
	printf("int类型的大小%d\n",sizeof(int));         //4
	printf("char类型的大小%d\n",sizeof(char));       //1
	printf("数组arr的大小%d\n",a);                   //40
	printf("数组ch的大小%d\n",b);                    //6

	return 0;
}

输出:

 


6.关系操作符(<    >    <=    >=)

(1)优先级

 (2)关系操作符的介绍

(3)运算结果值

关系运算符的值只能是0或1。

关系运算符的值为真时,结果值都为1。

关系运算符的值为假时,结果值都为0。

(4)注意事项

(1)前4种关系运算符的优先级别相同,后两种也相同。前四种高于后两种。

(2)关系运算符的优先级低于算术操作符。

(3)关系运算符的优先级高于赋值运算符。 

(5)示例代码

int main()
{
	printf("%d\n",(-3>2));
	printf("%d\n",(3>=3));
	printf("%d\n",(2)&&(-1));
	printf("%d\n",(2<=9));
	printf("%d\n",(4<=4));

	return 0;
}

输出:

 


7.逻辑操作符(&&   ||)

(1)什么是逻辑操作符?

逻辑操作符是用于结合bool值测试复合条件的操作符。

(2)优先级

(3)计算规则

逻辑与&&:()&&()  两个全为为真才为真,其中一个为假即为假;

逻辑或  |  :()|()     两个为假才为假,其中一个为真即为真;

注意:(非0为真,0为假)

(4)计算机在计算时的特点:

1.为真电脑计算的结果为1,为假计算的结果为0;

例如:int  a  = (3>4)       a的结果为0;a=0;

           int  a = (3>2)        a的结果为1;a=1;

2..当&&操作符左边的为假,右边的都不用计算了;

(因为&&操作符有一个为假即为假)

例如 (3<2)&&(4>3)    左边条件为假   ,右边就不用算了,整个式子的结果就是假;

3..当||操作符左边为真,右边也不用计算了;

(因为||操作符其中一个为真即为真)

 例如   (3>2)||(4<9)     左边条件为真,右边就不用计算了,整个式子的结果就为真;

(4)例题

1.题目描述:printf(“%d”,(a=2)&&(b=-2));的输出结果()

答案:1

2.题目描述:int x=3,y=4,z=1;则表!(x+y)+z-1&&y+z/2的值为()

答案:0

解析:因为式子中运算符的优先级为  ()>  !  >  /  > +

所以左边的式子x+y=7(非0,为真),但是运算符!,结果变为假,所以结果为0;

0+z-1=0;左边为0,又因为是&&操作符,所以整个式子结果为假,即为0;

代码测试

int main()
{
	int a = 0;
	int b = 0;
	int x = 3;
	int y = 4;
	int z = 1;
	printf("%d\n",(a=2)&&(b=-2));
	printf("%d\n",!(x+y)+z-1&&y+z/2);

	return 0;
}

输出:

 


8.条件操作符(  :    ?  )

(1)优先级

(2)运算规则:

表达式为:表达式1:表达式2:表达式3

先计算表达式1的值,若表达式1为真,则执行表达式2;若表达式1为假,则执行表达式3;

例如;

max = (x > y) ? x : y           (就是把x,y中较大的赋给max)

min =  (x < y) ? x : y              (就是把x,y中较小的赋给min)

(3)代码示例

int main()
{
	int x = 4;
	int y = 3;
	int a = 2;
	int b = 6;
	int max = ((x > y) ? x : y);
	int min = ((a < b) ? a : b);
	printf("x=%d y=%d a=%d b=%d\n",x,y,a,b);
	printf("max=%d\n",max);
	printf("min=%d\n",min);

	return 0;
}

输出:

 


9.逗号表达式(   ,  )  

(1)优先级

逗号表达式的优先级最低

(2)逗号表达式的介绍及运算规则

逗号表达式,是c语言中的逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值

如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14;a=(a=3*5,a*4)的值是60,其中(a=3*5,a*4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。

例题:

例题:(a = 3,b = 5,b+ = a,c = b* 5),求逗号表达式的值?

答案:40

解析:前两个表达式只是赋值,从第三个开始计算,b+=a,即b=b+a,即b=5+3,b=8,求最后一个表达式,c=b*5=8*5=40.因为逗号表达式的值是最后一个表达式的值,所以整个逗号表达式的值为40,其他各变量最后的值依次为:a=3,b=8,c=40


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

(1)优先级

(2)下标引用操作符( [ ])

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

如:

arr[10]={0};//创建数组

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

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

(3)函数调用操作符(  ( ) )

1.操作数

函数名   +   函数参数

如   strlen("abc")      操作数为     strlen    "abc"

注意:函数的参数可能有多个,所以对于函数调用操作符()来说,操作数至少有1个(函数可以没有参数,如:test())

 2.示例代码

#include <string.h>

void test()
{
	printf("hello bit!");
}
int main()
{
	char ch[] = "abc";
	int len = strlen(ch);
	printf("%d\n",len);
	test();

	return 0;
}

(4)结构体成员访问操作符(  ->     .  )

.       结构体变量.成员名

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

示例代码

struct book
{
	char  name[20];
	char  author[20];
	float price;
};

void Print(struct book * p)
{
	printf("%s %s %.1f\n",p->author,p->name,p->price);
}

int main()
{
	struct  book a = { "小明","c语言",33.9f };
	Print(&a);
	printf("%s %s %.1f",a.author,a.name,a.price);

	return 0;
}

输出:

 

 


四.操作符优先级表(含记忆规律)

1.运算符优先级和结合性一览表

 

2.表中规律:

  1. 结合方向只有三个是从右往左,其余都是从左往右。
  2. 所有双目运算符中只有赋值运算符的结合方向是从右往左。
  3. 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
  4. C语言中有且只有一个三目运算符。
  5. 逗号运算符的优先级最低,要记住。
  6. 此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。

谢谢观看!!!

                                                                                                                                    




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

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

相关文章

数学基础-标量,向量,张量

前言 数学中&#xff0c;如何描述事务&#xff0c;以棍子为例子&#xff1a; 棍子的长度棍子方向棍子转向… 标量 单纯的形容事务的一个特征&#xff0c;如果体积&#xff0c;长度。 向量 指具有大小&#xff08;magnitude&#xff09;和方向的量。它可以形象化地表示为带…

利用腾讯云推流做7*24小时云直播

早在10年前&#xff0c;直播刚刚火的的时候&#xff0c;我就写过一个基于RTMP推流的直播工具&#xff0c;但没有利用起来&#xff0c;一直荒废了。想想真是可惜&#xff0c;不过谁怪咱精力有限切没有商业头脑呢。 最近刷B站&#xff0c;一位UP分享了无人值守的云直播方案&…

21JS12——内置对象

文章目录 一、内置对象二、查文档1、 MDN2、如何学习对象中的方法 三、Math对象1、Math对象2、案例-封装自己的数学对象3、Math的几个方法&#xff08;1&#xff09;绝对值&#xff08;2&#xff09;三个取整方法&#xff08;3&#xff09;随机数方法random&#xff08;&#x…

【深度学习】3-2 神经网络的学习- mini-batch学习

机器学习使用训练数据进行学习。使用训练数据进行学习&#xff0c;就是针对训练数据计算损失函数的值&#xff0c;也就是说,训练数据有100个的话&#xff0c;就要把这 100个损失函数的总和作为学习的指标。 求多个数据的损失函数&#xff0c;要求所有训练数据的损失函数的综合…

INTERSPEECH2023|达摩院语音实验室入选论文全况速览

近日&#xff0c;语音技术领域旗舰会议INTERSPEECH 2023公布了本届论文审稿结果&#xff0c;阿里巴巴达摩院语音实验室有17篇论文被大会收录。 01 论文题目&#xff1a;FunASR: A Fundamental End-to-End Speech Recognition Toolkit 论文作者&#xff1a;高志付&#xff0c;…

基于 AntV G2Plot 来实现一个 堆叠柱状图 加 折线图 的多图层案例

前言 最近研究了一下antv/g2的组合图例&#xff0c;并尝试做了一个不算太难的组合图&#xff0c;下面介绍一下整个图里的实现过程。 最终效果图 先来看一下最终的效果图 该图表有两部分组成&#xff0c;一部分是柱状图&#xff0c;准确说是堆叠的柱状图&#xff0c;一个柱…

【TA100】图形 3.5 Early-z和Z-prepass

一、深度测试&#xff1a;Depth Test 1.回顾深度测试的内容 深度测试位于渲染管线哪个位置 ○ 深度测试位于逐片元操作中、模板测试后、透明度混合前 为什么做深度测试 ● 深度测试可以解决&#xff1a;物体的可见遮挡性问题 ○ 我们可以用一个例子说明 ■ 图的解释&…

windows应急整理

windows应急整理 Virustotal 网站分析恶意样本 BrowingHistoryView 查看浏览器所有历史记录,可能会请求攻击者的恶意网站或者下载东西 启动项检查 开机启动项文件夹 msconfig 注册表run 键值查看 启动项 临时文件检查,temp 目录权限特殊,容易成为被利用对象 %temp%查看 tem…

华为HCIP第一天---------RSTP

一、介绍 1、以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路&#xff0c;但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表震荡等问题&#xff0c;导致用户通信质量差&#xff0c;甚至通信中断。为了解决交换网…

C# WebSocketSharp 框架的用法

效果: 一、概述 WebSocketSharp 是一个 C# 实现 websocket 协议客户端和服务端,WebSocketSharp 支持RFC 6455;WebSocket客户端和服务器;消息压缩扩展;安全连接;HTTP身份验证;查询字符串,起始标题和Cookie;通过HTTP代理服务器连接;.NET Framework 3.5或更高版本(包括…

腾讯云服务器云监控是什么?

腾讯云服务器云监控是什么&#xff1f;云监控用于监控云服务器性能资源指标如CPU利用率、内存使用量、内网外网出入带宽、TCP连接数、硬盘IOPS、硬盘IO等性能指标&#xff0c;云服务器吧建议免费开通云监控功能。 什么是云监控&#xff1f; 腾讯云服务器CVM云监控是什么&…

从小白到大神之路之学习运维第43天---第三阶段----LVS-----keepalived+LVS(DR)搭建部署

第三阶段基础 时 间&#xff1a;2023年6月19日 参加人&#xff1a;全班人员 内 容&#xff1a; keepalivedLVS(DR)搭建部署 目录 一、作用 技术特点&#xff1a; 与nginx的区别&#xff1a; 安全性&#xff1a; 配置文件&#xff1a; 二、环境简介 三、操作步骤 …

SPEC 2006 gcc version 8.3.0 (Uos 8.3.0.3-3+rebuild) x86_64 源码编译tools 错误处理笔记

编译tools 拷贝tools到安装目录 cp /mnt/iso/tools /opt/speccpu2006/ -r 执行编译 su rootcd /opt/speccpu2006/tools/src sh -x buildtools 错误 undefined reference to __alloca 编辑./make-3.82/glob/glob.c&#xff0c;注释掉以下宏判断 you should not run config…

unittest教程__测试报告(6)

用例执行完成后&#xff0c;执行结果默认是输出在屏幕上&#xff0c;其实我们可以把结果输出到一个文件中&#xff0c;形成测试报告。 unittest自带的测试报告是文本形式的&#xff0c;如下代码&#xff1a; import unittestif __name__ __main__:# 识别指定目录下所有以tes…

springcloud 中RestTemplate 是怎么和 ribbon整合,实现负载均衡的?源码分析

一、RestTemplate 拦截器了解 RestTemplate 内置了一个 ClientHttpRequestInterceptor,这个是一个拦截器操作,我们可以在请求的前后做一些事情。然后我们看一下这个类,这个类里面 有一个 intercept方法。我们看下这个实现类,里面有一个 LoadBalancerInterceptor实现类。 …

pm2详解

对于后台进程的管理&#xff0c;常用的工具是crontab&#xff0c;可用于两种场景&#xff1a;定时任务和常驻脚本。关于常驻脚本&#xff0c;今天介绍一款更好用的工具&#xff1a;pm2&#xff0c;基于nodejs开发的进程管理器&#xff0c;适用于后台常驻脚本管理&#xff0c;同…

whisper语音识别部署及WER评价

1.whisper部署 详细过程可以参照&#xff1a;&#x1f3e0; 创建项目文件夹 mkdir whisper cd whisper conda创建虚拟环境 conda create -n py310 python3.10 -c conda-forge -y 安装pytorch pip install --pre torch torchvision torchaudio --extra-index-url 下载whisper p…

STM32单片机LED显示屏驱动原理与实现

STM32单片机驱动LED显示屏的原理与实现方法与Arduino类似&#xff0c;但涉及到的具体硬件资源和库函数可能会有所不同。下面是一个详细的介绍&#xff1a; 原理&#xff1a; STM32单片机驱动LED显示屏的原理是通过控制GPIO引脚的电平状态来控制LED的亮灭。通过设置引脚的输出电…

Jetpack Compose中的附带效应及效应处理器

Jetpack Compose中的附带效应及效应处理器 将在任何可组合函数范围之外运行的代码称为附带效应。 为什么要编写在任何可组合函数范围之外的代码&#xff1f; 这是因为可组合项的生命周期和属性&#xff08;例如不可预测的重组&#xff09;会执行可组合项的重组。 让我们通过一…