[解決済み] C++、'if'式での変数宣言
2022-06-25 08:16:09
質問
どうなっているのでしょうか?
if(int a = Func1())
{
// Works.
}
if((int a = Func1()))
{
// Fails to compile.
}
if((int a = Func1())
&& (int b = Func2()))
)
{
// Do stuff with a and b.
// This is what I'd really like to be able to do.
}
2003年版標準のセクション6.4.3では、選択文の条件で宣言された変数が、その条件によって制御されるサブステートメントの終わりまで拡張されるスコープを持つことを説明しています。しかし、宣言の周りに括弧を置くことができないことについてはどこにも書かれていませんし、1 つの条件につき 1 つの宣言しかないことについても書かれていません。
この制限は、条件内の宣言が 1 つだけ必要な場合であっても、煩わしいものです。これを考えてみましょう。
bool a = false, b = true;
if(bool x = a || b)
{
}
もしxをfalseに設定して'if'のbodyスコープに入りたいなら、宣言は括弧を必要とします(代入演算子は論理和よりも優先順位が低いため)。しかし括弧が使えないため、xをbodyの外で宣言しなければならず、宣言は希望より大きな範囲に漏れることになります。明らかにこの例は些細なものですが、より現実的なケースは、a と b がテストする必要のある値を返す関数であるような場合です。
私がやりたいことは標準に準拠していないのでしょうか、それとも私のコンパイラーは私のボール (VS2008) を破壊しているだけなのでしょうか。
どのように解決するのですか?
C++17の時点で、あなたがやろうとしていたこと がようやく可能になりました。 :
if (int a = Func1(), b = Func2(); a && b)
{
// Do stuff with a and b.
}
を使うことに注意してください。
;
の代わりに
,
を使うことで、宣言と実際の条件を分離することができます。
関連
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] JavaScriptの変数をアンセットするには?
-
[解決済み] フォワード宣言はどのような場合に使用できますか?
-
[解決済み】Pythonの変数宣言
-
[解決済み】C++11のラムダ式って何?
-
[解決済み】Pythonで値を代入せずに変数を宣言することだけが可能か?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Enterキーを押して続行する