那么关于赋值运算呢,我们还有几个附加说明。 那么第一项附加说明呢是关于表达式。 那么大家在之前呢已经碰到过很多个表达式了。那么什么是表达式呢? 其实啊,表达式就是指程序中由 运算符、操作数和括号等等等等 所组成的这种计算式。我们平常见的计算式都属于表达式。 那么表达式呢是计算求值的一个基本的单位。 我们举几个例子,大家就明白了。比方说,那么a,b,c如果都是变量的话,a*b +c,那这就是一个典型的表达式。123<10, 这是由字面常量所组成的一个表达式。再看这个,字符a’ *3.14 f,这就表明了字符a是一个字符型的数,那么3.14f呢是一个float型的数。 啊然后呢,我们后面加了一个判例等于等于,这个大家在写f语句的时候碰到了, 这个呢也是一个表达式。最后一个,a=b,这是一个 赋值语句。我们特别想要强调的就是这个, 赋值语句也是一个表达式。在这儿,我需要特别说明一下,因为在 好多语言里头啊,这个赋值语句并不算是一种运算符,但是在C语言里面, 赋值语句被算作了一种运算符。啊,所以说a=b 更毫无疑问的就是一个表达式了。那么这还需要强调的一点呢就是说, 所有的表达式都是有值的。因为表达式 就是用来计算求值的基本单位,所以说它肯定是要有值的。 我们需要强调的是呢,赋值语句其实也是 有值的。什么意思呢?看个例子我们就明白了。 看这个程序。在这个程序里头呢,有两个cout的语句。 每一句cout的语句都打印一个表达式,这个表达式是一个赋值表达式。 i是一个变量,啊,i=10,这是一个表达式。我把它括起来,如果不括起来的话会发生语法错误。 我们把它括起来,以表示这是一个统一的一个表达式。 那么,我们就要把这个表达式的值给它打印出来。那么第二行呢, i=i+i,也是一个表达式,我们把它的值打印出来 啊,那么计算的结果就是这样的。我们可以看到,i=10,这个表达式 所对应的值呢,就是10。那么i+i这个表达式所对应的值呢 就是20.由这个例子我们可以看出来两点,第一点 赋值语句所组成的表达式,也是有值的。那么赋值语句 所组成的表达式的值是什么呢。这值是多少呢 通过这个赋值符号所传送的这个值 表达式的这个值。比方说,i=10,那么通过赋值符号 那么,所以说整个表达式的值就是10 那么在这儿呢,i=i+i 最后这个表达式的值就是20 这是我们想强调的第一点。赋值语句 也是一种表达式。赋值语句也是有 返回值的。这是第一点。那么第二点,复制表达式啊, 不仅仅写成我们习惯看的样子。我们很习惯看这种 a=a+3。那么像这种的赋值 语句,还有另一种写法。就是可以把它写成这样子,a+=3 a+=3是一种什么写法呢 这被称为复合赋值运算。什么叫复合赋值运算呢 就是指在赋值符号前面加上其他的运算符号,跟其他的运算符号一起,就组成了这样的一个语句。 这就是一个复合的赋值运算。 有同学可能问了,那这两种运算方式有什么不同啊, 啊,没什么不同。只是呢,左边的这一种是对右边的这一种的简写 那么同样,我们可以看到其它一些复合赋值运算,比如说 x*=y+8,那么这个表达式呢,实际上就相当于x= x*(y+8).。x%=3,实际上呢就相当于x =x%3。在我们这个课上呢,如果同学们愿意使用这个方式 那也没有什么问题。你可以去用 不愿意使用这种方式呢,那完全可以使用这种方式。不对它的区别进行讨论 OK,这是关于复合表达式。这是第二点需要附加说明的 第三点需要附加说明的,关于连续的赋值运算。我们都知道在C程序里头 我们可以连续进行赋值运算,比方说,a=b=5 a=b=c=5都是连续的 赋值运算。在这儿呢我们需要强调一下,对于 有多个运算符号包括赋值符号 所组成的这种长长的表达式而言。它既然包含了多个运算符号 那么就存在一个运算符号 优先级的问题。什么叫运算符号优先级啊 就像我们在写加减乘除的四则运算的时候 如果把加减乘除写在同一个四则运算 式子里头。我们会先算乘除再算加减 这就叫运算符优先级。就证明乘除的运算符优先级要高于加减 那么,对于同一个运算符,比方说在这个式子里头我们都是用的赋值运算 那么按照什么顺序去呢。对于赋值运算来言,采用右向左的 什么意思呢,就是优先算右边的, 然后再算左边的。 比方说,对于这个式子,a=b=c=5 先去给c赋值附完值以后 因为c=5也是一个表达式, 这个表达式的值就等于5 然后呢再把这个5附给b。给b赋值以后,同样b等于5这又是一个表达式 再把这个表达式的值附给a。这就是这个的一个运算过程。所以说, 优先算右边的,从右边往左算。啊,所以说我们要由右而左的结合顺序。 那么在这儿还是要强调。那么 在,嗯,定义变量的时候啊,我们不能采用这种方式, 这是不允许的,编译呢就出错了。这个大家要记得。 那么作为一个例子。我们来看一下这个表达式, 对于这个表达式而言呢,它其实同时出现了多种的运算符号。比方说, 赋值运算,加号,然后呢,括号。同时出现了好几种运算符号。 那么既然出现了多种运算符号,我们就必须要考虑运算符优先级的问题。 那我怎么知道这些运算符哪个优先级高呢。没关系, 几乎在任何一本C++语言或者C语言的书上, 它都会有一个运算符优先级的列表, 在里面清晰的列出了运算符的优先级。那么如果我们查一下的话我们就会发现其实 赋值运算的优先级是非常非常低的。所以在这个表达式里头,肯定我们要先算右边的 这一系列的东西。如果对于这个表达式呢 按照我们的习惯我们都知道,要先算括号。因为括号的优先级比加号要高。 先算b=4,执行完之后b=4。再算c=6,执行完之后c=6。 那因为b=4这个表达式值是4。c=6这个表达式的值是6, 所以最后a呢,就等于4+6,a就变成了10。这就是这个表达式的一个 计算。在这还想说明的一点呢,就是说,有的时候啊,有一些程序里面 会把复合赋值运算和其他的运算符号啊写在一起,从而使情况变得比较复杂。 稍微举个例子 比方说对这个表达式,a+=a- =a*a, 假设现在当前a的值是12,那么对于这样一个表达式,我们应该怎么去计算呢。 这个时候就要耐下心来慢慢来算。 不要着急。那既然对于这样一个表达式,我们都知道连续的赋值运算 是按照从右而左的结合顺序,也就是说我们要先算右边的 表达式。a-=a*a。这个我们就可以做一个 转换。我们就知道它可以转换成a=a-a*a, 啊因为这时候a=12 所以呢,这个表达式呢实际上是12-12*12那么最后的结果呢 是负的132。有了这个132之后呢我们再去算右边的 这个复合赋值运算。那么a+=-132 其实就相当于a=a+(-132) 啊因为这个时候,a已经等于-132了。 所以说最终,这个表达式实行完毕以后,a呢,等于-264。这就是整个这个表达式的值。 啊我们是不是,是不是这样的表达式算起来非常的麻烦啊。 对不对,读起来也是很麻烦。所以,在这我要强调一点, 在我们的程序里,至少在这个课上面, 请你不要故意写这么复杂的表达式。为什么呢,因为它会影响程序的可读性, 像这样的表达式我们不如,明明白白把它写出来。这样对程序的可读性,有很好的提升。 在这儿稍微多说一句。有的同学在论坛里面讨论,为什么这么重视程序的可读性啊。这个很简单。 容易被别人读懂的程序,才能 被长久的维护下去。你写出来的程序才具有生命力。 为了让你写的程序更具有生命力,请你把它写的易于被别人读懂。 OK。这是关于赋值运算,我们就将这么多。