1. ホーム
  2. c++

[解決済み】int a[] = {1,2,}; なぜイニシャライザーリストの最後のカンマは許されるのでしょうか?

2022-03-25 14:02:08

質問

私はこの惑星の人間ではないのかもしれませんが、次のような構文エラーになるはずです。

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

でも、違うんです。このコードがVisual Studio上でコンパイルされたときは驚きましたが、C++のルールに関してはMSVCコンパイラを信用してはいけないと学んだので、標準を確認すると、それは も規格で認められています。信じられないのであれば、8.5.1の文法規則をご覧になってください。

なぜこれが許されるのでしょうか?これはくだらない無駄な質問かもしれませんが、なぜ私が質問しているのかを理解して欲しいのです。一般的な文法ルールのサブケースであれば、理解できます。初期化子リストの最後に冗長なカンマを認めないためだけに、一般的な文法をこれ以上難しくする必要はないと判断したのでしょう。しかし、そうではなく、追加のカンマは 明示的に を許可しています。例えば、関数呼び出しの引数リストの最後に冗長なカンマがあることは許されません(その関数が ... ), というのは、通常の .

では、繰り返しになりますが、この冗長なコンマは何か特別な理由があるのでしょうか? 明示的に を許可しますか?

解決方法は?

ソースコードの生成が容易になり、また、後日簡単に拡張できるコードを書くことができるようになります。追加のエントリーを追加するために必要なことを考える。

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

... 既存の行にカンマを追加する必要があります。 は新しい行を追加します。という3つの場合と比べてみてください。 すでに の後にカンマがある場合は、行を追加するだけでよい。同様に、行を削除したい場合は、それが最終行であるかどうかを気にせずに削除できますし、カンマをいじらずに行を並べ替えることができます。基本的には、行の扱いに統一性があるということです。

今度は、コードの生成について考えてみましょう。擬似コード)のようなものです。

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

書き出す現在の項目が最初か最後かを気にする必要がない。ずっとシンプルになった。