“对象类型”是如何定义的?

slowgrace 2009-10-16 09:26:26
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.”

请问如何判断一个type是object type?
...全文
361 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
slowgrace 2009-10-20
  • 打赏
  • 举报
回复
slowgrace 2009-10-18
  • 打赏
  • 举报
回复
准备把本帖结了,对这个问题感兴趣的朋友请移步这个帖子

谢谢supermegaboy和飞雪在这个帖子里的耐心回复,都很有价值,值得好好琢磨。
beckle_ye 2009-10-16
  • 打赏
  • 举报
回复
UP
slowgrace 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 supermegaboy 的回复:]
具有对象类型的意思是说,这个表达式引用一个对象(不管这个对象是否真的存在),&a的类型虽然是指针类型,但&a的结果根本就不是对象!但如果是*&a,就是左值表达式。
[/Quote]

谢谢,问题是,怎么能够知道一个表达式的结果能否引用对象呢?
飞天御剑流 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 slowgrace 的回复:]
那是不是说出了function types和incomplete types外其他所有的类型都是object types.

更进一步说,是不是除了运算结果为function types的表达式和void incomplelte type,其它表达式都是lvalue?

那为何说&a不是lvalue呢?它的运算结果是指针类型啊?指针类型难道不是对象类型么?
[/Quote]

具有对象类型的意思是说,这个表达式引用一个对象(不管这个对象是否真的存在),&a的类型虽然是指针类型,但&a的结果根本就不是对象!但如果是*&a,就是左值表达式。
smallbear923 2009-10-16
  • 打赏
  • 举报
回复
比如int i = 1;
我们说i是一个整数。但是它的类型是int。

应该和对象一样吧。由对象找出它的类型。
beckle_ye 2009-10-16
  • 打赏
  • 举报
回复
关注…
jzd8000 2009-10-16
  • 打赏
  • 举报
回复
指针类型是对象类型。
但&a不是对象类型,它只是返回一个指针类型,只返回一个对象类型.
冻结 2009-10-16
  • 打赏
  • 举报
回复
只听过对象和类型。
没听过对象类型。
slowgrace 2009-10-16
  • 打赏
  • 举报
回复
2楼第一行:出了 -》 除了
slowgrace 2009-10-16
  • 打赏
  • 举报
回复
那是不是说出了function types和incomplete types外其他所有的类型都是object types.

更进一步说,是不是除了运算结果为function types的表达式和void incomplelte type,其它表达式都是lvalue?

那为何说&a不是lvalue呢?它的运算结果是指针类型啊?指针类型难道不是对象类型么?
飞天御剑流 2009-10-16
  • 打赏
  • 举报
回复
Types are partitioned into object types (types that fully describe objects), function types (types that describe functions), and incomplete types (types that describe objects but lack information needed to determine their sizes).
threenewbee 2009-10-16
  • 打赏
  • 举报
回复
是否有效需要程序员保证。

一般用完释放的指针,要拨回 0,或者 NULL

下次判断,不过就是 if (p != NULL) xxx,其实如果 p 是一个野指针,根本判断不了。
threenewbee 2009-10-16
  • 打赏
  • 举报
回复
C/C++语言里面,没有办法知道一个指针指向的地址是否是一个有效的东西。

当然,系统假设 0,以及很低地址的一段区域,以及非数据区域为无效的地址。

C/C++语言很类似低级语言,本质上说C语言只有1种类型,就是字。

类型是编译系统上的概念。强制类型转换完了,就不知道了。

我们看Windows API,经常看到
struts xxx
{
...
uint nResaved1;
uint nResaved2;
}

高版本又来了
struts xxx
{
...
DWORD ExStyle;
uint nResaved2;
}

这说明低版本的xxx和高版本的xxx其实是一个东西。

头文件里面怎么定义,编译器就怎么认为。
而且内存块一样,定义的东西一样,就是一样的。
slowgrace 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 baihacker 的回复:]
类型系统:构造类型的方法,差别类型等价的算法,类型的推理,类型的正确性规则这个整体.
既然是有类型语言,不要忘了类型系统.
[/Quote]

谢谢。可是这个回复,里面的术语 俺全都没见过

有没有可能用通俗的语言回答一下19楼的问题?
baihacker 2009-10-16
  • 打赏
  • 举报
回复
精确的模糊,模糊的精确,对立与统一...
baihacker 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 slowgrace 的回复:]
引用 20 楼 baihacker 的回复:
看我在另一个文章中提到的那个链接.


这个我看过多遍了,因为以前你给别人过这个链接。我最初的左值概念其实就来自你的回复的,因为先入为主,几乎是根深蒂固了。

但是这两天整理笔记,感觉“拥有你可以访问的存储”这个规则其实有点太虚,不好把握。不同的人可以有不同的理解。应该有个更不可置疑的规则或描述,你觉得呢?
[/Quote]

另一个类似的问题是常量表达式.

其实简单地说,就是编译时能确定的量.
但是在规定的时候不是这样,先规定哪些是常量,然后怎么组合的是常量.
C++有专门的一节讲常量表达式.
在C++0x中也出现过constexpr.

注意我在那个链接中提到的一句话:

在程序设计语言中有的是通过形式化地描述,说明什么样的是左值,什么样的是右值.

有的文章也称:表达式所表示的对象的存储为左值,其存储的内容为右值.

能拥有一个访问的存储,这是本质.
在应用到各个语言的时候,问题就不那么简单了.

形式化的描述,再加额外的规定...具体语言中一般是这样.

slowgrace 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 baihacker 的回复:]
看我在另一个文章中提到的那个链接.
[/Quote]

这个我看过多遍了,因为以前你给别人过这个链接。我最初的左值概念其实就来自你的回复的,因为先入为主,几乎是根深蒂固了。

但是这两天整理笔记,感觉“拥有你可以访问的存储”这个规则其实有点太虚,不好把握。不同的人可以有不同的理解。应该有个更不可置疑的规则或描述,你觉得呢?
baihacker 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 slowgrace 的回复:]
引用 18 楼 supermegaboy 的回复:
请问依据什么原则知道:*p的结果是对象,&a的结果不是对象?


例如int *p,p是一个指向int对象的指针,因此*p就是这个int对象。
&a只是一个表达式的值,没有任何存储空间存储这个值。


你依据什么知道 &a 没有任何存储空间存储?
[/Quote]

看我在另一个文章中提到的那个链接.
slowgrace 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 supermegaboy 的回复:]
请问依据什么原则知道:*p的结果是对象,&a的结果不是对象?


例如int *p,p是一个指向int对象的指针,因此*p就是这个int对象。
&a只是一个表达式的值,没有任何存储空间存储这个值。
[/Quote]

你依据什么知道 &a 没有任何存储空间存储?
加载更多回复(8)

69,373

社区成员

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

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