C++ Primer 第4章运算符4.1-4.7 总结和答案 重点 运算符返回的是左值还是右值

本文总结了C++ Primer中关于运算符的知识,包括算术、逻辑和关系运算符,赋值运算符,递增和递减运算符,以及条件运算符。强调了左值和右值的概念,运算符的优先级和结合律,以及在使用中需要注意的潜在问题,如运算对象的转换和求值顺序。同时,通过练习题加深了对运算符的理解。
摘要由CSDN通过智能技术生成

仅供参考,欢迎交流和指正 power by Qi

运算符类型 左右值说明
算术运算符 运算对象和求值结果都是右值
逻辑和关系运算符 运算对象和求值结果都是右值
赋值运算符 左侧对象为可修改的左值,求值结果为左值
递增递减运算符 运算对象为左值,前置递增和递减返回左值,后置返回右值
成员访问运算符 1.箭头运算符作用域一个指针对象返回一个左值2.点运算符,访问的所属对象为左值则运算结果为左值,访问对象为右值则结果为右值
条件运算符 如果条件运算符的两个表达式都为左值,或者表达式都可以转化为同一类型,则求值结果为左值,否则为右值
sizeof 运算符 返回值为size_t类型,左值
逗号运算符 返回值为右侧的运行对象,右侧运行对象为左值则为左值,否则为右值

基础

需要弄清楚三个东西,表达式、运算符和运算对象
1.表达式由一个或者多个运算对象组成,字面值和变量是最简单的表达式,表达式将得到一个结果,得到这个结果的过程叫做求值。
2.运算对象在我的理解中就是定义的变量以及字面值
3.运算符就是±*/这些符号,运算符作用于运算对象,运算符和运算对象组成了表达式

我觉得不需要死记,但是需要知道有这么个概念存在。

1.运算符根据需要运算对象数量,分为一元,二元,三元,函数可以看成是一个多元运算符

2.表达式求值的过程中存在着运算对象的转换,具体怎么转换的,还得往下看

3.C++语言本身定义了运算符在内置类型和复合类型,int,int*等等中的操作action。如果想在类类型中使用,需要自己重载这些运算符的意义。

4.左值和右值,在C语言中,左值就是可以放在=左边的运算对象,右值只能放在=右边。在C++中,目前还不太清楚左值和右值的具体区分。我目前的理解是,左值其内容可以被修改,右值就是固定死的,没法被修改。比如1这个数字是固定死的,所以他是右值,但是int b=1;b的内容是可以修改的,所以b是左值。

左值不一定出现在=号的左边。
5.优先级和结合律,和学数学时一样,运算符有自己的优先级,C++的表达式计算规则是,先算优先级高的运算符,再算优先级低的运算符,如果有括号,先算括号里面的。相同优先级的运算符,按照从左至右的方法,依次调用

6.求值顺序。之前说了优先级相同,按照从左到右的算法计算运算符,但是对于二元运算符,比如f1()+f2(),f1()和f2()的调用顺序,c++语言本身是没有规定的。 所以这就很容易写错,在一个表达式中,如果运算对象操纵同一个对象,就会产生未定义的行为。比如

int i = 0;
cout << i << " " << ++i << endl;

输出的结果可能是0,1或者1,1,这取决于编译器是如何解析表达式的。感兴趣的可以查查编译原理的书籍。

为了避免这种未定义的行为,在书写一个表达式的时候,不要书写作用于同一个对象的运算对象

在平时写表达式的时候,多写括号。。。这样可读性会更高

算术运算符

算术运算符有以下7个:
算术表达式类型
其中一元的+和-优先级最高,所有的算术运算符都能够作用于算术类型
注意char和bool也算算术类型。

2.在表达式运算中,算术运算符左右两边的类型算术类型不一致时,会将较小整型转化为较大整型

bool a = true;
int b = 12;
double c = 3.0;

auto d = a + b + c;
编译器自动推断的d的值为double类型,注意bool类型的
变量最好不要参与数值运算

3.所有的算术运算符都可以作用域算术类型,除此之外一元正号运算符、加法、减法运算符可以作用于指针类型,一元正号运算符返回指针的副本。

4.之前说了bool类型的变量最好不要参与数值计算。

bool a = true;
bool b = -a;
>>> b的值为true

解析,因为在进行算术运算时,bool类型的对象会被提升为int类型,a为true,按照C++的规定在int类型中为1;那么-a也就是-1;但是C++规定,int类型的变量为0的时候转化bool类型才是false,否则为true。所以这里就得到的true,并不是false

5.对于+、-、*、/、%,在算术运算中分别叫做,加减乘除和取余。
(1)注意对于除法运算,如果两个整数相除,得到的结果还是整数,会摒弃小数部分,而不是小数部分四舍五入

cout << 59 / 10 << endl;
结果为5

(2)对于取余,要求左右两边必须为整数类型,且求值符号由分母决定

cout<<233%2.33<<endl;
编译器会报错

cout << 59 % 10 << endl;
结果为9

cout << -59 % 10 << endl;
结果为-9
cout << 59 % -10<< endl;
结果为9
练习
4.4
(((12 / 3) * 4) + (5 * 15)) + ((24 % 4) / 2)
91
先算优先级大的运算符,优先级相同遵循左结合率
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值