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)如果改变了某个运算对象的值,在这个表达式的其他地方不要再使用这个运算对象。

好了这次我们就介绍到这里了。

注:虽然这篇博客的内容十分简单,但是大家若有转载还请标明出处!

猜你喜欢

转载自blog.csdn.net/wxc_1998/article/details/83064365