C++初学教程三

news2025/1/9 15:01:57

目录

一、运算符

一、自增自减运算符

二、位运算符 

三、关系运算符 

注意事项

 四、条件运算符

注意事项

 五、逻辑运算符

注意事项:

 六、逗号运算符

概述

注意事项: 

七、小结

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


一、运算符

一、自增自减运算符

运算符描述实例
++a前自增运算符b=++a;等价于a=a+1,b=a;
a++后自增运算符b=a++;等价于b=a,a=a+1;
--a前自减运算符b=--a;等价于a=a-1,b=a;
a--后自减运算符b=a--;等价于b=a,a=a-1;
#include<stdio.h>
int main()
{
	int n=10,m=10;
	printf("%d\n",(m++)+(m--)+(++m));  // 10+10+11
	printf("%d\n",(++n)+(n++)+(n--));  //系统从左向右执行,执行完n=++n=11了,所以是11+11+11
}

二、位运算符 

运算符描述规则
&按位与操作,按二进制位进行"与"运算。

0&0=0;  

0&1=0; 

1&0=0;

1&1=1;

|按位或运算符,按二进制位进行"或"运算。

0|0=0;

0|1=1;

1|0=1;

1|1=1;

^异或运算符,按二进制位进行"异或"运算。

0^0=0;

0^1=1;

1^0=1;

1^1=0;

~取反运算符,按二进制位进行"取反"运算。

~1=0;

~0=1;

<<二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。11<< 2 得到1100
>>二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。1011>>2得到10

#include<stdio.h>
int main()
{
	int a=60,b=13,c=0;
	c=a&b;
	printf("a&b的值是:%d\n",c);
	
	c=a|b;
	printf("a&b的值是:%d\n",c);
	
	c=a^b;
	printf("a&b的值是:%d\n",c);
	
	c=~a;
	printf("a&b的值是:%d\n",c);
	
	c=a<<2;
	printf("a&b的值是:%d\n",c);
	
	c=a>>2;
	printf("a&b的值是:%d\n",c);
}

三、关系运算符 

1. C语言的逻辑值
关系表达式和逻辑表达式的运算结果是一个逻辑值。
C语言没有专门的“逻辑值",用非0表示“真”,用0表示“假”

算符描述优先级结合性操作数
>大于6自左向右双目运算符
<小于6自左向右双目运算符
>=大于等于6自左向右双目运算符
<=小于等于6自左向右双目运算符
==相等7自左向右双目运算符
!=不相等7自左向右双目运算符

 

#include<stdio.h>
int main()
{
	int a=1,b=2;
	printf("a==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>=b结果为%d\n",a>=b);
	printf("a<=b结果为%d\n",a<=b);
	return 0;
}

 

注意事项

1 注意赋值"="与关于等于"=="的区别

a=1;//将1赋值给a变量
a==1;//判断a是否等于1

2 结合性自左向右

1<3<2;//值为1,计算过程:(1<3)<2 <==>  1<2 <==> 1
#include<stdio.h>
int main()
{
	int a=1,b=2,c=3,d=0;
	printf("a<c<b结果为%d\n",a<c<b);  //相当于(a<c)<b;(a<c)为真1相当于1<b,1<2为真 
	printf("a<c<d结果为%d\n",a<c<d);
}

3 优先级

3==2>=0;//值为0,由于>=的优先级高于==,因此等价于3==(2>=0)
1+2>5-4;//值为1,由于算数运算符优先级高于关系运算符,因此等价于(1+2)>(5-4)
a=1==3<=2;//a值为0,赋值运算符优先级低于关系运算符,等价于a=(1==(3<=2));

 四、条件运算符

条件表达式的一般形式为:

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

条件运算符的执行:表达式1结果为非零(真),则采用表达式2的值,否则采用表达式3的值。

优先级:13级,高于赋值运算符、逗号运算符。

结合性:自右向左

比较两个数之间的大小

#include<stdio.h>
int main()
{
	int a,b;
	printf("请输入两个数:\n");
	scanf("%d%d",&a,&b);
	printf("两数的较大者为:%d\n",a>b?a:b); 
}

注意事项

结合性自右向左

a>b ? a : c>d ? c : d;
等价于
a>b ? a : (c>d ? c : d);

优先级仅高于赋值及逗号运算符

a>b?a+1:b-1;
等价于
a>b?(a+1):(b-1);

 比较数字大小

