繁体   English   中英

关于问题 ?并且:在c ++中

[英]question about ? and : in 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;

请给我一些理由。 为什么?

因为? : ? :是从右到左的关联。 它的定义与语言中的相似。

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

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

运算符&&|| ,和?:在表达式中执行流控制。 ?:表现得像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];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM