2012-07-21 150 views
0

我尝试了后续的使用逗号操作:在if语句

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

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

精细的首部作品,而第二个不能编译。为什么是这样?

编辑:现在我知道,第一个可能无法正常工作,因为我打算。 if范围内的i的值将是1,而不是10.(正如在这个问题上的一个评论所指出的那样)。

那么有没有办法在if语句中同时初始化和使用一个变量,类似于for(int i=0;i<10;i++)?所以你可以产生类似于if((int i=6+4)==10)(它不会编译)的地方,其中if范围内的值是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. 
+0

你为什么想这样做?任何具体要求? – Nawaz 2012-07-21 12:38:38

+1

你使用什么编译器?他们都不应该编译...编辑:语句收回。 – quasiverse 2012-07-21 12:38:42

+0

我猜你不知道逗号操作符实际上做了什么。你想达到什么目的? – tenfour 2012-07-21 12:39:24

回答

5

用作初始值设定项表达式的表达式必须是赋值表达式,所以如果要使用逗号运算符,则必须将初始化项加括号。

E.g. (不是说你正试图使作为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语句前声明该变量,并使用要测试的表达式作为条件。

E.g.

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

这与问题有所不同,它也是未定义的(在比较之前'i'的值是未定义的。 – 2012-07-21 12:45:20

+0

我不明白你的'if'语句 - 你将'i'分配给' bool',并在初始化前比较'i',这有什么意义,它与OP不一样 – David 2012-07-21 12:46:34

+0

这有UB,不是吗? – 2012-07-21 12:50:32

3

我严重怀疑两个例子工作做任何有用的东西。它所做的只是在复杂的时尚中评估为“真实”。

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

-1

有不同的选择,因为你想不能做什么(你不能混用声明逗号运算符)。你可以,例如,声明的if条件的变量外:

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

或者你可以改变的i值是0代替10并重新计算ielse块内:

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

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

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

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

0

由于C++ 17你试图做is finally possible

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

注意使用;代替,的的声明和实际情况分开。