2011-07-06 6 views
12

C言語とC++言語の宣言でconstが使用される方法の直感的なパターンを見つけるのが難しいです。ここではいくつかの例です:ライン1と2では宣言で "const"がどこにあるのかを理解する

const int a; //Const integer 
int const a; //Const integer 
const int * a; //Pointer to constant integer 
int * const a; //Const pointer to an integer 
int const * a const; //Const pointer to a const integer 

が、constは、それが修飾するものである、intの前または後に来ることができるようです。

  1. は、どのように、4行目では、コンパイラはconstintではなく*(ポインタ)を変更していることを決めるのですか?
  2. constに当てはまるものを判断するためにコンパイラが従うルールは何ですか?
  3. *と同じルールに従っていますか?

    int const x;  // x is a constant int 
    int *const x;  // x is a constant pointer to an int 
    int const *x;  // x is a pointer to a constant int 
    int const *const x; // x is a constant pointer to a constant int 
    

    あなたがconstを置く場合、これはまだ動作します:あなたは常にタイプのにconstを置き、あなたが右から左に文として変数宣言を読むことができると仮定すると、

+9

[clockwise spiral rule](http://c-faq.com/decl/spiral.anderson.html)への義務的なリンク –

+1

配列や関数が含まれていない場合は、単に右から左へ読む* *も役に立ちます: 'int const * const a':' 'a'はconst intへのconstポインタです。 –

+0

Mark、あなたが答えとしてそれを提出したなら、私はそれをチェックしたでしょう。非常に便利で本当に私がそれを理解するのに役立ちます! –

答えて

4

コンパイラ一般的にそう、右から左からタイプを読み取ります

T const& const 

const (a constant) 
& (to a reference) 
const (to a constant) 
T (of type T) 

したがって、基本的にキーワード "const"は、その前にあるすべてのものを変更します。

const (a constant) 
& (to a reference) 
const T (to a constant of type T) 

:上記

const T& const 

として読まれる:しかし、それはそれの右に直接アイテムを変更した場合には「CONST」が最初に来る場合には例外があり、そして、上記はT const & constに相当します。

コンパイラがこれを行う方法ですが、実際には "T"、 "const T"、 "const T &"、 "const T *"、 "const T & const"、 "const" T * const "、" T & const "、および" T * const "である。あなたはまれに "const"のバリエーションに遭遇することはほとんどなく、そうする際にはtypedefを使うのは良い考えです。

+0

コンパイラがどのようにそれを行うのかを説明してくれてありがとう、「人間がそれをやり遂げる」方法だけでなく、私が求めていたことです。 –

+5

私は、「定数参照」(つまり、常に定数)というようなものはないと信じています。したがって、 'T&const'は意味的に正しくありません。 VC++ 2010は警告を出し、 'const'を無視します。ちょうど思い出させる。 :)悪い例のために – Nubcase

+1

-1。参照ではなくポインタを使用してください。 –

7

タイプの左側には、少し精神的な努力が必要です。これは、(および高次構造)・ツー・ポインタのポインタと全く同じように動作することに注意してください:

int *const *const x; // x is a constant pointer to a constant pointer to an int 
+0

30秒で私にそれを打つ! –

+1

基本ルールは右から左に読まれ、一番左のものが 'const'であれば、右のものに直接適用されます。したがって、左に何もない限り、左にあるものには 'const'が適用されるため、右のものに適用されます。 –

2

ここでは、Scott Meyersの書籍(私は思う)から取り上げたものを紹介します。 *を通る垂直線を引いてください。そして、constキーワードと同じ行にあるものはconstです。明確にするために

int * const aはconstのではなく、int型であることを意味します。そして "a"は(非const)intへのポインタです。

0

まず、この質問は個人的な好みです。レジャープログラマーにとっては、もっと個人的なスタイルです。しかし、企業を扱う人にとっては、プログラマーが誰もが一貫したコーディングスタイルを出すようにレイアウトするという、ある種のコーディング規則が存在する可能性があります。

(1)const int * const a;の場合、ポインタが指しているものは変更できませんが、そのメモリの場所は変更できます。

(2) 'const'はプログラマとして、ポインタが指し示すアドレスを定数にするかどうか、ポインタが指すポインタを変更しないようにするかどうかによって決まります。

(3)はい規則は、追加の注意点としてはconst int * const a;

の場合のように*で同じです、あなたの最後の行は、有効なC89ではありません。

希望します。乾杯!

+0

プログラマーにとっては好きかもしれませんが、自分のコードを読まなければならない他の人には間違いありません! –

+0

問題はそれらを書くことだけでなく、他人が書いたものを読むことでもあります。 –

+0

合意。乾杯! :) – Vern

1

これらを理解するための鍵は、*がタイプではなくaにバインドされていることを認識することです。したがって、これらは次のようにお読みください:

const int a; // a has type const int 
int const a; // a has type int const 
const int * a; // *a has type const int 
int * const a; // *(const a) has type int, which means *a has type int and a is const 
int const * a const; // *(const a) has type int const, which means *a has type const int and a is const. 

(ただし、C++の参照はこの規則に従わないことに注意してください)。

関連する問題