ホームページ  >  記事  >  バックエンド開発  >  C の `const int` 変数を使用して配列サイズを初期化できないのはなぜですか?

C の `const int` 変数を使用して配列サイズを初期化できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-28 05:29:02624ブラウズ

Why Can't Array Sizes Be Initialized with `const int` Variables in C  ?

Const Int による配列サイズ制限が強制される場合があるのはなぜですか?

C では、定数整数を使用して配列サイズを指定できます。ただし、次の例で示すように、この柔軟性には制限があります。

<code class="cpp">const int size = 2;
int array[size] = {0}; // Allowed</code>
<code class="cpp">int a = 2;
const int size = a;
int array[size] = {0}; // Compile Error</code>

最初の例はコンパイルに成功するのに、2 番目の例は失敗するのはなぜですか?

説明

C 標準では、サイズの初期化に使用される式の性質に基づいて、これらの配列サイズの制限が規定されています。

定数式

最初の例では、const int size = 2; size の値はコンパイル時にわかっているため、 は定数式です。コンパイラは配列サイズを知っているため、コンパイル中に必要なメモリを割り当てることができます。

非定数式

2 番目の例では、const int size = a; a の値は実行時まで決定されないため、 は定数式ではありません。これにより、コンパイラはコンパイル中に配列サイズを認識できなくなり、コンパイル時にメモリを割り当てることができなくなります。

不変性は無関係です

2 番目の例では、サイズが事実上一定値のままであることに注意してください。ですが、これはコンパイラでは考慮されません。ルールは、使用される式のタイプと int a = 2; に焦点を当てます。可変変数を使用するため、非定数式になります。

フロー分析の複雑さ

コンパイル時の割り当てのために実行時の初期化を許可するには、フロー分析が必要になります。コンパイラーは、

<code class="cpp">int a = 2;
const int size = a;</code>

<code class="cpp">int a = foo();
const int size = a;</code>

のような式を区別する必要があります。サイズ式は同じですが、実際の値は実行時の動作によって異なります。この複雑さは C 委員会によって不必要であると見なされます。

以上がC の `const int` 変数を使用して配列サイズを初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。