0

次のコードでは、なぜ 2 つのステートメントが不正なのか

const int i[] = { 1, 2, 3, 4 };

// float f[i[3]]; // Illegal

struct S { int i, j; };
const S s[] = { { 1, 2 }, { 3, 4 } };
//double d[s[1].j]; // Illegal
int main() {} 

なぜ彼らは違法なのですか?テキストの定義は次のとおりで、私は理解していませんでした。

「配列定義では、コンパイラは配列に対応するためにスタック ポインタを移動するコードを生成できなければなりません。上記の両方の違法な定義では、配列定義で定数式が見つからないため、コンパイラは文句を言います。」

前もって感謝します。

4

3 に答える 3

6

配列サイズは定数式である必要があります。これを試して:

constexpr int i[] = { 1, 2, 3, 4 };

float f[i[3]];

このconstexprキーワードは C++11 で導入されました。以前のバージョンの C++ には、このような一般的な定数式の概念がなく、同等の概念もありませんでした。

于 2012-08-21T14:20:29.183 に答える
2

C++ は可変長配列をサポートしておらs[1].jず、コンパイル時の定数ではないためです。

その引用が言及しているのは、fd自動ストレージにあるという事実です。スコープ外に出ると、ランタイムはメモリを自動的に消去します。そのため、事前にサイズを知っておく必要があります。

于 2012-08-21T14:19:28.260 に答える
0

dは静的配列であるため、コンパイル時にそのサイズを知る必要があります。したがって、非定数変数をサイズパラメータとして使用することはできません。

しかし、あなたは試すことができます

 const int i = 3;
 double d[i];

例えば。

于 2012-08-21T14:22:34.393 に答える