0

一度に複数の比較が必要であると仮定します。

enum usermode
{
    active,
    standingby,
    inactive,
    dead,
    // many other modes....
};
class A
{
public:
    usermode mode;
};

関数はクラスAへのポインタを継承しました(ptrはAを指します)

方法A:

if( ptr->mode == active || ptr->mode == standingby || ptr->mode == inactive || ptr->mode == dead ...//etc )
{
    //do something
}

方法B:

usermode cmpmode = ptr->mode;
if( cmpmode == active || cmpmode == standingby || cmpmode == inactive || cmpmode == dead ...//etc )
{
    //do something
}

そうすることは良い習慣ですか?

4

3 に答える 3

2

この場合、ステートメント式の文字数を単純に削減するifため、機能し、最も読みやすいものは何でもかまいません。

ただし、関数の戻り値をチェックする場合は、それを変数に詰め込んでチェックします。

auto ret = SomePossiblyExpensiveOperation();
if(ret != whatever && ret < something) {
    //...
}

あなたのif声明を額面通りに受け止めて、私はこれをします:

switch(ptr->mode) {
    case active:
    case standingby:
    case inactive:
    case dead:
        ptr->whatever();
        break;
    // other cases
    default:
        // something else
        break:
}

これが一般的なチェックである場合は、特別なケースを作成することをお勧めします。

usermode any_mode = active | standingby | inactive | dead;

//...

if(ptr->mode & any_mode) {
    // whatever...
}
于 2012-09-21T22:55:37.193 に答える
2

はクラスの単なるメンバー変数であるためmode、適切なコンパイラは両方の実装で同じコードを生成します。ただし、一般に、フィールドの代わりにメソッド(特に副作用のあるメソッド)を使用する場合、これら2つのアプローチは同等ではありません。

これについては、関数呼び出しとローカル変数で詳しく説明しています。

于 2012-09-21T22:56:48.063 に答える
0

あなたのクラスがこれを直接処理するメソッドを持っているなら、おそらくもっといいでしょう

bool A::IsSomeState() const
{
  return mode == active || mode == standingby; // Etc
}
于 2012-09-21T22:56:06.180 に答える