是否左值?

slowgrace 2009-10-01 09:02:14
/*例七*/ 
char *arr[20];
char **parr = arr; //arr作为指针,其指针类型是char **
char *str;

str = *parr; //*parr是指针表达式
str = *(parr+1); //*(parr+1)是指针表达式
str = *(parr+2); //*(parr+2)是指针表达式


上述代码中的*(parr+1),*(parr+2),*parr都不是左值,因为它们对应的结果指针都不具有“指针自身占有的内存”,对么?
...全文
780 114 打赏 收藏 转发到动态 举报
写回复
用AI写文章
114 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2009-10-09
  • 打赏
  • 举报
回复
应该是翻译的问题:
left hand side [of a statement]/right hand side [of a statement] 是确切的“左值/右值”的原意,不知道谁将 lvalue/rvalue 也翻译成了“左值/右值”,其实并不完全相同,这就搞混淆了。

参考:http://blog.chinaunix.net/u2/67765/showart_637369.html
飞天御剑流 2009-10-07
  • 打赏
  • 举报
回复
前段时间回答过相同的问题,粘贴如下:


什么叫左值??左值的概念,在不同版本的C标准中反映了其不断发展的历程。

左值最原始的概念,是把放在赋值运算符左边的表达式叫做左值,但这个原始概念,最多只能说是左值的部分涵义,不是全部涵义。因为,左值分为可修改的左值与不可修改的左值,最显而易见的可修改的左值的例子,是非cv修饰的变量的标识符,而数组名则是一个不可修改的左值,虽然数组名不能作为赋值运算符的左操作数,但它依然是一个左值。左值的原始涵义,只包含了可修改的左值的情况。那么完整定义是什么呢?C89是从对象的角度去阐述的,摘录如下:

An lvalue is an expression (with an object type or an incomplete type other than void) that designates an object.

左值是一个引用某个对象的具有对象类型或者非VOID不完整类型的表达式。虽然不完整类型不是对象类型,但由于它可以通过某种方式补充完整,因此可以作为左值,但void除外,因为void不能被补充完整。

这样的定义将所有可修改和不可修改的左值都包含在内。但是仍存在一个问题,它指出一个左值是对一个对象的引用,那么下面这种情况又应如何结论呢?

char *p;
*p = .......;

显然*p并没有引用任何对象,先勿论这个表达式在运行过程中会产生什么结果,但从语法上说它是完全符合C的语法规则的,*p依然是一个左值。必须对左值定义进行一下修改。

于是,到了C99,左值的定义修改为:

An lvalue is an expression with an object type or an incomplete type other than void;if an lvalue does not designate an object when it is evaluated, the behavior is undefined.

不再限定左值必须引用一个对象,但是规定如果使用了一个没有引用对象的左值,其行为是未定义的。
slowgrace 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 supermegaboy 的回复:]
原始的左值概念的确介意是否拥有一段内存

但左值概念经过发展后,已经不再介意这一点了,一个左值引用的对象是否真的存在已经无所谓了,重要的是,这个左值具有对象或非空不完整类型,强调的是这一点。[/Quote]

supermegaboy,你能否给现在的左值概念一个清晰明确的定义?如果不是我说的“指向对象的表达式”的话?
失落的凡凡 2009-10-07
  • 打赏
  • 举报
回复
为什么不按照它的字面意义来理解它呢?可以放在等号左边的就是左值,只能放在等号右边的就是右值。

区分“不可更改的左值”和“右值”是编程时是没有意义的。
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
呵呵
那用什么?赝?准?义?
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复
是,可以这么认为。不过“虚”“伪”这两个东西用在这里太“虚”太“伪”,呵呵。
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 107 楼 supermegaboy 的回复:]
我意思并不是说发生了矛盾啊,而是想表明现在的左值观念不再象以前那样强调引用的对象。
[/Quote]

你的意思是以前强调的是具有真实含义的对象
现在也可以是一个“虚”的对象或一个“伪”对象?
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复
我意思并不是说发生了矛盾啊,而是想表明现在的左值观念不再象以前那样强调引用的对象。
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 supermegaboy 的回复:]
引用 99 楼 slowgrace 的回复:
那么,我改改。

左值这个概念是为了让程序员了解一个表达式的计算结果是否拥有她可以知道地址的内存。

还是不对。

原始的左值概念的确介意是否拥有一段内存,但左值概念经过发展后,已经不再介意这一点了,一个左值引用的对象是否真的存在已经无所谓了,重要的是,这个左值具有对象或非空不完整类型,强调的是这一点。例如:

double i;
int *p = ( int* )&i;    /*p并非真正指向一个int对象,但*p依然是左值*/
int *p;
*p = .........;      /*p并没有指向啥,但*p还是左值*/[/Quote]

