3

c++の学習を開始しました。配列のサイズは実行前にのみ設定でき、動的配列は実行時に設定できることを読みました。だから私はこれが失敗することを期待していましたが、そうではありませんでした:

#include <iostream>

int main() {
    using namespace std;
    int size;
    cout << "enter array size:";
    cin >> size;
    int i, score[size], max; //array size set to variable doesn't fail
    cout << endl << "enter scores:\n";
    cin >> score[0];
    max = score[0];
    for (i = 1; i < size; i++)
    {
        cin >> score[i];
        if (score[i] > max)
    max = score[i];
    }
    cout << "the highest score is " << max << endl;
    return 0;
}

これは最近の C++ コンパイラの新機能ですか? 動的配列が必要であり、代わりにそれを作成する必要があることを認識していますか?

4

3 に答える 3

5

おそらく GCC コンパイラを使用していると思われます。これにはArrays of Variable Lengthという拡張機能があります。

std::vectorは、C++ の実際の動的配列です。

GCC でこの標準を選択するには、オプション -std=c++11 を使用します。標準で必要なすべての診断を取得するには、-pedantic (警告ではなくエラーにする場合は -pedantic-errors) も指定する必要があります。

于 2013-07-30T12:46:13.973 に答える
3

現在および過去のすべての標準で、そのコードは形式が正しくありません。可変長配列は、C++ の機能ではなく C99 の機能ですが、一部のコンパイラでは拡張機能として提供されています。今後の標準 (C++14 になる予定で、現在レビュー中) では、別の名前 (およびわずかに異なるセマンティクス) による同様の機能が採用されているため、将来的にはこれが標準になることを期待してください。

一般に、つまり、実行時バインドの配列(今後の標準で名前が付けられているため) を除いて、配列のサイズはオブジェクトの静的型の一部であり、コンパイル時に認識されることに注意してください。VLA またはランタイム バインドの配列の場合、サイズはコンパイル時に不明であるため、型は何らかの形で型の 2 番目のクラス市民になります。これは、テンプレートで VLA/ARB を使用できないことを意味します (テンプレートのコード生成は、コンパイル時に不明なサイズを含む型に依存するため)。

同様に、他の制限があり、sizeofVLA のコンパイル時操作ではなく、ARB でさえ許可されていません。これらの形式の配列は、自動ストレージ期間 (つまり、スタック内) を持つオブジェクトにのみ使用できます。配列のアドレスを取得します (ただし、最初のメンバーのアドレスを取得できます)...

考慮すべきもう 1 つの重要な点は、ARB のメモリがスタックに割り当てられることを標準が保証しておらず、実装がグローバル割り当て関数を呼び出すことを許可しているということです。スタック。

于 2013-07-30T13:07:17.560 に答える
0

気をつけて!未定義の整数は、値であるとはまったく保証されません。一部のコンパイラはデフォルトで 0 に設定されますが、他のコンパイラはすでにメモリ内にあるガベージ ビットを使用します。このため、Visual Studio ではコンパイルさえできませんでした。サイズ変数を設定する前に、コードをステップ実行してスコアに割り当てられたメモリを確認します。コンパイル時のサイズは、ガベージ メモリからのランダムな整数です。つまり、実行するたびに変更される可能性があります。

AC スタイルの配列は、割り当てる連続メモリの量を知る必要があります。これにより、直接インデックス付けやその他の最適化が可能になります。他の人が示唆しているように、std::vectorは、内部で配列を使用する C++ の標準の動的コンテナーです。

于 2013-07-30T13:01:02.430 に答える