【发布时间】:2011-12-11 19:40:30
【问题描述】:
这是怎么回事?
if(int a = Func1())
{
// Works.
}
if((int a = Func1()))
{
// Fails to compile.
}
if((int a = Func1())
&& (int b = Func2()))
)
{
// Do stuff with a and b.
// This is what I'd really like to be able to do.
}
2003 年标准中的第 6.4.3 节解释了在选择语句条件中声明的变量如何具有延伸到条件控制的子语句末尾的范围。但我看不出它在哪里说不能在声明周围加上括号,也没有说每个条件只有一个声明。
即使在条件中只需要一个声明的情况下,此限制也很烦人。考虑一下。
bool a = false, b = true;
if(bool x = a || b)
{
}
如果我想在 x 设置为 false 的情况下进入 'if'-body 范围,则声明需要括号(因为赋值运算符的优先级低于逻辑 OR),但由于不能使用括号,因此需要声明x 在主体之外,将该声明泄漏到比预期更大的范围内。显然这个例子很简单,但更现实的情况是 a 和 b 是返回需要测试的值的函数
那么我想做的事情是否不符合标准,或者我的编译器只是破坏我的球(VS2008)?
【问题讨论】:
-
"如果我想进入循环" if。
if不是循环,而是条件。 -
@crashmstr: true,但
while的条件与if相同。 -
这不能用逗号操作符来完成吗?我的意思是:
if (int a = foo(), int b = bar(), a && b)?如果逗号运算符未重载,则标准规定表达式从左到右计算,结果值为最后一个表达式。它适用于for循环初始化,为什么不在这里? -
@Archie:我刚试过这个,我无法让它工作。也许您可以提供一个工作示例?
-
@JamesJohnston:我也试过了,但似乎没有用。这个想法刚刚从我的脑海中浮现,
if的工作原理向我提出了建议,这似乎是错误的假设。
标签: c++ compilation if-statement variable-declaration