2011-03-17 92 views
3

假設我有:名稱等價問題

int a; 
int b; 

是變量ab名當量(更具體而言,由於原始類型沒有類型名,它們可以被視爲等同名稱)?

謝謝。

+0

什麼語言你在說什麼? – 2011-03-17 03:12:55

+0

我說的是C.我只是增加了對C標記爲你:) – 2011-03-17 03:19:44

+2

你的問題沒有任何意義... – Nix 2011-03-17 03:28:09

回答

6

名稱(更恰當,標稱)等價意味着這些值具有與其類型的(完全限定)名稱所確定的相同類型 - 例如,ab名義上是類型等效的,因爲它們都具有「int 「類型。結構等價意味着這些值被認爲具有相同的類型,因爲它們的類型在結構上是等同的,而不管名稱如何。名義類型等價意味着結構類型等價,因爲命名類型在結構上與自身等價。您的ab名義上類型相同,因爲它們的名稱(「int」)具有相同的類型。聲稱「原始類型沒有類型名稱」僅僅是錯誤的 - int是一個類型名稱。並且int a; int b;int a, b;之間沒有區別 - 它們都定義了ab,它們具有相同(結構和名稱)類型。

C'S型系統通常是名...例如,int *short*是不同的類型,即使intshort具有相同的表示,並struct foo { int x; }struct bar { int x; }是不同的類型,即使他們總是有相同的表示。

+0

我會接受這個,並假定教授是錯的。過去的課堂測試答案表明你是對的。 – 2011-03-18 04:03:22

0

我發現了一些課堂筆記似乎表明有:

int a; 
int b; 

變量ab名等同。

然而,隨着:

int a, b; 

變量ab名等同。

+0

無論是這些課堂筆記還是你對它們的解釋都是錯誤的 - 從這樣的區分中可能會有什麼感覺或價值?在這兩種情況下,'了'和'B'具有相同的類型(即「INT」),所以他們當然是同等類型,以及排序類型等價的是名稱相同 - C中視爲了''和'B'的相同的類型,因此它們之間的操作不需要強制轉換或促銷,這正是因爲它們具有相同類型的名稱 - 「int」。 OTOH如果其中一個被宣佈爲「短」,即使「int」和「short」是相同的大小,他們也會有不同的類型。 – 2011-03-17 06:54:27

0

我不認爲C採用名稱等價。恕我直言,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

簡單地說,在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是採用嚴格名稱對等的着名語言。