C语言非常道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.1 左值和左值转换

表达式在C语言里的用途不单单是描述算术或者逻辑运算,实际上具有多种作用,有的用于指示或者说代表一个程序运行时的变量,例如在表达式n = 1和sum = 0中,表达式n和sum就各自指示或者说代表一个变量。

原则上,指示一个变量的表达式称为左值。因此,在表达式n = 1、sum = 0及n<=100中,子表达式n和sum都是左值。

既然左值也是表达式,那我们直接用“表达式”好了,为什么还要发明一个新的术语呢?原因很简单,很多运算符需要它的操作数是一个代表变量的表达式,例如运算符=要求它的左操作数必须是一个代表变量的表达式。使用术语“左值”可以使我们的描述变得更简洁,例如,“运算符=的左操作数必须是一个左值”。

因为左值代表程序运行时的一个变量,所以它被视为变量的“定位器”。可想而知,运算符=的左操作数必须是一个左值。有鉴于此,要判断一个表达式是否为左值,可依据它是否能够位于运算符=的左侧,而据说这也是它为什么被称为“左值”的原因。

不过,左值并不一定非得位于赋值运算符的左边,实际上,它可以位于表达式的任何位置,因为左值的定义仅仅强调它代表着程序运行时的变量。

表达式n = 1是把数值1赋给左值n,在这里,n维持它左值的身份不变,因为它必须代表一个变量。但是在表达式n<= 100里,n不能再保持它原来的身份,因为我们不能说“用左值n和数值100做比较”,左值是代表变量的表达式,不是数值,只有数值才能和数值比较。

除非另有指定,如果一个运算符的操作数是个左值,则将它替换为该左值所代表的那个变量的存储值,这称为左值转换。在C语言里,左值转换是非常重要的概念。

来看表达式n<= 100,基于上述规定,因运算符<=的操作数n是一个左值,所以必须将它替换为它所代表的那个变量(变量n)的存储值。这样一来,运算符<=的左右操作数现在都是数值,可以进行比较操作。

在C语言里,左值转换是非常普遍的,但也有少数运算符的操作数例外,例如在表达式n = 1和sum = 0中,左值n和sum就不存在左值转换而保持它原来的左值属性。因为按照C语言的规定,如果一个左值是赋值运算符的左操作数,则不发生左值转换。想想看,如果发生了左值转换,则将出现把一个数值保存到另一个数值的情况,这是荒谬的。至于其他不发生左值转换的特殊情况,我们将在遇到的时候再予以说明。

练习1.2

1.什么是左值?如果声明了一个变量m,则对于表达式m = 3, m是左值吗?3是左值吗?为什么?

2.选择题:表达式num = 26的意思是( ),它在程序运行时执行的动作是( )。

A.将数值26写入变量num

B.将数值26赋给左值num

C.变量num存储的内容是26

3.什么是左值转换?为什么要进行左值转换?