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

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?
...全文
359 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)
该课程由付强老师主讲,系统的、全面的、具体的讲解了java入门的知识。可以使初级的学员入门。Java入门Java的历史、Java的版本、Java的优势、软件行业前景Java开发环境搭建、编写Java入门练习虚拟机的运行机制、Java的平台无关性、虚拟机垃圾回收机制基础语法关键字、标识符、Java数据类型分类、基础数据类型、取值范围变量、常量、三种注释、生成doc文档、运算符、表达式if语句、switch语句、嵌套判断for语句、while语句、do-while语句、嵌套循环类和对象面向过程和面向对象的区别类的构成、访问修饰符、对象的内存分配this关键字、按值传递与按引用传递、对象的初始化顺序高级类特性类的继承、父子类的初始化顺序、单继承性方法的覆盖、重载、super关键字、多态、instanceof关键字、强制类型转换、static关键字、final关键字数组和枚举一维数组的应用及内存分配多维数组的应用及内存分配数组的复制、数组的按引用传递排序算法:冒泡、直接选择、插入选择、希尔、快速、归并、堆排序Arrays工具类的应用枚举类型的应用常见类的使用Object类的底层及应用、Objects类String类的底层及应用、正则表达式StringBuffer和StringBuilder的底层及应用Math类的应用、包装类的应用日期类的应用:Date、DateFormat、Calendar、LocalDateTime、Instant、LocalDate、MonthDay、ZonedDateTime、YearMonth、新旧日期转换BigInteger和BingDecimal、DecimalFormatSystem类、Scanner类抽象类和接口抽象类的规则及应用接口的规则及应用默认方法、静态方法、函数式接口、Lambda表达式异常异常的定义异常的处理:抓(try-catch-finally)、抛(throws)异常的分类、自定义异常的应用、throw关键字集合框架集合框架结构:接口、实现类Collection接口的方法、Set接口的方法、List接口的方法、Map接口的方法Array、Linked、Hash、Tree底层实现原理泛型的作用、Collections工具类、历史集合类I/O流Path类的原理及应用、Files类的原理及应用文件字节流FileInputStream的原理及应用对象类、缓冲流、数据流的原理及应用字符流的原理及应用多线程进程与线程的概念、查看线程对象Java内存模型线程的创建与启动:扩展Thread类、实现Runnable接口、实现Callable接口、线程池线程状态的转换:新建、就绪、运行、阻塞、死亡线程的调度:sleep、yield、join、interrupt、wait后台线程、定时任务线程的并发与同步、同步锁、同步块、线程安全的类Lock接口、CAS、volatile修饰符内部类成员内部类、本地内部类的应用匿名内部类的原理及引用、Lambda表达式设计模式基础设计模式概念、框架概念7大设计原则:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、里氏替换原则、合成复用原则单例模式、工厂模式、模板模式、代理模式、装饰模式、适配器模式、外观模式、策略模式、观察者模式、命令模式、备忘录模式、观察者模式反射反射包Class类的使用反射获取类属性、方法、构造器通过反射创建类对象/通过反射调用方法反射的应用

69,368

社区成员

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

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