C++ C++;:在分隔变量定义和测试的if语句中声明变量(或多个)的方法?

C++ C++;:在分隔变量定义和测试的if语句中声明变量(或多个)的方法?,c++,syntax,syntactic-sugar,C++,Syntax,Syntactic Sugar,我们可以这样做: 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)) { ...

我们可以这样做:

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))
{
  ...
}
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语句的优雅性与测试其非零值的能力结合起来吗?

您可以稍微修改一下测试:

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

如果您想检查
wNotifyCode>1

以下内容是否适用于我

if (WORD nNotifyCode = HIWORD(test) > 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)
{
  ...
}

它很难看,当然也不比您已有的选项好。

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


如果你需要局部变量,那么在这种情况下,你可以把它显式地引入,如果你想限制它,可以引入一个附加的范围。但是你也应该考虑如果你可以在两个地方使用HiWord宏,这样你就不需要任何技巧了。助手函数如下所示:

template <typename T>
T zeroIfLess(T val, T base)
{
  return val < base ? T(0) : val;
}
如果提供的第一个值小于第二个值,则返回零(或者,如果您愿意,返回false);否则返回值。考虑到很难确定函数的名称,以及它是否应该采取包含或排除的最小值,它在这里工作并不意味着它是一个奇怪的黑客



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

提示:你可以使用消息破解宏;通过这种方式,您将获得更短的wndproc(没有所有嵌套的开关),您的消息处理代码将整齐地拆分为单独的函数(每条消息一个),并且您几乎不需要所有HIWORD-LOWORD功能,因为message cracker宏会为您执行此操作,并将lParam和wParam检索到的信息传递给已拆分为参数的函数。

您的猜测是错误的。您编写的内容将被解释为
if(WORD notifycode=(HIWORD(test)>1))
,而这并不是预期的内容。赋值运算符(以及相关运算符,如+=)的优先级在所有运算符中最低。它们只比投掷和(逗号)高。Doh-以这种方式测试太快了。今天又上了一课,这是错误的。这将布尔表达式
HIWORD(test)>1
应用于
wNotifyCode
,结果为0或1。不是他所期望的。赋值运算符的优先级几乎比任何东西都低,这将把一个bool转换为word来表示代码。Ruddy-留下错误答案以帮助他人是值得的。我知道我也想到了你的解决方案,但我突然想到,这样做只会分配错误的东西。但让其他人看到这一点并拯救自己,“这会起作用吗…”是很有价值的。我们都吃过d'oh!时刻!!!;)我更喜欢大写的宏;可读性好,打字错误的可能性小。抱歉,但是对于神奇和不可读的代码,-1:/-这似乎不能很好地完成,所以也许最好根本不要这样做?;)向上投票,因为作者都回答了怎么做,并且说他们不建议这样做。记住:C++/C宏是邪恶的!强烈地考虑你的成本/利益,洗手两次:嗯,<代码>!1真的,但我想我们假设
单词
类似于
uint16\t
?无论如何,我喜欢这一点的聪明,尽管下面代码块中的代码必须小心,因为
wNotifyCode
与它本来应该是一样的1.OP样本是
>1
,这就实现了。是的,当然,你需要在脑海中记下一个。事实上-这使得wNotifyCode=比它应该的少了一个,这不是我所希望的。对不起,但是-1对于神奇且不可读的代码:/(需要更多的注释,然后只在条件之外执行变量并引入一个单独的范围)@RnR:你读过OP的问题吗?这几乎是从他的一个例子中一字不差地取出来的。你的第二个例子不被接受有什么原因吗?我发现,无论是从范围还是清晰性来看,这都是最可取的方法。这就是我要选择的方法。我只是想避免仅仅为此创建一个任意的额外作用域,而您几乎可以在if语句中这样做(当然也可以使用for表达式)。如此接近。。。但是,是的,现在额外的范围是一个实用的解决方案。:)据我所知,ATL/WTL有更好的(更多的OO)语法。您可能想考虑使用这些库。再次,C++允许我在IF本身隐式定义的范围中声明变量…因此,如果我可以设置测试条件,而不是被迫使用衰减到标量非零,我将得到所有可能的世界中最好的。我将暂时接受这个额外的空间没有听说过“消息破解宏”。这就是你说的吗?是的,他们是;在这里()你可以找到一些关于它们的介绍和一个帮助你使用它们的工具(关于这一点我一无所知)。在我的特殊情况下,我已经在使用MFC来分解消息处理程序了——但我想在g