title: c++学习之表达式
date: 2020-10-17 15:17:00
categories: 分类
index_img: /img/articles/vim.jpg
tags:
- 标签1
- 标签2
本文对《Primer C++》中的表达式的零碎知识点进行记录与梳理
表达式
基础
- c++的表达式要不是右值,要不是左值。当一个对象被用作右值时,用的是对象的值(内容),当一个对象被用作左值时,用的是对象的身份(在内存中的位置)。
- 对于没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,则会引发错误,并产生未定义的行为,比如,
<<
运算符没有明确定义何时以及如何对运算对象求值:
int i =0;
cout << i << " " << ++i << endl;
//error: 表达式的结果是未定义的
//编译器可能先求++i,再求i的值,也可能先求i,再求++i
int j = f() + g() * h() + k();
//对于函数f、g、h、k的调用顺序,没有明确的规定
//如果某几个函数会改变同一个对象的值,则该表达式是error,将产生未定义的行为
- 对于处理复杂的表达式,原则是:a、使用括号来强制让表达式的组合关系符合程序逻辑的要求。b、如果改变了某个对象的值,在表达式的其他地方不要再使用该对象。
逻辑与关系运算符
- 短路求值:逻辑与(
&&
)、逻辑或(||
)运算符都是先求左侧的运算对象的值,再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时,才会计算右侧运算对象的值。
递增与递减运算符
- 建议使用前置版本的递增或递减运算符(
++i,--j
),减少使用后置版本(i++,j--
)。因为后置版本需要将原始的值存储下来以便返回,如果我们不需要修改前的值,那么后置版本的操作就是一种浪费。对于复杂的迭代器类型,这样的额外工作消耗将很大。
位运算符
- 位运算符的对象是整数类型,且整数类型可以是有符号的,也可以是无符号的。如果运算对象为有符号整数,且为负值,则位运算符如何处理运算对象的符号位,依赖于机器平台的实现。c++标准中对于符号位没有明确的规定,因此,建议仅将位运算符用于处理无符号整型。