用于比较的三元运算符未给出准确的结果
本文关键字:结果 运算符 三元 比较 用于 | 更新日期: 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 if
是else
的一部分。因此,表达式为:
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语句。