2010-07-18 68 views
0

我可以在C++中声明两个变量吗?编译器给了一个错误,但还是我想我应该得到一个意见:在条件声明两个变量?

int main() 
{ 
    double d1 = 0; 
    if((double d2 = d1) || (double d3 = 10)) 
     cout << "wow" << endl; 
    return 0; 
} 
+0

不,那当然是无效的。你到底想做什么? – 2010-07-18 19:06:34

+0

这是不正确的,即使它被允许,它总是会评估为真。 – DumbCoder 2010-07-18 19:17:09

回答

5

你只能做到这一点对一个变量

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第二初始化。但我认为这并不重要。

0

这是不可能在C++中,也许你正在考虑的C#或较新的编程语言。在条件之外声明d2和d3没有任何缺点。

0

您可能想问问C++标准文档在哪里。

我不认为这是一个好主意,你正在尝试做的是告诉编译器:

声明D2在D2 放D1比D2 0 如果是= 0跳!下面 其他 声明D3代码 把10 D3 比较D2 0 如果它是!= 0跳转到下面 其他 代码跳过下面

代码只是声明D2和D3的康迪以上只有当你使用有限的内存(并且不希望在达到这段代码之前为d2和d3分配空间),这可能是一个好主意。这一切归结为你真正打算做的事情。

0

在C++中,你可以做这样的事情:

if (bool b = (a == b)) { 
    // Do something with b here... 
} 

或:

if (double d2 = d1) { 
    // ... 
} 

但是,我从来没有见过这种风格在真正的代码中使用。我认为总是有更清晰的方式来写同一件事。

此外,试图声明ifwhile语句的条件部分中的多个变量不受支持。您将不得不求助于嵌套ifelse if以获得相同的语义。

实施例:

if (double d2 = d1) { 
    cout << "wow" << endl; 
} else if (double d3 = 10) { 
    cout << "wow" << endl; 
} 

这样d3如果d2评估为假仅创建。

3
if((double d2 = d1) || (double d3 = 10)) 
    cout << d2 + d3 << endl; 

||操作者短路,所以d2 + d3表达式引用(潜在地)未初始化D3。这样的功能会产生很多不良影响,IMO也无济于事,所以这可能就是为什么它不在那里。

+1

_uninitialized_变量在C++中没有问题(只需键入'double d3;',你将会有一个)。我猜,问题出在_undeclared_变量中。例如,'double d3;如果(double d2 = d1 || d3 = 10)'会让你的答案的第一句话(观察)仍然是正确的,但是让你的结论(你的答案的第二句)不正确。 – Jasper 2010-07-18 19:42:13

+1

@Jasper,条件工作将等于允许跳过初始化变量,这同样是不允许的。请注意'double d3;'是允许的,但'string s3;'永远不会让字符串“未初始化” - 它会调用它的默认构造函数。但是,你期望一个可以转换为“布尔”的字符串在这样的条件下做什么?它会被它的构造函数初始化吗? – 2010-07-18 19:48:58

+1

@Johannes,我完全意识到,你正在“未定义行为”的魔法世界中结束,在这个世界中,任何事情都可能发生,因此你仍然不应该使用我给的样本,我只是试图找出问题的原因更好。如果字符串是空的,我希望一个可转换为“bool”的字符串转换为false(尽管我会在字符串的文档中查看它),但为了查看我期望的''''情况,我需要一个你正在谈论的情况的实例。 – Jasper 2010-07-18 19:55:41

1

可能还有其他的东西也困扰着你,但是||-operator的工作方式存在问题。我不记得它是如何在标准的措辞,但在a || b或者你的编译器应该不评估b如果a评估为真,或者您的编译器可能会选择不这样做。

考虑到在你的语句中你不能确定你的变量是否已经声明 - 在C++中你只能使用声明的变量,所以d3在你的例子中将是一个非常无用的变量,如果你问我你不确定它是否已被声明)。

+0

它被宣布无论如何。声明发生在编译区,它们不是在运行时确定的。你可以跳过初始化,但它会一直声明。 – GManNickG 2010-07-19 03:57:35

+1

错了。声明确实是在编译时完成的。但是,由于代码将它放到运行时条件中,无论它是否需要声明或者不是,这是没有意义的东西,所以它会产生错误而不是编译成功。所以,基本上,是的,你不能在运行时有一个声明,这是你在这里试图做的,所以它吐出一个错误... – Jasper 2010-07-19 23:50:39