C++从0到1的入门级教学(三)——表达式和运算符

文章目录

  • 3 运算符
    • 3.1 表达式
      • 3.1.1 基本概念
      • 3.1.2 运算符和运算对象
      • 3.1.3 运算对象的转换
      • 3.1.4 左值和右值
    • 3.2 运算符
      • 3.2.1 算术运算符
      • 3.2.2 赋值运算符
      • 3.2.3 比较运算符
      • 3.2.4 逻辑运算符
      • 3.2.5 成员访问运算符
      • 3.2.6 条件运算符

3 运算符

C++提供了一套供操作内置数据类型的运算符,当然,对于不是内置数据类型的数据对象,C++也允许程序员进行运算符重载,使运算符赋予新的含义。在这一讲中,我们不会谈论关于运算符重载的知识,但是我们会谈谈如何使用运算符来操作内置数据类型。

3.1 表达式

3.1.1 基本概念

表达式由一个或多个运算对象 组成,对表达式求值将得到一个结果。如下所示:

int a,b;
int c = a + b;//一个表达式含有多个数据对象

当然,上述的演示可以进行有限次的加减乘除,对于一些特定的数据对象,还可以直接让字面值和变量进行加减乘除使之构成表达式。

3.1.2 运算符和运算对象

C++定义了一元运算符二元运算符。顾名思义,多少元的运算符就可以同时操纵多少个数据对象。如在后续我们会学习的取地址符&解引用符*,这些都是作用在一个数据对象上的;而本节将会讨论的如算术运算符加减乘除这些都是同时操作两个数据对象。

多个含义

一个运算符可能在不同的语义下会有多个含义,如*运算符用在指针时表示解引用,而用于两个基本数据对象时表示两个基本数据对象做乘法。

3.1.3 运算对象的转换

在表达式的求值中,常常会出现一些类型经过表达式的求值后变为另外一种类型的情况。

敲一下下面的代码,仔细体会我说的内容:

#include <iostream>
#include <typeinfo>
using namespace std;int main() 
{double a = 1.9;int b = 1;auto c = a + b;cout << typeid(c).name() << endl;
}

out:

image-20220429161707482

查看对象的数据类型

如同python的type()方法一般,C++也可以查看对象的数据类型,如果想要查看对象的数哦据类型,需导入typeinfo()标准库,并且调用库中的typeid()方法,将对象作为参数传入,再调用name()方法即可查看对象的数据类型。

3.1.4 左值和右值

C++的表达式要不然是右值,要不然是左值,这两个术语是从C继承过来的。

如果是左值,那么其可以出现在表达式等号的左侧,反之如果是右值,则不可出现在等号左侧。

左值和右值还有另外一层含义,如果一个对象作为右值,那么其是作为内容来使用的,而一个对象作为左值时,那么其相当于一个身份。如:

int a = 10;//10是内容,而a相当于其身份,当你叫a时,实际上就是在叫10这个字面值
int b = a;//a是内容,b相当于其身份,当你叫b时,实际上是在叫a这个对象中的内容

3.2 运算符

3.2.1 算术运算符

作用:用于处理四则运算

算术运算符包括以下符号:

运算符术语示例结果
+正号+33
-负号-3-3
+10+515
-10-55
*10*550
/10/52
%取模(取余)10%31
++前置递增a = 2;b = ++a;a = 3;b = 3;
++后置递增a = 2;b = a++;a = 3;b = 2;
__前置递增a = 2;b = --a;a = 1;b = 1;
后置递增a = 2;b = a–a = 1;b = 2;

注意

%运算符求模,他要求两个操作数必须都是整型,将该运算符用于浮点数将导致编译错误。

还有一个需要提醒的是环绕现象。如果一个表达式通过运算后得出的结果超出了数据类型规定的范围,那么他就会发生环绕现象。

举个例子,如int类型,其值范围为(-2^31 ~ 2^ 31-1)。我们来看看当表达式的结果为2312^{31}231,且结果数据类型恰好设定为int会发生什么事。

#include <iostream>
#include <typeinfo>
using namespace std;int main() 
{int a = pow(2,31)-1;cout << a << endl;int b = a + 1;cout << b << endl;
}

out:

