2013-08-29 64 views
2

正如我在C類標準的ADRESS常數是有資格這樣寫着:什麼是const限定符的正確使用?

int * const ptr

我問我自己,我會工作int const i太多,而不是const int i

它做到了。

當我注意到他們是平等的時候,我只是稍微想了一下,以得到const的表現。我做這樣的東西在不同的編譯器

int * const * pPtrint const * ptr, 我接到通知,他們都把const,彷彿定義是:

「常量資格類型在它的左邊,就像有沒有類型的左邊,它應該quallifie右邊的部分「

但我在標準中找不到任何關於此的內容。 標準中的每個示例都是在聲明開始時寫入const或者在static部分的後面。

(什麼,至少不會拒絕我的建議...)

那麼,爲什麼大家的allmost使用常量在聲明的開頭,因爲它會更理解我提到的方法是什麼?

如何根據編譯器支持這兩種方式的假設,正確標識標識符爲const

+0

嗯,我認爲人們傾向於使用「const int的」更很簡單,因爲它更自然一點,以創造出比整型常量一個常量整數,如果讓任何SENCE – Fenixp

+1

這是基於意見的。人們都這樣做。我更喜歡'int const i',因爲當你開始拋出'*'的時候它的意外較少。但是其他人不會,語言也允許這兩種。 –

+0

@湯姆坦納我upvoted,但主題它自己不是意見的基礎上,因爲我要求,標準說什麼! – dhein

回答

2

那麼,爲什麼幾乎每個人都在聲明開始時使用const,因爲我提到的方式會更容易理解?

這只是一種編碼風格,它們都是有效的語法。

C11§6。7點聲明

語法

聲明:

聲明-符INIT-說明符-listopt;

static_assert申報

聲明-指示符:

存儲類說明符聲明-符選擇

類型說明符聲明-符選擇

類型限定符聲明-specifiers opt

功能說明符聲明 - 符選擇

對齊說明符聲明 - 符選擇

的init聲明符列表:

初始化聲明符

的init聲明符列表時,init聲明符

INIT聲明符:

說明符

聲明符=初始化

通知的我用線粗體類型說明符是關鍵字等int,或charvoid類型限定符constvolatile

關鍵字

根據標準,聲明指定符是遞歸定義的,這就是爲什麼const int iint const i都是有效的:

 int   const  i; 
//  |    | 
//type-specifier type-qualifier 
//  \______________/ 
//    | 
//  declaration-specifier 

     const    int  i; 
//  |     | 
//  |   type-specifier 
//  |     | 
//type-qualifier declaration-specifier 
//  \__________________/ 
//    | 
//  declaration-specifier 
+0

我不明白「遞歸定義」的意思。 – dhein

+0

@Zaibis我加了一張圖來解釋一下,更清楚了嗎? –

0

經驗法則:移動const超過*有所不同。否則它不會。

+0

多數民衆贊成在什麼即時通訊用不同的話說,甚至不是一個答案。+它甚至沒有那個具體的我的問題,所以倒票。 – dhein

+0

OP帖子意味着在'*'兩邊移動'const'是一個樣式問題。這篇文章正確地表明,它的風格問題更多的是代碼更改。 – chux

+0

@chux我沒有說這個。我只是說'const int'等於'int const'其他所有其他地方實驗 – dhein

0

哇,有很多「常量」回事。


int * const foo1 

foo1是 「常量指針爲int」。 foo1的值是恆定的。 foo1指向可能會改變。


int const foo2 
const int foo3 

foo2foo3是相同的類型 - 無論是正確的 - C允許兩者intconst的順序是樣式選擇。在這兩種情況下,標識符都是不變的。根據我的經驗,const首先是更常見的。因此我傾向於遵循現有技術。此外 - 只要與模塊一致,我就可以找到它。 在這兩種情況下,人們希望找到像const int foo3 = 7;


但也需要混亂的一些解體的初始化。
[編輯答案如下]

// OP's experimented with these 
int * const * foo4; 
int const * foo5; 

OP推測與「常量資格類型在它的左邊,就像是沒有類型在它的左邊,應當quallifie右側部分」。這是可以解釋的這些2,似乎適用於其他樣本:

foo4是「指向const指針的int指針」。
foo5是「指向const int的指針」。

其它樣品:

int * const foo6; 
const int* foo7; 
int const * const foo8; 

foo6是 「常量指針爲int」。
foo7是「指向const int的指針」 - 與foo5相同。
foo8是「const const指針」。

foo6是恆定的,它指向的數據是而不是不變。
foo7不是常數,它指向的數據是作爲常數處理。
foo8是恆定的。它指向的數據被視爲常量。

@ugoren 正確的在後移動const整個*。移動const更改類型。這不是風格差異,而是不同的代碼。


參考:

C11 6.2.5.29「實施例1指定爲‘’浮子*‘’的類型的類型爲‘’指針浮動‘’及其類型類別是指針,而不是一個浮動式。此類型的const限定版本被指定爲''float * const'',而指定爲''const float *''的類型不是限定類型 - 其類型是''指向const限定型float的指針''並且是一個指向合格類型的指針。「

C11 6.7

http://cdecl.org/

+0

我沒有說這些是相同的我jsut說,第一個2是相同的,其他人我只是試驗aorund得到這種行爲 – dhein

+0

@Zaibis「只是試圖有點arround」導致「......他們都對待它,好像定義是:const將該類型限定在其左邊......「對於嘗試哪些變體是不清楚的,因爲它導致了不正確的結論。在我看來,你認爲這兩個是一樣的。更重要的問題仍然存在:將'const'移到'*'的左邊還是右邊會導致不同的類型,而在'int'之前或之後移動它是一個樣式問題? – chux

+0

我甚至沒有談及'*'只是說這個來說明,爲什麼我開始這個想法。 Ofc這導致了不同的結果,正如我所說的「如果它的左邊沒有任何東西......如果它的左邊是一個'*'它指的是它,我不明白你怎麼能不能過濾掉我的問題:x無論如何,第一部分我eddited ... – dhein