C++中关于左值和右值的讨论
某些场合则需要左值。简单说来,当操作符的某个操作数是一个表达式,而我们只需要该表达式的值时,如果该表达式不是右值,那么我们需要取出该表达式的值;比如算术运算中,我们只需要左右操作数的值,这个时候对左右操作数的要求就是右值。任何用作其操作数的左值表达式,都需要转化为右值。如果我们需要的不是该表达式的值,而是需要使用表达式的其他信息;比如我们只是关心表达式的类型信息,比如作为sizeof的操作数,那么我们对表达式究竟是左值还是右值并不关心,我们只需要得到他的类型信息。(按,在C++中,表达式的类型信息也有静态、动态之分,这个情况下,表达式的左值性,也会影响到一些操作符的语义。比如typeid,后有分析)。有些操作符则必需要求其操作数是左值,因为他们需要的是该表达式所引用对象的信息,比如地址;或者希望引用或修改该对象的值,比如赋值运算。
根据分析,我们可以总结出哪些表达式在C中是左值,而哪些操作符又要求其操作数是左值表达式: 表1:左值表达式 (From C Reference Manual ) -------------------------------------------------- 表达式 | 条件 | __________________________________________________ Name | Name 为变量名 | -------------------------------------------------- E[k] | \ | -------------------------------------------------- (e) //括号表达式 | e 为左值 | -------------------------------------------------- e.name | e 为左值 | -------------------------------------------------- e->name | \ | -------------------------------------------------- *e | \ | -------------------------------------------------- string literal(字符串字面值) | \ | -------------------------------------------------- 这里的左值表达式在前面有得已经说明。只说明一下其余的几个表达式,e.name,如果e是左值,e.name表示引用对象e中的成员name,因而也是左值;括号表达式不改变e的意义,因而不影响他的左值性。另外函数调用(function call)表达式总是右值的。需要特别强调的是string literal,前面已经说明它是左值,在C中具有类型char [N],而在C++中类型则为const char[N]. C中之所以为char [N]类型,主要是保持向前兼容。C++中的左值表达式要更为复杂,但是C中左值表达式,在C++中依然是左值的。 1.5.1要求操作数为左值的操作符有:&(取址运算)(其操作数也可以是函数类型);++/——:赋值表达式的左操作数。另外还有一点需要提及的,在数组到指针转换(array-to-pointer conversion )中, C89/90中要求数组必须是左值数组才能执行该转换。
c[0]相当于*(?+0); 然后表达式c从char[2]类型的左值转换为一个char*的右值,该右值代表了数组首元素的地址;
表达式f()。c[0]相当于*( (f()。c)+0 ),然而在这里f()。c是一个右值数组,在C89/90中,因此上述表达式是非法的;而在C99中,array to pointer conversion已经不 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |