根據ISO/IEC 9899:1999 6.7.5§2,說明符語義C99
每個聲明符聲明一個標識符,並且斷言,當同一 形式的操作數爲顯示的說明符在表達式中,它指定具有 作用域,存儲持續時間和由聲明說明符指示的類型的函數或對象。
我不知道爲什麼表達式突然出現在聲明符語義中。你能給我一些能幫助我理解意義的例子嗎?
根據ISO/IEC 9899:1999 6.7.5§2,說明符語義C99
每個聲明符聲明一個標識符,並且斷言,當同一 形式的操作數爲顯示的說明符在表達式中,它指定具有 作用域,存儲持續時間和由聲明說明符指示的類型的函數或對象。
我不知道爲什麼表達式突然出現在聲明符語義中。你能給我一些能幫助我理解意義的例子嗎?
假設你有一個聲明
int foo[42];
聲明部分是foo[42]
。每當表達式中出現相同形式的表達式(即foo
後跟[
後跟表達式]
)時,該子表達式的類型將爲聲明類型int
。
換一種方式:至於語法得好,像聲明
int *bar;
不不聲明bar
是int *
型的,而是宣稱*foo
是int
類型。
對於更復雜的例子,取申報
float (*op[42])(float, float);
在表達式中,相同的形式的操作數可能看起來像這樣
c = (*op[i])(a, b);
根據該報價,右手側將有類型float
。
這意味着
*op[i]
必須有功能型(我們忽略功能指示符衰減通過後綴()
相應的指針類型和函數調用實際工作的指針,而不是指示器的事實)。
這又意味着
op[i]
必須表示一個函數指針,我們終於在
op
到來表示函數指針數組,這就是我們可以在申請後綴[]
並獲得返回正確的類型。
樂趣,是不是它;)
說你聲明:
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?
我沒有在您的示例中看到任何表達式。這些如何連接到表達式? – 2014-09-26 17:20:34
所有這一切是說,在給定範圍內像
const int a = 5; // declaration
那麼操作a
聲明中表達類似
x = a + b
相同的範圍有const int
。
這是一個簡單的例子,因爲聲明符只是一個標識符 – Christoph 2014-09-26 17:41:31
你的例子很容易理解。謝謝你從心底裏! – 2014-09-27 03:11:36