2012-07-23 37 views
2

「const和volatile限定符可能在任何聲明之前。」對於ANSI C這是真的嗎?

我在一個在線測試系列中看到這條語句被標記爲true。 但在標準C(89)我可以看到

declaration: 
    declaration-specifiers init-declarator-listopt ; 
declaration-specifiers: 
    storage-class-specifier declaration-specifiersopt 
    type-specifier declaration-specifiersopt 
    type-qualifier declaration-specifiersopt 
    function-specifier declaration-specifiersopt 
init-declarator-list: 
    init-declarator 
    init-declarator-list , init-declarator 
init-declarator: 
    declarator 
    declarator = initializer 

從上面這條語句可以出來假的幾個聲明似乎。

請幫忙!

編輯:我知道這是不適用於ISO C89或以上,但請爲ANSI建議,以便教育部門與一些證明通知有關問題的錯誤。

+2

您未從語法中粘貼'volatile'和'const'。我們不能說,看着這部分語法。 – alinsoar 2012-07-23 12:46:32

+1

@alinsoar,_impartial_?你的意思是_partial_? – Shahbaz 2012-07-23 12:47:15

+0

雅, - 不完整 – alinsoar 2012-07-23 12:47:46

回答

3

類型限定符聲明-說明符(OPT)

允許類型限定符,諸如constvolatile,隨後聲明,說明符。那些遵循聲明指定符的可以是一個函數聲明。

+0

限定符可以在任何聲明之前......我明白,但問題是與「任何」....... – perilbrain 2012-07-23 12:53:22

+1

那麼,語法上說「任何」(儘管嚴格來說,限定詞是聲明的一部分,所以它們不在其前面)。 – 2012-07-23 12:55:01

+0

當然,我也這麼認爲,因爲限定符是可選的,並且只有少數類型的聲明(如變量聲明等)有效。 – perilbrain 2012-07-23 13:05:05

0

在沒有違反C語法規則的情況下,您的確可以在任何聲明之前放置constvolatile。這絕不意味着這樣的構造具有含義,不會被直接忽略,或者由於其他原因不會引發編譯錯誤。這隻意味着它不會觸發語法錯誤。

的C89規範指出

如果函數式的規範包括任何類型限定符, 的第3.5.3節的行爲是未定義。

這意味着它是完全合法的聲明功能constvolatile,只要你實際上並不呼叫該功能。如果你試圖打電話給它,不知道會發生什麼。這是你可以在C語言中做的幾件事情之一,它們在技術上是合法的語法,但是完全沒有意義(如語句1 == 3;x + 2;)。

爲了在您的編輯中闡明您的意見,請注意術語「ANSI C」和「C89」指的是相同的事物。對於C來說,ANSI和ISO標準只有格式不同。這些標準的內容通常被稱爲「C89」或「C90」(將其與ANSI後來標準化的C99區分開來)。當你說「我知道這對ISO C89或以上版本無效」時,你的語句也包括「ANSI C」。

相關問題