#include<stdio.h>
int main()
{
	int a,b,c,d;
	printf("请输入四个数:\n");
	scanf("%d%d%d%d",&a,&b,&c,&d);
	printf("两数的较大者为:%d\n",a>b?a:b); //比较a、b 
	printf("三数的较大者为:%d\n",a>b?a:(c>d?c:d)); //比较a、c、d 
	printf("三数的较大者为:%d\n",a>b?a:(b>c?b:c)); //比较a、b、c 
}

 五、逻辑运算符

运算符描述规则
&&逻辑与运算符。如果两个操作数都非零(真),则结果为真。
||逻辑或运算符。如果两个操作数中有任意一个非零(真),则结果为真。
!逻辑非运算符。一个操作数为非零(真),则结果为假。若操作数为零(假),结果为真。

1.运算符&&和I为双目运算符
运算符!为单目运算符,出现在运算对象的左边。,
2.结合性
自左向右
3.优先级
优先级次序是:!级别最高,&&次之,|最低。
逻辑运算符与赋值运算符、算术运算符、关系运算符之
间从高到低的运算优先次序是:
! >算术运算符>关系运算符>&&>I>赋值运算符
a>b&&x>y 
等价于(a>b) && (x>y)


与运算、或运算的短路现象
(1) a&&b运算:当a为假时,a&&b确定为假,此时b不再计算。
(2) al|lb运算:当a为真时,al |b确定为真,此时b不再计算。

题目一:

从键盘输入一个整数,如果该数既能被3整除又能被5整除,输出“yes”;否则输出“no” 

#include<stdio.h>
int main()
{
	int a;
	printf("请输入一个整数a:");
	scanf("%d",&a);
	if(a%3==0&&a%5==0) 
	printf("yes");
	if(a%3!=0|a%5!=0)
	printf("no");
}

题目二:

判断年份是否为闰年

闰年计算:能被4整除,不能被100整除,或者能被400整除

方法一:

#include<stdio.h>
int main()
{
	int a;
	printf("请输入一个年份:");
	scanf("%d",&a);
	if((a%4==0&&a%100!=0)||a%400==0)
	printf("今年是闰年!");
	if(a%400!=0)
	printf("今年不是闰年!");
}

方法二: 

#include<stdio.h>
int main()
{
	int a,b;    //a输入的年份,b真假 
	printf("请输入一个年份:");
	scanf("%d",&a);
	b=a%4==0&&a%100!=0||a%400==0;
	printf("%d是否为闰年:%c\n",a,b?'Y':'N');
	return 0;
}

注意事项:

注意逻辑运算符与位运算符的区别

逻辑运算符  与&&  或||  非!

位运算符    与&   或|   非~

注意运算符的优先级 !>算数>关系>&&>||

1&&0||!1&&1
等价于
(1&&0)||((!1)&&1)

a+b>c&&d
等价于
((a+b)>c)&&d

注意运算规则(短路)

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

结果为

1
1 0

b的值没有发生变化,因为a||(b=1)运算中,a为真,则不再进行计算

 六、逗号运算符

概述

逗号运算符是以逗号为分隔符的列表中最后一个表达式的值。

逗号表达式的一般形式为:

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

执行:顺序执行表达式1,表达式2,.....表达式n.最右边的那个表达式的值将作为整个逗号表达式的值。

运算符描述操作数优先级结合性
逗号运算符双目运算符15级(最低)自左向右

题目一: 

#include<stdio.h>
int main()
{
	int i=1, j;
    j = (i++, i + 100, 999 +i);
    printf("%d %d\n",i,j);
    return 0;
}

注意事项: 

优先级最低,低于赋值运算符

如下逗号表达式

a = 3 * 5, a * 4

对该表达式,可能会有两种解读。

一种为 a=(3*5,a*4);  
一种为(a=3*5),(a*4);

由于赋值运算符的优先级高于逗号运算符的优先级,因此应该首先求解a = 3 * 5,然后再求解a*4,得60.

七、小结

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

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

()

圆括号

(表达式)
函数名(形参表)

.

成员选择(对象)

对象.成员名

->

成员选择(指针)

对象指针->成员名

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

++

自增运算符

++变量名
变量名++

单目运算符

--

自减运算符

--变量名
变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

3

/

表达式 / 表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式%整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

变量<<表达式

左到右

双目运算符

>>

