9

私は C++ の初心者です。C++ の本を読んでいましたが、

const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal

コンパイル時に float 変数の宣言が無効であると表示されますが、それはなぜですか?

使用するとします

int i = 3;
float f[i];

できます。

最初の状況の問題点は何ですか?

ありがとう。

4

4 に答える 4

15

したがって、配列にはコンパイル時に既知の境界が必要でありi[3]、厳密に言えばコンパイル時に既知であるが、言語が設定した「コンパイル時に既知」の基準を満たさないため、最初の配列は違法です。

2番目も同じ理由で違法です。

ただし、GCC は C99 スタイルの実行時サイズの配列を C++ の拡張機能としてサポートしているため、どちらの場合も一般に GCC で受け入れられます。-pedanticフラグを GCC に渡して文句を言わせます。

編集: C++標準用語は「整数定数式」であり、そのように修飾されるものは、標準のセクション5.19で詳細に説明されています。正確な規則は自明ではなく、C++11 には により修飾されるより広い範囲がありますconstexprが、C++98 では、合法的なもののリストはおおよそ次のとおりです。

  • 整数リテラル
  • 定数のみを含む単純な式
  • 整数型の非型テンプレート パラメータ
  • const定数式として宣言され、初期化された整数型の変数
于 2013-09-25T13:49:51.237 に答える
3

2 番目の例は機能せず、機能しないはずです。 i定数でなければなりません。これは機能します

const int i = 3;
float f[i];
于 2013-09-25T14:02:15.850 に答える
2

セバスチャンの答えを説明するだけです:

静的配列を作成する場合、コンパイラは、確保する必要があるスペースの量を認識している必要があります。つまり、配列のサイズはコンパイル時にわかっている必要があります。つまり、リテラルまたは定数でなければなりません。

const int SIZE = 3;
int arr[SIZE]; // ok

int arr[3]; // also ok

int size = 3;
int arr[size]; // Not OK

の値はsize配列が作成されるまでに異なる可能性があるため、oompiler は配列用にどれだけのスペースを予約するかを知りません。として宣言するとconst、値が変更されないことがわかり、適切な量のスペースを確保できます。

可変サイズの配列が必要な場合は、 を使用して動的に作成する必要があります (使用が終わったらnew、必ず でクリーンアップしてください)。delete

于 2013-09-25T14:04:14.557 に答える
0

C++ で実行時にのみ長さがわかっている配列の場合、std::vector<T>. 組み込み配列の場合、コンパイル時にサイズがわかっている必要があります。これは C++11 にも当てはまりますが、はるかに古い C99 標準では既に動的スタック配列がサポートされています。Why doesn't C++ support dynamic arrays on the stack?の受け入れられた回答も参照してください。

于 2013-09-25T14:12:22.203 に答える