2014-09-26 65 views
6

根據ISO/IEC 9899:1999 6.7.5§2,說明符語義C99

每個聲明符聲明一個標識符,並且斷言,當同一 形式的操作數爲顯示的說明符在表達式中,它指定具有 作用域,存儲持續時間和由聲明說明符指示的類型的函數或對象。

我不知道爲什麼表達式突然出現在聲明符語義中。你能給我一些能幫助我理解意義的例子嗎?

回答

4

假設你有一個聲明

int foo[42]; 

聲明部分是foo[42]。每當表達式中出現相同形式的表達式(即foo後跟[後跟表達式])時,該子表達式的類型將爲聲明類型int

換一種方式:至於語法得好,像聲明

int *bar; 

聲明barint *型的,而是宣稱*fooint類型。

對於更復雜的例子,取申報

float (*op[42])(float, float); 

在表達式中,相同的形式的操作數可能看起來像這樣

c = (*op[i])(a, b); 

根據該報價,右手側將有類型float

這意味着

*op[i] 

必須有功能型(我們忽略功能指示符衰減通過後綴()相應的指針類型和函數調用實際工作的指針,而不是指示器的事實)。

這又意味着

op[i] 

必須表示一個函數指針,我們終於在

op 

到來表示函數指針數組,這就是我們可以在申請後綴[]並獲得返回正確的類型。

樂趣,是不是它;)

+0

你的例子很容易理解。謝謝你從心底裏! – 2014-09-27 03:11:36

5

說你聲明:

static int const i, j, k; 

這是一樣:

static int const i; 
static int const j; 
static int const k; 

的聲明符specifer,static int const適用於所有標識符。

您也可以將該邏輯擴展到函數和函數指針。

static int i, (*fun1)(void), fun2(void); 

其是相同:

static int i; 
static int (*fun1)(void); 
static int fun2(void); 

至於出現在表達式部去,有一些評論,在http://c0x.coding-guidelines.com/6.7.5.pdf。它說:

語義

每個聲明符聲明一個標識符,並且斷言時相同的形式的操作數作爲說明符出現在表達式中時,它指定一個功能或對象與範圍,存儲持續時間和聲明說明符指示的類型。

解說

在表達的標識符的形式很可能是相同的是,在說明符。例如,當x所指向的值是必需的時,聲明符* x將在表達式中具有此形式,並且當涉及到數組y的元素時,聲明符y [2]將在表達式中具有此形式。它是聲明標識符的聲明的聲明部分。有一種特殊類型的聲明符的,抽象的說明符,它不聲明標識符

我解釋上面的意思是:

如果聲明:

int *x; 

,並使用*x在一個表達式中,*x的類型是int

如果聲明

static int const *x; 

,並在表達式中使用*x*x類型是static int const

其他參考

Static Variable Declaration (C)

Is [ ] also a declarator (when used in parameter declaration) in C?

C -- Accessing a non-const through const declaration

+0

我沒有在您的示例中看到任何表達式。這些如何連接到表達式? – 2014-09-26 17:20:34

0

所有這一切是說,在給定範圍內像

const int a = 5; // declaration 

那麼操作a聲明中表達類似

x = a + b 

相同的範圍有const int

+0

這是一個簡單的例子,因爲聲明符只是一個標識符 – Christoph 2014-09-26 17:41:31