2016-09-05 9 views
0

私はCのストレージクラスについて知っていますが、autoというキーワードについては不思議です。次式の 自動変数の問題

auto int i = 0; 

autointは、データ型であり、ストレージクラス指定です。

しかし、私たちが書く場合:

int auto i = 0; 

どうなりますか?データタイプとしてautoが動作していますか?

(等 intdoublechar
+5

ここだけで簡単なメモ。過去20年間に書かれたCコードでは、誰も「自動」または「登録」を書いていません。特に "auto"は、C++によって他のものを意味するために再利用されているためです。 – Art

+0

@Art:あなたが望む...私が毎日働いている15歳のコードベースは、(通常は紛争の多い場所で) 'register'宣言で覆われています。(私は「自動」について同意しますが、実際のコードではそれを見たことはありませんでした) –

+1

@MatteoItalia私は「過去20年間にプログラムを習得した」というようなことを述べていましたが、 。石器時代の慣行に従った新鮮な教育を受けた人々は、80年代に「知るべきことはすべて」を学んだ誰かから学びました。 – Art

答えて

6

指定子を入力に対するストレージクラス指定子(externstaticregisterautotypedef)の順序は問いません。両方とも有効で、同じオブジェクトを宣言します。

ただし、特定の順序に従うことは良い方法です。 (あなたのケースでi)宣言子の前に指定-修飾子リストは、最良の次の順序で使用されているキーワードの独特のグループで構成されています:staticexternautoregister:、

  • ストレージクラス指定子があれば、typedef,_Thread_local(C11);
  • タイプ修飾子(存在する場合):constvolatilerestrict;
  • 修飾子(存在する場合):signed,unsigned,shortlong;
  • 型指定:などintchardoublefloat

そのルールに続いて、このような、より読みやすい宣言につながる:

static const volatile unsigned long int a; 

の代わりに(極端な例):

unsigned volatile int static const long a; 
4

C文法を使用すると、どちらの位置でも、有効な記憶域指定子が空である有効な型のセットの間に交差点があるため、あいまいさはありません。しかし、通常、型の前に書かれた記憶域指定子を見たことがあるので、他の人が読むのを容易にするためにこの規則に固執してください。

(また、autoを使用しないよう、それは常に暗示されているため、誰もC++も推測された型の変数に対して、そのキーワードを再利用ポイントに、それを使用していません)