2009-04-14 61 views
2

我在閱讀有關「我的編程語言」類中的「類型等價」的內容,並且我遇到了C中的一種情況,我不確定。int數組的大小對類型等價性的影響

它描述C'S「類型等效」爲:

C使用類型等價的一種形式,名稱和結構等價之間落下,並且其可以被鬆散地描述爲「名稱等價於結構和聯合的,結構等同於其他一切。「

那麼,如果我有兩個不同大小的數組,但相同的基本類型:

typedef int A1[10]; 
typedef int A2[20]; 

因爲所有我需要的是結構等價,可能這兩個被認爲是結構上等同?在C中,索引集的大小是數組類型的一部分還是不是?

回答

3

不,他們不是。

您可以嘗試sizeof(A1)sizeof(A2)並查看它們是不同的。

2

不,它們不是同一類型。

在C,你不會得到一個錯誤,但在C++中,如果你嘗試,你會得到一個錯誤這樣的:

錯誤C2440:初始化:不能從「詮釋()轉換[ 1024]」到 'INT()[512]'

下面是一些示例代碼

int x[1024]; 
int y[512]; 
/*Create a pointer int[1024] type*/ 
int (*px)[1024] = &x; 
/*Create a pointer int[512] type*/ 
int (*py)[512] = &y; 

int (*py2)[512] = &x; /*<---compiling error in C++ but allowed in C even know it's wrong*/ 

即使知道最後一行被允許在C中, 2種類型被認爲是不同的。另外一個數組與指向數組的指針不同,但正如您所看到的,類型聲明是不同的。

+0

但是在我的書中,它指出指針在C中在結構上是等價的。所以,如果一個數組是指向n個元素的指針,那麼它們在結構上是不是等效的呢? – Mithrax 2009-04-14 19:56:34

+0

數組不是指針 - 它可以在某些情況下「分解」爲指針,但它不等同於指針 – 2009-04-14 19:59:55

0

在源代碼中,在某些上下文中,不同類型的變量在給定表達式中是兼容的,並且編譯器將調用足夠的魔力來執行正確的/期望的事情,例如將數組作爲參數傳遞給期望一個指針。但這並不意味着這些內存佈局是兼容的。看到問題 Pointer vs array in C, non-trivial difference我錯過了。

我不太清楚你的書的意思是「結構等值」,但不知道這可能是指默認的整數提升(但似乎也包括數組?)。但無論如何整數推廣是一個非常重要的問題,你應該花時間理解。下面的printf應根據這些規則來執行:

unsigned int i = 0; 
if (i < -1) { 
     printf("This line is printed!\n"); 
} 

C standard (ISO/IEC 9899:1990)包含具有標題「通常的算術轉換」定義的行爲的部分。標準不是免費的(相反,它的銷售相當昂貴,因爲ISO標準的價格是每頁...),但是如果你搜索這個詞,你應該能夠找到一些有用的信息或報價。這些標準的一些草案是免費提供的,但威脅那些有很大不信任感的人,因爲你不知道到底是什麼改變了最終的標準。