2012-05-08 21 views
2

corrections of annotations to the standardに基づく。const constがrvalue(つまり、メモリに格納されていない)の場合、constはconstへのポインタです。

3.14オブジェクトは、物理メモリアドレスに存在する変数または定数のいずれかです。

  • Cでは、定数はメモリには存在しません(一部の文字列リテラルを除く)ので、オブジェクトではありません。

それはconstのは(おそらく文字列リテラルを除く)は、実際のメモリ位置を持っていないように私には理にかなって、それが最も可能性の高いリテラルとそれへのすべての参照を置き換えますコンパイラに依存していること値。つまり、次のことはどのように可能ですか?

const int * foo; 

これは、const intへのポインタを宣言します。しかし、定数にはアドレスがないので、これはどういう意味ですか?コンパイル時にのみ存在するリテラル値へのポインタを持つことはできません。

+2

振り返ってみると、「const」の名前は「readonly」である必要があります。これは、通常、C:読み取り専用オブジェクトの意味です。 – pmg

+1

'const'はコンパイル時定数を意味するものではありません。代わりに、 "型修飾子"です。これは単に 'const'が代入のターゲットとして使用できないことを意味します。ここでいくつかの興味深い議論です:http://stackoverflow.com/questions/4275504/deep-analysis-of-const-qualifier-in-c –

+1

'const int a = 10;'、 '10'は"定数 "、著者は実際には "リテラル"と言っているはずです。 'a'はconst修飾子を持っていても「定数」ではありません。 '10'はアドレスを持っていません(おそらく著者はメモリに常駐していないと言いますが、これは無関係で大部分は間違っています)。 'a 'にはアドレスがあります。 – nos

答えて

4

const変数は、定数ではありません。 A 定数は、リテラル値またはリテラル値で構成された式です(3+5/2.4など)。このような定数は実際にはメモリに常駐せず、コンパイラは適切な場所にリテラルを挿入します。あなたの例では

3

は、fooはない定数が、それはconst修飾オブジェクトです:

6.7.3型修飾子

構文

      タイプ修飾子:資格の種類に関連付けられているの         const
        restrict
        volatile

...
3プロパティは が左辺値であることを唯一の表現のために意味があります。 114)
...
114)の実装は ストレージの読み取り専用領域で volatileない constオブジェクトを配置することができます。さらに、実装では、そのアドレスが でない場合、そのようなオブジェクトにストレージを割り当てる必要はありません。
関連する問題