- 论坛徽章:
- 0
|
原帖由 whyglinux 于 2006-5-5 23:42 发表
>> C标准没有明确定义"rvalue"(只在脚注中提到)
>> 因为标准也像其他很多东西一样并没有精确定义。
确实是这样的,特别是对于 C 语言来说更是如此。
正因为 "rvalue" 不 ... >> C标准没有明确定义"rvalue"(只在脚注中提到)
>> 因为标准也像其他很多东西一样并没有精确定义。
确实是这样的,特别是对于 C 语言来说更是如此。
正因为 "rvalue" 不是在 C 标准正文中规定的正式术语,所以在标准中出现的时候也尽量避免使用这个术语,而是一般说成“not an lvalue” 或者其它否定形式。
可能对此有不同的看法,不过我认为可以把 “not an lvalue” 等价于 rvalue。在 IBM 提供的资料上看到这么一句话:Rvalues always have complete types or the void type. 支持我的上述看法。不管 C 标准是怎么对待 rvalue 的,实际中它已经变成了一个正式用语。
嗯,其实有这么多不同的理解就是由于标准没有定义清楚的缘故。只要基本意思一样也就无妨了。而且有的两种理解的同时存在呢,呵呵。刚刚从whyglinux兄所给的IBM链接找到这么一句话(不过是针对C++的),还是觉得理解第一吧,呵呵。
链接是IBM AIX Compiler Information(感谢whyglinux提供这么好的资源链接)
On the other hand, in C++, a function call that returns a reference is an lvalue. Otherwise, a function call is an rvalue expression. In C++, every expression produces an lvalue, an rvalue, or no value.
>> 能不能这样用是由assignment operator的属性决定的,赋值运算要求其left operand是modifiable lvalue,right operand 是rvalue。
还要再加上一个条件,即左右操作数的类型是否一致,或者右操作数的类型是否可以默认转换为左操作数的类型。
嗯,谢谢指出。
>> &i = 1;
>> &i is not a modifiable lvalue.
更严密的说法是:&i is not an lvalue。或者直接说 &i is an rvalue。
好,接受。谁让我在 &i = 1; 前明确加了一个 int i; 呢。呵呵。
[ 本帖最后由 kernelxu 于 2006-5-6 13:37 编辑 ] |
|