2

重複の可能性:
C++ の書籍では、バインドされた配列は定数式でなければなりませんが、次のコードが機能するのはなぜですか?

このコードを参照してください

#include<iostream>
int main
{
using namespace std;
int a=7;
char arr[a];
return 0;
}

私の本では、array_sizeは定数でなければならないと書かれていますが、codeblocksはエラーを出していません...

それだけではありません..他にもいくつかの例があります。

IDE、コンパイラ、またはその他のものが間違っているのは誰ですか???

新しい本または古い本を使用すると、このような問題が発生する可能性がありますか??

4

4 に答える 4

8

コードの形式が正しくありません。配列の範囲は定数式である必要があり、定数式でiはありません(宣言されていませんconst)。

aとして宣言されconst int、定数式(のような)で初期化された場合7、エクステントは定数式になるため、コードは整形式になります。たとえば、以下は整形式です。

int main()
{
    int const a = 7;
    char arr[a];
}

一部のC++コンパイラ(一部のコンパイルモードではgccを含む)は、Cの機能であり、ローカル配列のサイズを一定にできない可変長配列をサポートしています。ただし、この機能を提供するコンパイラは、言語拡張として機能します。これはC++の機能ではありません。

于 2012-06-21T18:37:54.960 に答える
1

C99 ( ISO/IEC 9899:1999、セクション 6.7.5.2) 以降、これはC有効です:arrは可変長配列 (VLA) です。ただし、C++には VLA はありませんここで受け入れられた答えは、その理由を説明しています。

于 2012-06-21T18:44:10.580 に答える
0

C++98、C++03、C++11、C89、および C90 (おそらく C11 でも) では違法です。

C99 でのみ有効です。

于 2012-06-21T18:49:41.853 に答える
0

ここでは、標準によれば合法ではありません。

C++03 8.3.4/1 [dcl.array]

DがD1 [constant-expressionopt] 宣言T D1 内の識別子の形式および型を有する宣言T D において、Dの識別子の型は「派生宣言子型リストT」である。T は配列要素型と呼ばれます。この型は、参照型、(おそらく cv 修飾された) 型 void、関数型、または抽象クラス型であってはなりません。定数式 (5.19) が存在する場合、それは整数定数式であり、その値は 0 より大きくなければなりません。[...]

整数定数式は、5.19/1 でさらに定義されています。

[...] 整数定数式には、リテラル (2.13)、列挙子、const 変数、または定数式で初期化された整数型または列挙型の静的データ メンバー (8.5)、整数型または列挙型の非型テンプレート パラメーターのみを含めることができます。および sizeof 式。

于 2012-06-21T18:50:26.093 に答える