int a[] = {1,2,}; 初期化リストの末尾にカンマが使用できるのはなぜですか? 質問する

int a[] = {1,2,}; 初期化リストの末尾にカンマが使用できるのはなぜですか? 質問する

おそらく私はこの惑星の人間ではないのでしょうが、次の文は構文エラーであるように私には思われます。

int a[] = {1,2,}; //extra comma in the end

しかし、そうではありません。このコードが Visual Studio でコンパイルされたときは驚きましたが、C++ のルールに関する限り、MSVC コンパイラを信頼しないことを学んだので、標準を確認したところ、標準でも許可されています。信じられない場合は、文法ルールについては 8.5.1 を参照してください。

ここに画像の説明を入力してください

なぜこれが許されるのでしょうか? これは愚かで役に立たない質問かもしれませんが、私がなぜ尋ねているのか理解していただきたいのです。これが一般的な文法規則のサブケースであれば、理解できます。初期化リストの末尾の冗長なカンマを禁止するためだけに、一般的な文法をこれ以上難しくしないことにしたのです。しかし、そうではありません。追加のカンマは明示的に許可されています。たとえば、関数呼び出しの引数リストの末尾に冗長なカンマを置くことは許可されていません (関数が を取る場合...) 。これは正常です

それで、もう一度、この冗長なコンマが明示的に許可されている特別な理由はあるのでしょうか?

ベストアンサー1

これにより、ソース コードの生成が容易になり、後日簡単に拡張できるコードの作成も容易になります。次のエントリを追加するために必要なものを検討してください。

int a[] = {
   1,
   2,
   3
};

... 既存の行にカンマを追加し新しい行を追加する必要があります。3 の後ろにすでにカンマがある場合と比較すると、行を追加するだけで済みます。同様に、行を削除する場合も、最終行かどうかを気にせずに削除でき、カンマをいじることなく行を並べ替えることができます。基本的に、行の扱い方に統一性があることを意味します。

次に、コードの生成について考えてみましょう。次のようなもの(疑似コード)です。

output("int a[] = {");
for (int i = 0; i < items.length; i++) {
    output("%s, ", items[i]);
}
output("};");

現在書き出している項目が最初か最後かを心配する必要はありません。はるかに簡単です。

おすすめ記事