4

これを行うことができます:

case WM_COMMAND:
if (WORD wNotifyCode = HIWORD(wparam))
{
  ...
}

そして、これを行うことができます:

case WM_COMMAND:
{
  WORD wNotifyCode = HIWORD(wparam);
  if (wNotifyCode > 1) {
    ...
  }
}

しかし、次のことはできません。

case WM_COMMAND:
if ((WORD wNotifyCode = HIWORD(wparam)) > 1)
{
  ...
}

ここで for ステートメントを使用すると、誤解を招くと思います。

case WM_COMMAND:
for (WORD wNotifyCode = HIWORD(wparam); wNotifyCode > 1; wNotifyCode = 0)
{
  ...
}

ループが起こっているように見えるからです - そして、私の後に来る貧しいおしゃべりは、このゴミを解読しなければなりません.

しかし、ローカル変数宣言を含む if ステートメントの優雅さと、その値をゼロ以外でテストする機能を組み合わせた構文構造はありませんか?

4

6 に答える 6

3

コード行の保存よりも、読みやすさと保守のしやすさの方が重要な場合があります。

ローカル変数が必要な場合は、この場合は必ず明示的に導入し、制限したい場合は追加のスコープを導入することもできますが、いくつかの場所で HIWORD マクロを使用して生活できるかどうかも検討する必要があります-この方法では、トリックはまったく必要ありません。

于 2010-02-05T20:13:56.833 に答える
1

プリプロセッサのトリック:

#define IF_2(init, test) \
    for (bool first_ = true; first_;) for (init; first_ && (test); first_ = false)

IF_2(WORD wNotifyCode = HIWORD(wparam), wNotifyCode > 1)
{
  ...
}

それは醜く、確かにあなたがすでに持っているオプションよりも優れています.

于 2010-02-05T19:53:56.470 に答える
1

次のようなヘルパー関数を導入してみてください。

template <typename T>
T zeroIfLess(T val, T base)
{
  return val < base ? T(0) : val;
}

次に、条件を次のように記述します。

if (WORD wNotifyCode = zeroIfLess(HIWORD(wparam), 2))

最初に指定された値が 2 番目の値よりも小さい場合は、0 または必要に応じてfalseが返されます。それ以外の場合は値を返します。関数の名前を決定するのが難しいこと、およびそれが包括的または排他的最小値を取るべきかどうかを考えると、ここで機能することは奇妙なハックであることを減じません.

他の人が推奨しているように、私も「そして、これを行うことができます」の後の最初の提案を支持します-個別の宣言と初期化ステートメントの後に条件ステートメントが続きます。それが C++ で行う自然な方法だと思います。

于 2010-02-05T20:58:01.550 に答える
1

ヒント: メッセージ クラッカー マクロを使用できます。このようにして、はるかに短い wndproc が得られ (ネストされたすべてのスイッチなしで)、メッセージ処理コードが別々の関数 (メッセージごとに 1 つ) に整然と分割され、すべての HIWORD-LOWORD はほとんど必要なくなります。メッセージ クラッカー マクロがそれを行い、lParam と wParam によって取得された情報を、既にパラメーターに分割されている関数に渡すためです。

于 2010-02-05T21:11:51.993 に答える
-2

以下は私のために働きます

if (WORD nNotifyCode = HIWORD(test) > 1)
{
}

推測するのは危険ですが、=演算子が>演算子よりも優先されることは確かではありません。また、代入演算の結果が代入の値であることがわかっているので、テストは機能します。

編集:[劣等生キャップを付けて、コーナーに行く]

于 2010-02-05T19:49:30.993 に答える
-2

テストを少し変更できます。

if (WORD wNotifyCode = HIWORD(wparam) - 1)

かどうかを確認したい場合wNotifyCode > 1

于 2010-02-05T19:45:46.520 に答える