C++菜鸟学习笔记系列(12)——复合表达式基础

简介: C++菜鸟学习笔记系列(12)——复合表达式基础

C++菜鸟学习笔记系列(12)

本期主题:复合表达式基础知识

C++语言为我们提供了一套丰富的运算符,并定义了这些运算符用于内置类型的运算对象时所执行的操作。同时当运算对象时类类型时,C++语言也允许我们指定上述运算符的含义(运算符的重载)。

在介绍后面的算术运算符之前我们先来了解几个概念。

(1)左值、右值

在C语言中左值和右值的差别并不大,我们可以简单的理解成左值可以位于赋值语句的左侧而右值则不能。但是在C++语言中,这两个概念之间的区别就不止这么简单了。一个左值表达式的结果可以是一个对象或者是一个函数。我们可以做一个简单的归纳:当一个对象被用作右值的时候用的是对象的内容/值;而当它被用作左值的时候用的是对象的身份/在内存中的位置。

(2)优先级和结合律

复合表达式是指含有两个或多个运算符的表达式。在求复合表达式的值时需要先将运算符和运算对象合理地组合在一起,而优先级和结合律就决定了运算对象的组合方式。


注意:表达式中的括号()无视上述规则,我们可以使用括号将表达式的某个局部括起来使其得到优先运算。


一般来说高优先级运算符的运算对象要比低优先级运算符的运算对象更容容易紧密地组合在一起。(例如我们最常见的算术运算符中乘除运算符的优先级高于加减运算符,则在运算过程中乘法和除法的运算对象会先组合在一起,然后才能考虑加法和减法的运算对象)如果两个运算符的优先级相同,则这时候的组合规则就由结合律决定了,所有的算术运算符都符合左结合律,这意味着如果运算符的优先级相同将按照从左向右的顺序组合运算对象。

例如:

x = 18 - 7 - 3 * 2;

上一行代码中的x的值具体是多少呢?我们来简单分析一下,表达式中含有乘法*和减法-运算符,我们根据优先级确定乘法运算符的两个运算对象为3和2,结果为6,则表达式可以变换成:

x = 18 - 7 - 6;

然后我们再来看变换后的表达式,两个减法运算符的优先级肯定是相同的,那么问题来了,我们可以理解为:x =( 18 - 7 ) - 6; 也可以理解为x = 18 - (7 - 6 ) ;那么在编译器中具体是按照哪一种方式进行执行的呢?答案是第一种,我们在两个运算符优先级相同的情况下要考虑结合律,而所有的算术运算符又都满足左结合律,即从左到右的顺序组合运算对象。

(3)求值顺序

优先级和结合律为我们规定了运算对象的组合方式,但是不是运算对象的求值顺序就是这样规定好了呢?答案是否定的,大多数情况下,求值顺序是和优先级、结合律等没有关系的,我们不会也不需要明确的指定求值的顺序。

例如:

int i = f1() + f2();

在上行代码中,我们无法知道具体是先调用函数f1()还是先调用函数f2(),我们只需要知道这两个函数都会在乘法*运算符执行之前被调用就可以了。


这里有两条对于复合表达式处理的小建议:

(1)对于优先级不能确定,或者自己不能够分辨的时候最简单有效的一个解决方法是使用括号来强制表达式的组合关系符合自己的期望。

(2)如果改变了某个运算对象的值,在这个表达式的其他地方不要再使用这个运算对象。

目录
相关文章
|
3月前
|
程序员 编译器 C++
【实战指南】C++ lambda表达式使用总结
Lambda表达式是C++11引入的特性,简洁灵活,可作为匿名函数使用,支持捕获变量,提升代码可读性与开发效率。本文详解其基本用法与捕获机制。
147 46
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
224 12
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
130 0
|
11月前
|
算法 编译器 C++
【C++11】lambda表达式
C++11 引入了 Lambda 表达式,这是一种定义匿名函数的方式,极大提升了代码的简洁性和可维护性。本文详细介绍了 Lambda 表达式的语法、捕获机制及应用场景,包括在标准算法、排序和事件回调中的使用,以及高级特性如捕获 `this` 指针和可变 Lambda 表达式。通过这些内容,读者可以全面掌握 Lambda 表达式,提升 C++ 编程技能。
498 3
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
C++
c++学习笔记02 运算符
C++学习笔记,介绍了C++中的运算符,包括基本的加减乘除、求模、前后置递增递减、赋值运算符、比较运算符和逻辑运算符的使用及其注意事项。
121 6
|
C++
c++学习笔记01 基本知识与数据类型
C++学习笔记,涵盖了C++中的常量定义、数据类型、变量内存大小计算、基本数据类型(整型、实型、字符型、字符串型、布尔型)以及转义字符的使用。
112 4
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
108 4
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
141 1
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
106 0
c++学习笔记05 函数