右移

变量>>表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

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

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

/=

除后赋值

变量/=表达式

*=

乘后赋值

变量*=表达式

%=

取模后赋值

变量%=表达式

+=

加后赋值

变量+=表达式

-=

减后赋值

变量-=表达式

<<=

左移后赋值

变量<<=表达式

>>=

右移后赋值

变量>>=表达式

&=

按位与后赋值

变量&=表达式

^=

按位异或后赋值

变量^=表达式

|=

按位或后赋值

变量|=表达式

15

,

逗号运算符

表达式,表达式,…

左到右

注意事项:

关系运算的注意事项
(1) 注意赋值"="与关于等于"=="的区别
a=1; //将1赋值给a变量
a== 1://判断a是否等于1
(2) 结合性自左向右
1<3<2:;//值为1,计算过程: (1<3)<2<==> 1<2 <==> 1
(3) 优先级
3==2>=0;//值为0,由于>=的优先级高于==,因此等价于3== (2>=0)
1+2>5-4://值为1,由于算数运算符优先级高于关系运算符,因此等价于
(1+2)>(5-4)
a=1==3< =2://a值为0,赋值运算符优先级低于关系运算符
等价于a=(1==(3<=2));
(4)当关系运算符两边值的类型不一致时
系统将自动按类型转换规则转换然后进行比较。
(5)避免判断浮点数之间是否相等
若x和y都是浮点数,应当避免使用x==y这样的关系表达式,因为浮点数在内存
中是有误差的,不可能精确相等,这将导致关系表达式x==y的值总是为0。
 

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

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

相关文章

「Verilog学习笔记」根据状态转移写状态机-二段式

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 和三段式相比&#xff0c;就是将输出块和次态切换块合并。 timescale 1ns/1nsmodule fsm2(input wire clk ,input wire rst ,input wire data ,output reg flag );//****…

Linux Component概述和高通V4l2驱动模型

1 Linux为什么要引入Component框架&#xff1f; 为了让subsystem按照一定顺序初始化设备才提出来的。 subsystem中由很多设备模块&#xff0c;内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video …

校园后勤数字化转型要怎么做?的修工单管理系统的功能强大吗?

2023年11月27日-29日&#xff0c;由中国教育后勤协会主办&#xff0c;广东省高校后勤协会、物业管理专业委员会、能源管理专业委员会、安全管理专业委员会、中小学后勤分会等协办的第六届中国教育后勤展览会在深圳圆满落幕。 广东工程宝科技有限公司以其创新的“的修工单管理系…

家用保险柜什么牌子好?

家用保险柜的品牌有很多&#xff0c;其中比较知名的有虎牌、得力、永发、思锐、迪堡、艾谱、全能、杰宝-大王、金虎、花都、飞云、威盾斯等等。这些品牌都有各自的特点和优势&#xff0c;例如虎牌品牌是来自于河北&#xff0c;每年生产60多台&#xff0c;质量可靠&#xff1b;得…

国内零代码链接器有哪些?

什么是零代码链接器&#xff1f; 零代码链接器&#xff0c;也是属于零代码集成领域&#xff0c;代表一种可以通过不编写代码就能让不同系统产生数据互通的技术&#xff0c;主要通过授权API接口暴露数据&#xff0c;让不同系统间的数据可以在内部互相调用&#xff0c;实现自动化…

【C++11并发】Atomic 笔记

简介 用atomic定义的变量&#xff0c;支持原子操作&#xff0c;即要么全部完成操作&#xff0c;要不全部没有完成&#xff0c;我们是不可能看到中间状态。一般在多线程程序中&#xff0c;可以用atomic来完成数据同步。 标准库为我们主要提供了四类工具 atomic类模板操作atomi…

ZStack Cloud云平台服务中国化学工程集团高性能数据库

中国化学工程通过ZStack Cloud云平台构建云基础设施&#xff0c;并为其提供高性能、高可用的云主机、云存储和云网络服务&#xff1b;并通过ZStack Cloud云平台弹性裸金属能力ZStack RDS数据库云平台&#xff0c;满足高性能数据库和多种数据库统一管理的需求&#xff1b;此外&a…

DOS 批处理 (二)