我觉得好象没什么矛盾
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复
是的,这个90与99有区别,可以视作一种发展。
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 supermegaboy 的回复:]
引用 99 楼 slowgrace 的回复:
那么,我改改。

左值这个概念是为了让程序员了解一个表达式的计算结果是否拥有她可以知道地址的内存。


还是不对。

原始的左值概念的确介意是否拥有一段内存,但左值概念经过发展后,已经不再介意这一点了,一个左值引用的对象是否真的存在已经无所谓了,重要的是,这个左值具有对象或非空不完整类型,强调的是这一点。例如:

double i;
int *p = ( int* )&i;    /*p并非真正指向一个int对象,但*p依然是左值*/

int *p;
*p = .........;      /*p并没有指向啥,但*p还是左值*/
[/Quote]

这个89、99有区别吧
我记得你好象说过
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 slowgrace 的回复:]
那么,我改改。

左值这个概念是为了让程序员了解一个表达式的计算结果是否拥有她可以知道地址的内存。
[/Quote]

还是不对。

原始的左值概念的确介意是否拥有一段内存,但左值概念经过发展后,已经不再介意这一点了,一个左值引用的对象是否真的存在已经无所谓了,重要的是,这个左值具有对象或非空不完整类型,强调的是这一点。例如:

double i;
int *p = ( int* )&i; /*p并非真正指向一个int对象,但*p依然是左值*/

int *p;
*p = .........; /*p并没有指向啥,但*p还是左值*/
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 101 楼 supermegaboy 的回复:]
引用 89 楼 slowgrace 的回复:
引用 73 楼 pmerofc 的回复:
这个“L”,
它实际还有Located的意思


谢谢pmerofc的精彩点评,受教了。

另外,请教一哈,这个L还代表“Located”是你的发明,还是一种标准解释?


准确地说,不是located,是locator value,标准的注解:

    The name ‘‘lvalue’’ comes originally from the assignment expression E1 = E2, in which the left operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an object ‘‘locator value’’.
[/Quote]

非常感谢supermegaboy的认真考证
谢谢!
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 89 楼 slowgrace 的回复:]
引用 73 楼 pmerofc 的回复:
这个“L”,
它实际还有Located的意思


谢谢pmerofc的精彩点评,受教了。

另外,请教一哈,这个L还代表“Located”是你的发明,还是一种标准解释?
[/Quote]

准确地说,不是located,是locator value,标准的注解:

The name ‘‘lvalue’’ comes originally from the assignment expression E1 = E2, in which the left operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an object ‘‘locator value’’.
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 slowgrace 的回复:]
那么,我改改。

左值这个概念是为了让程序员了解一个表达式的计算结果是否拥有她可以知道地址的内存。
[/Quote]
我同意
要是加上“这块内存具有类型含义”
可能更全面些
slowgrace 2009-10-06
  • 打赏
  • 举报
回复
那么,我改改。

左值这个概念是为了让程序员了解一个表达式的计算结果是否拥有她可以知道地址的内存。
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 97 楼 slowgrace 的回复:]
我理解:左值这个概念是为了让程序员了解一个表达式的计算结果是否拥有她可以写的内存。
[/Quote]

不一定可以写
也有不可修改的左值
slowgrace 2009-10-06
  • 打赏
  • 举报
回复
我理解:左值这个概念是为了让程序员了解一个表达式的计算结果是否拥有她可以写的内存。
pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 94 楼 slowgrace 的回复:]
引用 73 楼 pmerofc 的回复:
“是否左值?”
这里的“是”其实有两种含义
1.is
2.can be

supermegaboy认为楼主问的那几个表达式是左值
根据的是后一个含义(2.can be)
我认为不是,讲的实际是is not这个含义


不赞同这一点。

左值其实是表达式的一种。如果一个表达式的结果是指向对象的,它就是左值。所以0楼那几个表达式都是左值,因为它们的运算结果都是指向对象的。

所以,它们不是can be,而是is 左值。
[/Quote]

问题在于
如果那样
“左值”这个概念还有必要吗?

我主张把 is 看成左值
是考虑到了这个概念的用处

不能象老谭那样
总发明没用处的概念



pmerOFc 2009-10-06
  • 打赏
  • 举报
回复
[Quote=引用 93 楼 slowgrace 的回复:]
引用 91 楼 hpsmouse 的回复:
另外,请教一哈,这个L还代表“Located”是你的发明,还是一种标准解释?
====

标准一般不解释~~


我不该用“标准”这个词。我的意思是说,这是不是一种由来已久的、大家都知道的解释?
[/Quote]

这不是由来已久的
我的印象这是C语言界的一种意见或建议
但我忘记是在哪里见过这个词了
但原来的词不是Located,
而是同词根的一个单词

加载更多回复(94)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