欢迎光临散文网 会员登陆 & 注册

左值、右值、复合赋值

2023-04-23 22:44 作者:glimix  | 我要投稿

赋值右结合性

对于运算符的右结合性,我们从初始化与赋值开始。

代码极其简单,但有两个问题需要你回答。

  1. 定义width变量时,它的初始值是多少?

  2. 给width变量赋值后,它的值又是多少?

相信你会随口说出,width的值分别是6与5(表达式的结果),而不是2与3("="右边的第一个数值)。稍加思索,你会发现自己先计算了赋值运算符右侧的整个表达式,然后将结果赋予width变量,我们称这类运算符具有右结合性。

左值与右值

之前我们以盒子的角度讲解了变量存储数据的特性,同样,我们也可以读取变量的值。与现实不同,只要变量这个盒子存在,我们就可以无限次读取,之前的值始终存在。

可以看出,一个变量在不同的语义环境下其意义不同。

  • 赋值时:变量取盒子的存储功能这一概念

  • 读取时:变量取查看盒子中数据的概念

从赋值运算符的角度讲,变量在左侧时代表着写入操作,此时变量是个左值(lval),左值在程序中有一个确切的内存地址以用于写数据;在右侧时代表着读取操作,称为右值(rval)。下面的例子展示了可能的左值与右值表现方式。

显然,你不能将一个变量赋值给一个常数。但是,同一个变量却可以出现在赋值运算符的左右两侧,在左边取盒子存储的概念,在右边取读取盒中数值的概念。

复合赋值语句

虽然像 a=a; 这种语法你几乎不会用,但让a自身发变化是可行的。比如说有一个记录英雄血量的hp变量,当角色获得能量后hp值增加,我们可以这样编写:

对于这种实现,C语言也提供了一种简化的语法,称为复合赋值运算。

这里,我们使用 += 运算符完成了等同的操作,当使用这种简写形式时,不论右侧表达式多复杂,始终要将它们看作是一个整体,并与左侧变量运算求值。

除了+=,*=简写形式,C语言还提供了-=、/=、%=简写运算符,再次对于/=,%=运算进行提醒:除数不能为0。

运行结果

习题

  1. 编写程序,让变量 area 存储矩形面积。

  2. 使用复合赋值运算符,让矩形面积缩小一半。

  3. 观察 Ex2 中的程序,指出变量左右值使用情况。


左值、右值、复合赋值的评论 (共 条)

分享到微博请遵守国家法律