用于比较的三元运算符未给出准确的结果

本文关键字:结果 运算符 三元 比较 用于 | 更新日期: 2023-09-27 18:34:13

我正在使用三元运算符进行比较和计算,但它没有给出预期的结果。我错过了什么或做错了什么?

int x = 600000;
x = (x > 250000 && x < 500000 ? 
        (x > 500000 && x < 1000000 ? 
            (x > 1000000 ? 
                x = (x / 100) * 30 : 
                x = (x / 100) * 20) : 
            x = (x / 100) * 10):
        x);

我想实现这一点:

if (x > 250000 && x < 500000)
{
    x = (x / 100) * 10;
}
else if (x > 500000 && x < 1000000)
{
    x = (x / 100) * 20;
}
else if (x > 1000000)
{
    x = (x / 100) * 30;
}

用于比较的三元运算符未给出准确的结果

x = (x > 250000 && x < 500000) ? (x / 100) * 10 : ((x > 500000 && x < 1000000) ? (x / 100) * 20 : ((x > 1000000) ? (x / 100) * 30 : x));

形式(conditional) ? expr1 : expr2的三元运算符应读作if conditional then expr1 otherwise expr2

首先让我警告您,像这样的长三元操作通常不是规定的,因为如果有任何修改,它只会在将来引起问题。但是,以下内容将执行所需的操作:

int x = 600000;
x = (x > 250000 && x < 500000) ? ((x / 100) * 10): ((x > 500000 && x < 1000000) ? ((x / 100) * 20): (x > 1000000) ? ((x / 100) * 30):x);
你把

if-then-else级联错了。else ifelse的一部分。因此,表达式为:

x = (x > 250000 && x < 500000) ?
    (x / 100) * 10 :
    ((x > 500000 && x < 1000000) ?
        (x / 100) * 20 :
        ((x > 1000000) ?
            (x / 100) * 30 ) :
            x
        )
    )
);

但我不明白你为什么要对如此复杂的语句使用三元运算符。它们不会产生任何性能提升。三元运算符主要用于没有(或不太多)级联的小表达式。

背景资料

else if实际上是级联到else中的if,因此:

if (x > 250000 && x < 500000) {
    x = (x / 100) * 10;
}
else if (x > 500000 && x < 1000000) {
    x = (x / 100) * 20;
}
else if (x > 1000000) {
    x = (x / 100) * 30;
}

实际阅读:

if (x > 250000 && x < 500000) {
    x = (x / 100) * 10;
}
else {
    if (x > 500000 && x < 1000000) {
        x = (x / 100) * 20;
    }
    else {
        if (x > 1000000) {
            x = (x / 100) * 30;
        }
    }
}

如果你缩进你的代码,它会使查看发生了什么更容易一些

x = (x > 250000 && x < 500000
        ? (x > 500000 && x < 1000000
            ? (x > 1000000
                ? x = (x / 100) * 30
                : x = (x / 100) * 20)
            : x = (x / 100) * 10)
        :x);

这转化为以下if-else语句:

if (x > 250000 && x < 500000)
{
    if (x > 500000 && x < 1000000)
    {
        if (x > 1000000)
        {
            x = (x / 100) * 30;
        }
        else
        {
            x = (x / 100) * 20;
        }
    }
    else
    {
        x = (x / 100) * 10;
    }
}
else
{
    x = x;
}

很明显,如果满足x > 250000 && x < 500000,那么它将永远不会到达第二个if语句。