2010-05-09 20 views
9

为什么这样一句话:关于?和:在C++

int a = 7, b = 8, c = 0; 
c = b>a?a>b?a++:b++:a++?b++:a--; 
cout << c; 

不等于:

int a = 7, b = 8, c = 0; 
c = (b>a?(a>b?a++:b++):a++)?b++:a--; 
cout << c; 

,等于:

int a = 7, b = 8, c = 0; 
c = b>a?(a>b?a++:b++):(a++?b++:a--); 
cout << c; 

请给我一些原因。为什么?

+4

http://www.cppreference.com/wiki/operator_precedence – phimuemue 2010-05-09 11:52:44

+31

耶稣基督,为什么你曾经想要写这样的代码?! – Skilldrick 2010-05-09 11:52:59

+0

你应该很好地用括号写代码,除非你知道优先级 – Zai 2010-05-09 12:08:30

回答

15

因为? :是从右到左的关联。它在语言中定义如此。

+0

你知道,我认为你是对的,我错了。我要删除我的。 – 2010-05-09 12:02:26

+0

绝对正确。谢谢 – assembler 2010-05-09 18:03:36

7

我相信@sth提供了正确的答案,但是,我认为@Skilldrick在评论中说得很对 - 为什么你会这样写这样的东西。

除了优先级问题,在单个语句中增加相同变量时,您确实需要小心。声明中可能有也可能没有顺序点,因此可能无法保证增量的评估顺序。在同一编译器中,您可能会得到不同编译器的不同结果,甚至不同的优化设置。

+2

绝对 - 同一个序列点上同一个变量的多个增量是可怕的*未定义行为*。这条线可能合法地等于其中任何一条。 – Stewart 2010-05-09 11:55:08

+0

一个? b:c有保证。 – 2010-05-09 11:56:02

+1

我可能会误解,但不是'?:'那些确保评估顺序的操作符之一,并且在评估操作符(其他是'','''&&','||'和可能一些其他)? – UncleBens 2010-05-09 11:56:23

1

运营商&&||?:在表达式中执行流控制。 ?:的行为就像一个if-else语句。

c = b>a?a>b?a++:b++:a++?b++:a--; 

if (b>a) 
    if (a>b) 
     a ++; 
    else 
     b ++; 
else if (a ++) 
    b ++; 
else 
    a --; 

b>a? (
    a>b ? 
     a ++ 
    : 
     b ++ 
) : (a ++ ? 
    b ++ 
: 
    a -- 
) 

关联是必要的行为,如if … else if … else

有时候我用类似你们的语法序列比较的表达式:

operator<()(arr &l, arr &r) { 
    return l[0] < r[0]? true 
     : r[0] < l[0]? false 
     : l[1] < r[1]? true 
     : r[1] < l[1]? false 
     : l[2] < r[2]; 
} 
+0

不错的提示。 +1谢谢 – assembler 2010-05-10 16:01:07