2017-10-16 108 views
-6

術語目的是通過C11標準3.15節中定義:如何識別對象用C

對象數據存儲在所述執行環境中, 內容

區,其可以代表值

鑑於以下代碼:

int x; 

int y[10]; 

struct my_struct { 
    int a; 
    int b; 
}; 
struct my_struct z; 

在上面的代碼中,x,yz是不同的對象嗎? z的成員是相同的對象? y的元素是相同的對象?

+3

1)是的。 2,3)是的,但他們也是不同的子對象。 – PSkocik

+0

是的。不是的,因爲「x」,「y」和「z」是不同的「對象」。不是,因爲結構的成員又是獨立的對象。最後是最後一個否,因爲'y'的元素也是單獨的對象。引述的重要部分是「其內容可以代表**值**」。例如,'y [0]'和'y [1]'可以代表一個'int'值,但它們是*不同的*,因此是不同的對象。 –

+0

爲了進一步闡明:出於別名分析的目的,您應該考慮通過它們的父對象訪問子對象作爲對父對象的訪問,因爲這就是編譯器所做的事情。 (請參閱我的問題:https://stackoverflow.com/questions/42352681/strict-aliasing-and-overlay-inheritance)。 – PSkocik

回答

3

在上面的代碼,xy,和z是不同的對象?

是的,它們佔用完全獨立的存儲區域。

z的成員是同一個對象嗎?

不,z.az.b是兩個不同的對象。可以說它們是z的子對象,因爲它們的存儲都包含在整個存儲中,但它不是完全相同的存儲區域。該地區的規模也起着一定的作用。

y的元素是相同的對象嗎?

不,每個元素y是一個單獨的對象。但通過與上述相同的推理,可以認爲它們是y的子對象。

+0

要比較指針,他們必須指向同一個對象或一個對象。那麼,它是否比較同一對象的子對象? –

+0

@MatheusSilva - 如果您有後續問題,請張貼另一個問題。不要評論。 – StoryTeller

3

C標準中術語對象的含義很簡單:一個變量分配在內存中。事實證明,它與在支持OO的語言中使用的對象的定義是相同的。

通常,對象具有某種類型(是有用的),見文本的其餘部分在3.15:

說明當參考,對象可以被解釋爲具有特定類型;見6.3.2.1。


在上面的代碼中,x,y和z是不同的對象?

是的,因爲它們是不同的變量。

z的成員是同一個對象嗎?

它們是z對象的一部分,但同時也是不同的子對象。 ab是不同的對象,但是當結構被稱爲整體時,它們是同一個對象的一部分。

1

圖形:

+–––+ 
x: | | 
    +–––+ 

    +–––+ 
y: | | y[0] 
    +–––+ 
    | | y[1] 
    +–––+ 
    ... 
    +–––+ 
    | | y[9] 
    +–––+ 

    +–––+ 
z: | | a 
    +–––+ 
    | | b 
    +–––+ 

每個xy,和z是對象。因此,每個y[i],z.az.b