DOS 批处理 1. 基础 DOS 命令1.1 基础命令1.2 文件系统操作1.3 文件夹管理1.4 文件管理1.5 网络相关1.6 系统管理1.7 IF、FOR和NETIFFORNET 1. 基础 DOS 命令 command /? 查找帮助DOS命令不区分命令字母的大小写 C:\Users\Administrator>echo 1 1 C:\Users\Administrator…

我们一起聊一聊JWT的那些事

我们一起聊一聊JWT的那些事 一切美好&#xff0c;如期而至… 什么是JWT JWT&#xff0c;全称为 JSON Web Token&#xff0c;是一种用于在网络上安全地传递信息的开放标准&#xff08;RFC 7519&#xff09;。JWT 是一种紧凑且独立的方式&#xff0c;用于在各方之间以 JSON 对象…

Docker部署开源分布式任务调度系统DolphinScheduler与远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

STM32 定时器配置步骤

定时中断基本框架结构图&#xff1a; 根据结构图可按步骤配置定时器 第1步&#xff1a;RCC开启时钟。打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开。 第2步&#xff1a;选择时基单元的时钟源。对于定时中断可选择内部时钟源. 第3步&#xff1a;配置时基单元…

12.7作业

1.头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton> class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidge…

论文笔记——DAS

论文&#xff1a;https://arxiv.org/pdf/2311.12091.pdf 代码&#xff1a;暂无 卷积神经网络&#xff08;CNNs&#xff09;在局部空间模式识别方面表现出色。对于许多视觉任务&#xff0c;如物体识别和分割&#xff0c;显著信息也存在于CNN核边界之外。然而&#xff0c;由于CN…

在Spring Cloud使用Hystrix核心组件,并注册到Eureka注册中心去

其实吧&#xff0c;写Spring Cloud系列&#xff0c;我有时候觉得也挺难受的&#xff0c;因为Spring Cloud的微服务启动都需要一个一个来&#xff0c;并且在IDea中也需要占用比较大的内存&#xff0c;并且我本来可以一篇写完5大核心组件的&#xff0c;但是我却分了三篇&#xff…

Implicit Neural Representation for Cooperative Low-light Image Enhancement

GitHub - Ysz2022/NeRCo: [ICCV 2023] Implicit Neural Representation for Cooperative Low-light Image Enhancement 参考&#xff1a;ICCV2023 | 将隐式神经表征用于“低光增强”&#xff0c;北大张健团队提出NeRCo (qq.com) 以下三个因素限制了现有低光图像增强方法的应用…

状态机的练习:按键控制led灯

设计思路&#xff1a; 三个按键控制led输出。 三个按键经过滤波(消抖)&#xff0c;产生三个按键标志信号。 三个led数据的产生模块&#xff08;流水&#xff0c;跑马&#xff0c;闪烁模块&#xff09;&#xff0c;分别产生led信号。 这六路信号&#xff08;三路按键信号&am…

Java网络编程——Socket用法解析

在客户/服务器通信模式中&#xff0c;客户端需要主动创建与服务器连接的Socket&#xff0c;服务器端收到了客户的连接请求&#xff0c;也会创建与客户连接的Socket。Socket可以被看作是通信连接两端的收发器&#xff0c;服务器与客户都通过套接字来收发数据。 1、构造Socket …

企业数字化转型的七个成功案例

尽管经济形势严峻&#xff0c;但60%的企业告诉波士顿咨询公司&#xff0c;他们将在2023年增加数字化转型投资。根据Precedence Research最近的一份报告&#xff0c;到2025年&#xff0c;数字化转型市场预计将达到1.458万亿美元。 成长型股权公司PSG的董事总经理安东尼爱德华兹…

【hacker送书第10期】AI时代系列丛书(五选一)

AI时代系列丛书 AI时代程序员开发之道✨内容简介参与方式 AI时代项目经理成长之道✨内容简介参与方式 AI时代架构师修炼之道✨内容简介参与方式 AI时代产品经理升级之道✨内容简介参与方式 AI时代Python量化交易实战✨内容简介参与方式 AI时代程序员开发之道✨ 内容简介 本书是…

C#中GDI+图形图像技术(Graphics类、Pen类、Brush类)

目录 一、创建Graphics对象 1.创建Pen对象 2.创建Brush对象 &#xff08;1&#xff09;SolidBrush类 &#xff08;2&#xff09;HatchBrush类 ​​​​​​​&#xff08;3&#xff09;LinerGradientBrush类 用户界面上的窗体和控件非常有用&#xff0c;且引人注目&#…