【问题标题】:Name equivalence question名称等效问题
【发布时间】:2011-03-17 03:11:43
【问题描述】:

假设我有:

int a;
int b;

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

谢谢。

【问题讨论】:

  • 你说的是什么语言?
  • 我说的是C。我刚刚为你添加了一个C标签:)
  • 你的问题没有意义...
  • @Nix 你的 cmets 更没有意义(而且不符合语法)。类型等价有两种:结构等价和名称等价。 “int”类型的变量名称等价,因为它们的名称类型相同。
  • 这里的部分混淆是名称等价和结构等价通常被认为是类型系统的属性,而不是单独的值。

标签: c equivalence type-equivalence


【解决方案1】:

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

C 的类型系统通常是按名称命名的......例如,int *short* 是不同的类型,即使 intshort 具有相同的表示形式,而 struct foo { int x; }struct bar { int x; } 是不同的类型即使它们始终具有相同的表示形式。

【讨论】:

  • 我会接受这一点并假设教授错了。班级过去的测试答案表明你是对的。
【解决方案2】:

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

int a;
int b;

变量ab 不是名称等效的。

但是,与:

int a, b;

变量ab 名称等效的。

【讨论】:

  • 无论是那些课堂笔记还是你对它们的解释都是完全错误的——从这样的区分中可能有什么意义或价值?在这两种情况下,ab 具有相同的类型(即“int”),所以它们当然是类型等价的,类型等价的类型是名称等价——C 认为 ab相同的类型,因此它们之间的操作不需要强制转换或提升,正是因为它们的名称具有相同的类型——“int”。 OTOH,如果其中一个被声明为“short”,即使“int”和“short”大小相同,它们也会有不同的类型。
【解决方案3】:

除了结构和联合之外,C 采用结构等价;对于这些类型,使用名称等价。确实,这些值具有与它们在名称等效中的类型名称所确定的类型相同的类型,并且这些值被认为具有与由结构等效中的结构等效确定的类型相同的类型。但即使在结构等价中,也无法确定无论名称如何。

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

C 的类型系统一般采用结构等价。例如,int *short * 是不同的类型,但 int *int * 是相同的类型,即使没有将名称归因于指针。 struct foo { int x; }struct bar { int x; } 是不同类型的原因是因为它们具有不同的结构,直到用户定义的类型名称。 struct foo *struct foo * 类型是相同的类型,因为它们具有相同的结构。请注意,struct 不仅定义了类型的结构,还定义了名称,更准确地说是结构标记名称。

简单地说,在结构等价中,类型被展开为原子类型名称并进行比较。在 C 中,类型展开到名称,包括由structunion 定义的名称。 (展开请参考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 是一种采用严格名称对等的著名语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多