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

时间:2014-12-15 14:12:56

标签: c# ternary-operator

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

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;
}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

首先让我警告你,这样的长三元操作通常没有规定,因为如果有任何修改,它将来只会引起问题。不过,以下内容将满足要求:

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

答案 2 :(得分:0)

您级联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实际上是if级联到else,因此:

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;
        }
    }
}

答案 3 :(得分:0)

如果您缩进代码,则可以更轻松地查看正在进行的操作

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语句。