image-20220429164352291

这就是环绕现象,这下你应该深有体会了。

示例:加减乘除

#include <iostream>using namespace std;
int main() 
{//加减乘除int a1 = 10;int b1 = 3;cout << a1 + b1 << endl;cout << a1 - b1 << endl;cout << a1 * b1 << endl;cout << a1 / b1 << endl;//两个整数相除,结果依然是整数,并且这个整数是将小数部分去除的结果int a3 = 10;int b3 = 0;//cout << a3 / b3 << endl;//报错,除数不能为0double a2 = 10.0;double b2 = 3.0;cout << a2 / b2 << endl;system("pause");return 0;
}

out:

image-20220429160845738

运算顺序

一条表达式中含有多个算数运算符时,这时候就涉及到各种优先级问题。但是在实际开发中,如果你记不起各种运算符的优先级,那么使用小括号括起使其先行运算是一个不错的选择,因为括号可以无视优先级和结合律。

示例二:取模运算

#include <iostream>
using namespace std;
int main() 
{int a1 = 10;int b1 = 3;cout << 10 % 3 << endl;int a2 = 10;int b2 = 20;cout << a2 % b2 << endl;int a3 = 10;int b3 = 0;//cout << a3 % b3 << endl;//取值运算时,除数也不能为0//两个小数不可以取模double d1 = 3.14;double d2 = 1.1;//cout << d1 % d2 << endl;}

out:

image-20220429164611155

示例三:前置递增和后置递增

#include <iostream>
using namespace std;int main() 
{//1、前置递增int a = 10;++a;//让变量+1cout << "a = " << a << endl;//2、后置递增int b = 10;b++;cout << "b = " << b << endl;//3、前置后置的区别//前置递增 先让变量+1然后进行表达式运算int a2 = 10;int b2 = ++a2 * 10;cout << "a2 = " << a2 << endl;cout << "b2 = " << b2 << endl;//后置递增 先进行表达式运算,然后让变量+1int a3 = 10;int b3 = a3++ * 10;cout << "a3 = " << a3 << endl;cout << "b3 = " << b3 << endl;system("pause");return 0;
}

out:

image-20220429164648105

3.2.2 赋值运算符

赋值运算符用于将右边的数据对象赋给左边的数据对象。不过需要注意的是,左边的数据对象(左值)必须可修改。

对于将字面值赋给变量,我们一般不叫赋值而叫初始化。如:

int a = 10;

有一些操作是非法的,这些都是在使用的时候需要去潜移默化的去了解,如常量是不可以作为左值的,字面值是不可以作为左值的,算术表达式是不可以作为左值的。

C++11新标准允许我们使用花括号括起的初始值列表。当然这个知识前面已经讲过,这里不再赘述。

需要注意的是,很多人常常会混淆赋值运算符=和相当运算符==

3.2.3 比较运算符

比较运算符用于表达式的比较,并返回一个真值或假值。有时候比较运算符也叫关系运算符。比较运算符有以下符号:

运算符术语示例结果
==相等于4==30
!=不等于4!=31
<小于4<30
>大于4>31
<=小于等于4<=30
>=大于等于4>=31

3.2.4 逻辑运算符

逻辑运算符用于根据表达式的值返回真值或假值,其类下有以下符号:

运算符术语示例结果
!a如果a为假,则!a为真;如果a为真,则!a为假。
&&a&&b如果a和b都为真,则结果为真,否则为假。
||a||b如果a和b有一个为真,则结果为真,两者都为假时,结果为假。

示例1:逻辑非

#include <iostream>
using namespace std;int main() 
{//逻辑运算符 非!int a = 10;//在C++中,除了0都为真cout << !a << endl;system("pause");return 0;
}

3.2.5 成员访问运算符

这个实际上如果你不理解可以等学完面向对象的那几讲后再回来看也不迟。

点运算符.箭头运算符->都可以用于访问对象的成员。

不过需要注意的一点是,解引用运算符的优先级低于点运算符。所以执行解引用运算的子表达式两端必须加上括号,如果没有括号含义就变了。

*p.size(); //错误,p是一个指针,它没有名为size的成员。
*(p.size()); //正确。

3.2.6 条件运算符

条件运算符在python中时常被称作三目运算符,但是我不知道在C++中有无类似的叫法。条件运算符允许我们将if-else的逻辑嵌入到单个表达式中,其表达十分简洁。格式如下:

判断语句?结果1:结果2

上述的表达式表达了这么个意思:如果判断语句为真,那么表达式的值为结果1,否则为结果2。

条件运算符允许嵌套,但是,随着嵌套的层数增加,代码的可读性也变差,所以一般我们不要这么做去嵌套哈。

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

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

相关文章

谈谈用SQLite和FMDB而不用Core Data

谈谈用SQLite和FMDB而不用Core Data 发布于&#xff1a;2014-04-22 11:22阅读数&#xff1a;4235 凭良心讲&#xff0c;我不能告诉你不去使用Core Data。它不错&#xff0c;而且也在变好&#xff0c;并且它被很多其他Cocoa开发者所理解&#xff0c;当有新人加入你的组或者需要别…

Idea工具开发 SpringBoot整合JSP(毕设亲测可用)

因为&#xff0c;临近毕业了&#xff0c;自己虽然也学了很多框架。但是&#xff0c;都是在别人搭建好的基础上进行项目开发。但是springboot的官方文档上明确指出不提倡使用jsp进行前端开发&#xff0c;但是在校期间只学了jsp作为前端页面。所以&#xff0c;废话不多说&#xf…

深度学习番外——Yolov5服务器环境搭建

文章目录1 服务器搭建yolov5环境1.1 创建环境1.2 跟随官方指引2 下载预训练权重3 推理4 测试1 服务器搭建yolov5环境 1.1 创建环境 首先先的在本地环境下搭建一个我们的环境&#xff0c;名字设为yolo5-6 conda create -n yolov5-6 python3.7#创建环境 conda activate yolov5…

机器学习实战(一)——员工离职预测

文章目录员工离职预测——逻辑回归的应用1 读取文件2 独热编码3 划分数据集4 归一化5 逻辑回归预测6 模型预测及评估员工离职预测——逻辑回归的应用 开始这个案例之前&#xff0c;请先点击这里的数据集进行下载&#xff1a;HR_comma_sep.zip - 蓝奏云 (lanzout.com) 1 读取文…

Mac版Anaconda安装Tweepy包

Anaconda官网给出的tweepy包安装方法&#xff1a;https://anaconda.org/conda-forge/tweepy 查阅Anaconda官方文档&#xff0c;可以通过以下控制台命令安装Tweepy包。 conda install -c conda-forge tweepy 在控制台执行后&#xff0c;系统可能会提示未找到conda指令&#xff…

iOS 证书与签名 解惑详解

iOS 证书与签名 解惑详解 分类&#xff1a; iPhone2012-06-06 19:57 9426人阅读 评论(1) 收藏 举报iosxcodecryptographyappleiphone测试目录(?)[] 教程截图&#xff1a; 下面是一篇有澳洲墨尔本的一名全职iOS开发者提供的文章。他在论坛上是一个很摩登的年轻人 – Adam Eberb…

Julia学习笔记(一)——入门

文章目录1 入门1.1 启动与退出1.1.1 启动1.1.2 退出1.2 编译文件1.3 变量1.3.1 基本介绍1.3.2 重定义1.3.3 变量名合法性1 入门 1.1 启动与退出 1.1.1 启动 在没有任何IDE的帮助下&#xff0c;使用cmd启动黑窗口来尝试julia是一种最简单的方法。我们称进入julia后的黑窗口为…

Linux学习宝典

文章目录1 虚拟机1.1 简介1.2 Linux版本1.2.1 内核1.2.2 发行版1.3 文件和目录1.3.1 单用户操作系统和多用户操作系统1.3.2 window文件系统1.3.3 Linux下的文件系统2 概述2.1 为什么要学习命令2.2 一些基本操作和说明3 指令和选项4 基础指令4.1 ls指令4.1.1 讲解4.1.2 选项4.1.…

《华为工作法读后感》

开篇 首先不得不说《华为工作法》是一本很好的书籍。感谢我们领导的照顾和用心&#xff0c;才使得我们又有了一些对社会 对工作 对生活等等的认知 。 之前的我是不怎么读书的&#xff0c;因为个人原因读的慢&#xff0c;每句话都要了解其中寓意之后才继续读下去,还有就是工作…

Redis发布与订阅——PUBLISH SUBSCRIBE

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;Redis发布与订阅——PUBLISH & SUBSCRIBE 一般来说&#xff0c;发布与订阅&#xff08;又称pub/sub&#xff09;的特点是订阅者&#xff08;listener&#xff09;负责订阅频道&#xff08;channel&…

Android 网络通信架构学习

最近跟着云课堂上的极客学院做安卓APP&#xff0c;学习了课程里面介绍的一种网络通信架构。清晰明了&#xff0c;比我自己东一块西一块拼凑出来的要好很多。在这里记录一下。 云课堂的连接&#xff1a;http://study.163.com/course/courseMain.htm?courseId917001 目录&#x…

网络爬虫(二)——Xpath和Selenium的使用

文章目录2 网络爬虫进阶2.1 Xpath2.1.1 Xpath解析原理2.1.2 信息提取2.1.2.1 获取所有结点2.1.2.2 获取子节点2.1.2.3 获取父节点2.1.2.4 获取文本2.1.3 属性匹配2.1.3.1 单个属性匹配2.1.3.2 多个属性匹配3.1 Selenium3.1.1 概述3.1.2 安装3.1.3 元素定位3.1.4 元素信息3.1.5 …

lintcode:买卖股票的最佳时机 III

买卖股票的最佳时机 III 假设你有一个数组&#xff0c;它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。 样例 给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6 解题 尝试参考买卖股票的最佳时机 II 提交运行发现错误&#…

团队项目计划BACKLOG

团队名称&#xff1a; 铁大老司机 团队成员&#xff1a; 组长&#xff1a;杨超群 组员&#xff1a;杨涛 杜文星 张家军 计划会议过程&#xff1a; 我们小组在周三下午进行了团队会议&#xff0c;会议召开在图书馆大厅&#xff0c;主要内容是进行项目的总体计划安排&#xff0…

C++从0到1的入门级教学(八)——通讯录管理系统

文章目录8 通讯录管理系统8.1 系统需求8.2 菜单功能8.3 退出功能8.4 添加联系人8.4.1 设计联系人结构体8.4.2 设计通讯录结构体8.4.3 main函数中创建通讯录8.4.4 封装添加联系人函数8.5 显示联系人8.5.1 封装显示联系人函数8.5.2 调用显示联系人函数8.6 删除联系人8.6.1 封装检…

【Data Cluster】真机环境下MySQL数据库集群搭建

真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同&#xff0c;它采用 无共享架构Shared nothing&#xff08;shared nothing architecture&#xff09;。整个集群由管理节点(ndb_mgmd)&#xff0c;处理节点(mysqld)和存储节点(ndbd)组…

数据结构杂谈(八)——树(上)

文章目录8 树(上)8.1 引入8.2 树的基础知识8.3 树的存储结构8.3.1 双亲表示法8.3.2 孩子表示法8.4 二叉树8.4.1 基础知识8.4.2 高频考点8.4.3 二叉树的性质8.4.4 二叉链表8.4.5 树和二叉树的转换8.4.6 森林和二叉树的转换8.5 遍历8 树(上) 8.1 引入 我们在前面的章节中一直在…

Maven(一)——快速上手Maven

文章目录Maven概述Maven简介Maven的安装Maven的基本使用IDEA配置Maven依赖管理依赖范围Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; &#xff08;一&#xff09;提供了一套标准化的项目结构 不同的IDE项目结构是不一样的&…

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作&#xff0c;为Student实体的 web 页。在本教程中&#xff0c;您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面&#xff0c;并简单分组。 下面的插图显示页面当你完成时的样子。列标题是链接&#xff0c;用户可…

fluentd主从配置

fluentd是一个免费的、完全开源的日志管理工具&#xff0c;可以对日志进行收集、处理、存储。对于一些高流量的网站或者特殊的架构&#xff0c;需要fluentd高可用配置。 以下是在测试环境搭建模拟fluentd主从配置&#xff0c;模拟主从切换。 服务器 服务 192.168.199.1 elas…