23

重複の可能性:
C++ の条件文または制御文での変数の宣言と初期化

これの代わりに...

int value = get_value();
if ( value > 100 )
{
    // Do something with value.
}

...値の範囲を必要な場所だけに減らすことは可能ですか:

if ( int value = get_value() > 100 )
{
    // Obviously this doesn't work. get_value() > 100 returns true,
    // which is implicitly converted to 1 and assigned to value.
}
4

7 に答える 7

22

値の特定のスコープが必要な場合は、スコープ ブロックを導入できます。

#include <iostream>

int get_value() {
    return 101;
}

int main() {
    {
        int value = get_value();
        if(value > 100)
            std::cout << "Hey!";
    } //value out of scope
}
于 2013-01-31T07:59:05.780 に答える
13

if()変数を宣言して、ステートメント内で比較できますか? いいえ。変数を宣言して、スコープがブロック
に密接にバインドされるような方法で比較できますか? はい!if()


変数を宣言することができます:

if (int x = 5) {
   // lol!
}

または、次のいずれかを使用して実行できます

int x = foo();
if (x == 5) {
   // wahey!
}

あなたは両方を行うことはできません!


宣言自体が新しいオブジェクトの値に評価されるため、と比較するだけでよい場合は、少しごまかすことができます。true

したがって、次の場合:

int foo()
{
   return 0;
}

次に、これ:

if (int x = foo()) {
    // never reached
}

次と同等です。

{
   int x = foo();
   if (x) {
       // never reached
   }
}

スタンドアロンのスコープ ブロックを使用するこの最後の構文は、より複雑な式に対する黄金の弾丸でもあります。

{
   int x = foo();
   if (x > bar()) {
       // wahooza!
   }
}
于 2013-01-31T07:55:24.553 に答える
5

for代わりに使ってみてはどうですか?

for (int value = get_value(); value > 100; value = 0) {
    //...
}

C++11 に移行したい場合は、ラムダを使用できます。

[](int value = get_value()) {
    if (value > 100) {
        //...
        std::cout << "value:" << value;
    }
}();
于 2013-01-31T07:56:39.180 に答える
1

比較を実行し、if比較がtrueを返す場合は値を返し、それ以外の場合はブロック0の実行を回避するために戻ることができる小さな関数を作成できます。if

int greater_than(int right, int left)
{
   return left > right ? left : 0;
}

次に、次のように使用します。

if ( int value = greater_than(100, get_value()))
{
      //wow!
}

forまたは、他の答えが言ったように使用することができます。または、変数の範囲を縮小するために中括弧を手動で配置します。

とにかく、私は そのようなコードを本番コードで書くことはしません。

マシン用のコードを書かないでください。人間のためのコードを書く。あなたが彼らの文法に従う限り、機械は何でも理解するでしょう。人間は自分に何が読めるかを理解しています。したがって、不必要なスコープよりも読みやすさを優先する必要があります。

于 2013-01-31T08:37:23.850 に答える
0

この特定のケースでは、あなたはそれをかわすことができます:

if (int value = (get_value() > 100 ? get_value() : 0)) {
    ...
}

しかし、私はそれを本当にお勧めしません。実行する可能性のあるすべてのテストで機能するわけではなく、get_value()2回呼び出されます。

于 2013-01-31T08:24:09.640 に答える