问题关于?和 : 在 c++

发布于 2024-09-01 00:59:34 字数 395 浏览 9 评论 0原文

为什么这个说法 :

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;

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

Why this statement :

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

is not equal to :

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

and is equal to :

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

Please give me some reason. Why ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南冥有猫 2024-09-08 00:59:34

因为<代码>? : 是从右到左关联。它在语言中是这样定义的。

Because ? : is right-to-left associative. It's defined like that in the language.

幸福%小乖 2024-09-08 00:59:34

我相信@sth 提供了正确的答案,但是,我认为@Skilldrick 的评论是正确的——你到底为什么要写这样的东西。

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

I believe @sth has provided the correct answer, however, I think @Skilldrick got it right on the comments - why the hell would you ever write something like that.

As well as the precedence issue, you really need to be careful when incrementing the same variables in a single statement. There may or may not be sequence points in the statement, and therefore the order of evaluation of the increments might not be guaranteed. You could end up with different results with different compilers or even different optimization settings on the same compiler.

心的憧憬 2024-09-08 00:59:34

运算符 &&||?: 在表达式内执行流控制。 ?: 的行为类似于 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];
}

The operators &&, ||, and ?: perform flow control within expressions. ?: behaves like an if-else statement.

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 --
)

The associativity is necessary to have behavior like if … else if … else.

Sometimes I use an expression similar to yours for lexicographic sequence comparision:

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];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文