我可以在C++中声明两个变量吗?编译器给了一个错误,但还是我想我应该得到一个意见:在条件声明两个变量?
int main()
{
double d1 = 0;
if((double d2 = d1) || (double d3 = 10))
cout << "wow" << endl;
return 0;
}
我可以在C++中声明两个变量吗?编译器给了一个错误,但还是我想我应该得到一个意见:在条件声明两个变量?
int main()
{
double d1 = 0;
if((double d2 = d1) || (double d3 = 10))
cout << "wow" << endl;
return 0;
}
你只能做到这一点对一个变量
if(double d2 = d1)
cout << "wow" << endl;
else
if(double d3 = 10)
cout << "wow" << endl;
,但我会宣布他们的条件之外。如果你害怕有关的范围,你总是可以限制它:
{
double d2 = d1;
double d3 = 10;
if(d2 || d3)
cout << "wow" << endl;
}
当然,这个评估即使d2
计算结果为true第二初始化。但我认为这并不重要。
这是不可能在C++中,也许你正在考虑的C#或较新的编程语言。在条件之外声明d2和d3没有任何缺点。
您可能想问问C++标准文档在哪里。
我不认为这是一个好主意,你正在尝试做的是告诉编译器:
声明D2在D2 放D1比D2 0 如果是= 0跳!下面 其他 声明D3代码 把10 D3 比较D2 0 如果它是!= 0跳转到下面 其他 代码跳过下面
代码只是声明D2和D3的康迪以上只有当你使用有限的内存(并且不希望在达到这段代码之前为d2和d3分配空间),这可能是一个好主意。这一切归结为你真正打算做的事情。
在C++中,你可以做这样的事情:
if (bool b = (a == b)) {
// Do something with b here...
}
或:
if (double d2 = d1) {
// ...
}
但是,我从来没有见过这种风格在真正的代码中使用。我认为总是有更清晰的方式来写同一件事。
此外,试图声明if
或while
语句的条件部分中的多个变量不受支持。您将不得不求助于嵌套if
或else if
以获得相同的语义。
实施例:
if (double d2 = d1) {
cout << "wow" << endl;
} else if (double d3 = 10) {
cout << "wow" << endl;
}
这样d3
如果d2
评估为假仅创建。
if((double d2 = d1) || (double d3 = 10))
cout << d2 + d3 << endl;
的||
操作者短路,所以d2 + d3
表达式引用(潜在地)未初始化D3。这样的功能会产生很多不良影响,IMO也无济于事,所以这可能就是为什么它不在那里。
_uninitialized_变量在C++中没有问题(只需键入'double d3;',你将会有一个)。我猜,问题出在_undeclared_变量中。例如,'double d3;如果(double d2 = d1 || d3 = 10)'会让你的答案的第一句话(观察)仍然是正确的,但是让你的结论(你的答案的第二句)不正确。 – Jasper 2010-07-18 19:42:13
@Jasper,条件工作将等于允许跳过初始化变量,这同样是不允许的。请注意'double d3;'是允许的,但'string s3;'永远不会让字符串“未初始化” - 它会调用它的默认构造函数。但是,你期望一个可以转换为“布尔”的字符串在这样的条件下做什么?它会被它的构造函数初始化吗? – 2010-07-18 19:48:58
@Johannes,我完全意识到,你正在“未定义行为”的魔法世界中结束,在这个世界中,任何事情都可能发生,因此你仍然不应该使用我给的样本,我只是试图找出问题的原因更好。如果字符串是空的,我希望一个可转换为“bool”的字符串转换为false(尽管我会在字符串的文档中查看它),但为了查看我期望的''''情况,我需要一个你正在谈论的情况的实例。 – Jasper 2010-07-18 19:55:41
可能还有其他的东西也困扰着你,但是||-operator的工作方式存在问题。我不记得它是如何在标准的措辞,但在a || b
或者你的编译器应该不评估b
如果a
评估为真,或者您的编译器可能会选择不这样做。
考虑到在你的语句中你不能确定你的变量是否已经声明 - 在C++中你只能使用声明的变量,所以d3
在你的例子中将是一个非常无用的变量,如果你问我你不确定它是否已被声明)。
不,那当然是无效的。你到底想做什么? – 2010-07-18 19:06:34
这是不正确的,即使它被允许,它总是会评估为真。 – DumbCoder 2010-07-18 19:17:09