[解決済み】int a[] = {1,2,}; なぜイニシャライザーリストの最後のカンマは許されるのでしょうか?
質問
私はこの惑星の人間ではないのかもしれませんが、次のような構文エラーになるはずです。
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("};");
書き出す現在の項目が最初か最後かを気にする必要がない。ずっとシンプルになった。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜ (int)x ではなく static_cast<int>(x) を使うのですか?
-
[解決済み] どちらが速いですか?スタックアロケーションとヒープアロケーション
-
[解決済み] なぜリストの初期化(中括弧を使用)が他の方法より優れているのですか?
-
[解決済み] JSONオブジェクトに末尾のカンマを使用することは可能ですか?
-
[解決済み] なぜリストでは末尾のカンマが許されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む