0

我尝试了以下方法:

if(int i=6+4==10)
    cout << "works!" << i;

if(int i=6+4,i==10)
    cout << "doesn't even compile" << i;

第一个工作正常,而第二个无法编译。为什么是这样?

编辑:现在我知道第一个可能无法按我的意愿工作。i 在 if 范围内的值将是 1,而不是 10。(正如对此问题的评论之一所指出的那样)。

那么有没有办法在 if 语句中同时初始化和使用变量,类似于for(int i=0;i<10;i++)?这样您就可以生成类似if((int i=6+4)==10)(不会编译)的东西,其中 if 范围内的 I 值为 10?我知道你可以在 if 语句之前声明和初始化 I ,但是有没有办法在语句本身中做到这一点?

让您了解为什么我认为这会很有用。

 if(int v1=someObject1.getValue(), int v2=someObject2.getValue(), v1!=v2)
    {
        //v1 and v2 are visible in this scope 
        //and can be used for further calculation without the need to call
        //someObject1.getValue() und someObject2.getValue() again.
    }
    //if v1==v2 there is nothing to be done which is why v1 und v2
    //only need to be visible in the scope of the if.
4

4 回答 4

5

用作初始化表达式的表达式必须是赋值表达式,因此如果要使用逗号运算符,则必须将初始化表达式括起来。

例如(并不是说您尝试的6 + 4内容没有副作用,并且该值被丢弃并在其自己的初始化程序中i == 10使用未初始化的值。)i

if (int i = (6 + 4, i == 10)) // behaviour is undefined

你真的是这个意思吗?

int i = 6 + 4;
if (i == 10)

当使用if声明新变量的形式时,检查的条件始终是转换为的初始化变量的值bool。如果您希望条件是一个涉及新变量的表达式,您必须在语句之前声明该变量if并使用您要测试的表达式作为条件。

例如

int i;
if ((i = 6 + 4) == 10)
于 2012-07-21T12:40:55.570 回答
3

我严重怀疑这两个示例都可以做任何有用的事情。它所做的只是以复杂的方式评估为“真实”。

但是第二个没有编译的原因是它被解释为两个声明:int i = 6+4; int i==10并且int i==10无效,因为这是一个相等运算符,而不是一个赋值。

于 2012-07-21T12:40:42.987 回答
0

从 C++17 开始,您尝试做的事情终于成为可能

if (int i=6+4; i==10)
    cout << "works, and i is " << i << endl;

注意使用 of;而不是,分隔声明和实际条件。

于 2017-05-25T09:39:52.730 回答
-1

有不同的选择,因为您想要的无法完成(您不能将逗号运算符与声明混合)。例如,您可以在if条件之外声明变量:

int i = 6+4;
if ( i == 10 ) ...

或者,您可以将 的值更改为iis0而不是10ielse块内重新计算:

if ( int i = (6+4)-10 ) ; else {
   i += 10;
   // ...
}

简单得多,根本不声明变量,因为您知道循环内的值:

if ( (6+4)==10 ) {
   int i = 10;
   // ...
}

i当然,除非您在它不是的情况下需要 的值,10在这种情况下,第二个选项是最合适的。

于 2012-07-21T12:54:35.340 回答