假设我有:
int a;
int b;
变量a
和b
名称是否等效(更具体地说,由于原始类型没有类型名称,它们是否可以被视为名称等效)?
谢谢。
假设我有:
int a;
int b;
变量a
和b
名称是否等效(更具体地说,由于原始类型没有类型名称,它们是否可以被视为名称等效)?
谢谢。
名称(更准确地说,名义上的)等价意味着值具有与其类型的(完全限定)名称确定的相同类型——例如,a
名义上b
是类型等价的,因为它们都具有“int”类型。结构等价意味着这些值被认为具有相同的类型,因为它们的类型在结构上是等价的,无论名称如何。名义类型等价意味着结构类型等价,因为命名类型在结构上与其自身等价。你的a
and b
, 名义上是类型等价的,因为它们具有相同的名称(“int”)。“原始类型没有类型名称”的说法完全是错误的——int
是一个类型名称。int a; int b;
int a, b;
a
并且b
具有相同的(结构和名称)类型。
C 的类型系统通常是按名称命名的……例如,int *
andshort*
是不同的类型,即使int
和short
具有相同的表示形式,struct foo { int x; }
并且struct bar { int x; }
是不同的类型,即使它们总是具有相同的表示形式。
我发现的一些课堂笔记似乎表明:
int a;
int b;
变量a
和名称b
不等价。
但是,随着:
int a, b;
变量a
和b
名称等价。
C 采用除结构和联合之外的结构等价;对于这些类型,使用名称等价。确实,这些值具有与它们在名称等效中的类型名称所确定的类型相同的类型,并且这些值被认为具有与由结构等效中的结构等效确定的类型相同的类型。但即使在结构等价中,也无法确定无论名称如何。
基本上,编程语言中的原子类型具有名称,它们用于名称等价和结构等价。区别来自派生类型,例如int *
or char[10]
。确实“原始类型具有类型名称”。C 的类型系统将派生类型的结构与用户定义的名称进行比较,不包括类型同义词,即使它们是由用户使用typedef
.
C的类型系统一般采用结构等价。例如,int *
和short *
是不同的类型,但int *
和int *
是相同的类型,即使没有将名称归因于指针。其原因是不同struct foo { int x; }
的struct bar { int x; }
类型是因为它们具有不同的结构,直到用户定义的类型名称。类型struct foo *
和struct foo *
是相同的类型,因为它们具有相同的结构。请注意,它struct
不仅定义了类型的结构,还定义了名称,更准确地说是结构标签名称。
简单地说,在结构等价中,类型被展开为原子类型名称并进行比较。在 C 中,类型被展开为名称,包括用户定义的名称struct
或union
。(展开请参考http://www.csd.uwo.ca/~moreno//CS447/Lectures/TypeChecking.html/node3.html)这就是区别。自然,名称等价类型在结构上是等价的,但反之则不然。
对于以下情况:
int x;
int y;
x
和y
名称等价物和结构等价物。但是,在以下情况下:
int *x;
int *y;
x
并且y
是结构等价的,但不是名称等价的。即使对于以下情况:
int *x, *y;
x
并且y
在严格的名称等价方案中不被认为是等价的,因为这个声明被认为只是前一个声明的简写。Ada 是一种采用严格名称对等的著名语言。