姓名等同问题

时间:2011-03-17 03:11:43

标签: c equivalence type-equivalence

假设我有:

int a;
int b;

变量ab是否等价(更具体地说,因为基本类型没有类型名称,它们是否可以被视为名称等价物?)

感谢。

3 个答案:

答案 0 :(得分:7)

名称(更恰当地,名义上)等价意味着值具有与其类型的(完全限定)名称所确定的相同类型 - 例如,ab名义上是类型等价,因为它们都有“int”类型。结构等价意味着这些值被认为具有相同的类型,因为它们的类型在结构上是等价的,无论名称如何。名义类型等价意味着结构类型等价,因为命名类型在结构上等同于它自身。您的ab名义上是等效的,因为它们的名称类型相同(“int”)。声称“原始类型没有类型名称”只是假的 - int是类型名称。 int a; int b;int a, b;之间没有区别 - 两者都使用相同(结构和名称)类型定义ab

C的类型系统通常是按名称...例如,即使int *short*具有相同的表示,intshort也是不同的类型,{{ 1}}和struct foo { int x; }是不同的类型,即使它们总是具有相同的表示。

答案 1 :(得分:0)

我发现的一些课堂笔记似乎表明:

int a;
int b;

变量ab 不等同于

但是,用:

int a, b;

变量ab 等同于

答案 2 :(得分:0)

我不认为C采用名称等价。恕我直言,C采用结构等价,结构和联合的例外;对他们来说,使用了名字。确实,这些值与名称等价的类型名称所确定的类型相同,并且这些值被认为具有相同的类型,在结构等价中由结构等效确定。但即使在结构等同性方面,也无论名称如何都无法确定。

基本上,编程语言中的原子类型具有名称,它们在名称等价和结构等价中都使用。差异来自派生类型,例如int *char[10]。确实"原始类型具有类型名称。"而C&C的类型系统正在将派生类型的结构与用户定义的名称(不包括类型同义词)进行比较,即使它们是由用户使用typedef定义的。

C类型系统通常是按结构...例如,int *short *是不同的类型,但int *int *是相同的类型。 struct foo { int x; }struct bar { int x; }不同类型的原因是因为它们具有与用户定义的类型名称不同的结构。类型struct foo *struct foo *是相同的类型,因为它们处于相同的结构中。请不要混淆struct是否为类型结构。它只是用于定义类型名称,更准确地说是C中的结构标记名称。

简单地说,在strutural等价中,类型展开到原子类型名称并进行比较。在C中,类型展开到用户定义的名称。 (展开时,请参考http://www.csd.uwo.ca/~moreno//CS447/Lectures/TypeChecking.html/node3.html)这是不同的。当然,名称等同类型在结构上是等价的,但不是相反的。

对于以下情况:

int x;
int y;

xy,两者都是等效名称和结构等价物。但是,在以下情况中:

int *x;
int *y;

xy是结构等效的,但不等同于名称。即使对于以下情况:

int *x, *y;
在严格的名称等价方案中,

xy不被视为等效,因为此声明仅被视为前一声明的简写。 Ada是采用严格名称对等的着名语言。