代码之家  ›  专栏  ›  技术社区  ›  Mordachai

C++:一种在if语句中声明变量(或不止一个)的方法,它分离变量定义和测试?

  •  4
  • Mordachai  · 技术社区  · 15 年前

    可以这样做:

    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语句的优雅与测试其值是否为零之外的其他值的能力相结合的句法结构?

    6 回复  |  直到 15 年前
        1
  •  3
  •   RnR    15 年前

    有时可读性和可维护性比保存的一行代码更重要。

    如果 您完全需要局部变量,然后无论如何,在这种情况下显式地引入它,如果您希望它受到限制的话,也可以引入一个额外的作用域,但是您还应该考虑是否可以在几个地方使用hiword宏,这样您根本不需要任何技巧。

        2
  •  1
  •   ephemient    15 年前

    预处理器技巧:

    #define IF_2(init, test) \
        for (bool first_ = true; first_;) for (init; first_ && (test); first_ = false)
    
    IF_2(WORD wNotifyCode = HIWORD(wparam), wNotifyCode > 1)
    {
      ...
    }
    

    这很难看,当然也不比你现有的选择更好。

        3
  •  1
  •   seh Alexei    15 年前

    尝试引入这样的助手函数:

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

    然后,将您的条件写为:

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

    这将返回零——或者,如果你愿意, --如果第一个提供的值小于第二个,则返回该值。考虑到很难确定函数的名称,以及它是否需要一个包含或独占的最小值,所以它在这里工作并不会减少它是一个奇怪的黑客。

    像其他人推荐的那样,我也赞成您在“并且可以这样做”之后的第一个建议——单独的声明和初始化语句,后面跟着条件语句。我认为这是C++中自然的方法。

        4
  •  1
  •   Matteo Italia    15 年前

    提示:您可以使用message cracker宏;这样,您将得到一个更短的wndproc(没有所有这些嵌套的开关),您的消息处理代码将整齐地拆分为单独的函数(每个消息一个),而且您几乎不需要所有hiword-loword的东西,因为message cracker宏为您做了这些,并传递了inlparam和wparam为函数检索到的信息已在参数中拆分。

        5
  •  -2
  •   dirkgently    15 年前

    您可以稍微修改测试:

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

    如果你想检查 wNotifyCode > 1 .

        6
  •  -2
  •   Ruddy    15 年前

    以下是我的作品

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

    我冒昧地猜测,=运算符优先于>运算符,但不确定,=运算符优先于>运算符,我知道赋值操作的结果是赋值的值,测试工作。

    编辑: [戴上邓斯帽子,走到拐角处]