2

「constおよびvolatile修飾子は、任意の宣言の前に置くことができます。」

私はこの声明がオンラインテストシリーズで真とマークされているのを見ました。しかし、標準の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に提案してください。そうすれば、教育当局に質問のバグについて何らかの証拠を付けて通知することができます。

4

2 に答える 2

3

型修飾子宣言指定子(opt)

constorなどの型修飾子のvolatile後に宣言指定子を続けることができます。以下の宣言指定子は、関数宣言にすることができます。

于 2012-07-23T12:50:55.083 に答える
0

実際、C の文法規則に違反することなく、任意の宣言の前にconstorを置くことができます。volatileこれは、そのような構造に意味があること、完全に無視されないこと、または他の理由でコンパイル エラーが発生しないことを意味するものではありません。これは、構文エラーが発生しないことを意味するだけです。

C89 仕様のセクション 3.5.3 は次のように述べています。

関数型の指定に型修飾子が含まれている場合、動作は未定義です。

これは、実際にその関数を呼び出さない限り、関数をconstorとして宣言することは完全に合法であることを意味します。呼び出してみると、何が起こるかわからない。これは、C で実行できるいくつかのことの 1 つで、技術的には正しい構文ですが、完全に無意味です (またはステートメントのように)。volatile1 == 3;x + 2;

編集中のコメントを明確にするために、「ANSI C」と「C89」という用語は同じものを指していることに注意してください。C には、フォーマットだけが異なる ANSI 標準と ISO 標準の両方があります。これらの標準の内容は、一般に "C89" または "C90" と呼ばれるものです (ANSI が後に同様に標準化した C99 と区別するため)。「これは ISO C89 以上では有効ではないことはわかっています」と言う場合、ステートメントには「ANSI C」も含まれます。

于 2013-01-05T00:10:44.290 に答える