如何将if,else if逻辑转换为三元运算符?

15

我在想这是否有可能,因为我开始使用三元运算符来减少代码行数,我喜欢它。

if (x==y)
{
    z += x;
} else if (x==z)
{
    z += y;
} else {
   z += 1;
}

如果只有一个这样的if语句,我现在可以做到这一点:

z = x == y ? z += x : z += 1;

23
我开始使用三元操作符来减少代码行数,我很喜欢它。哎呀。 - BoltClock
如果只有一条指令,可以省略大括号。而且比三元运算符更易读。在我看来。 - Maresh
1
@BoltClock,你能解释一下为什么这样做不好吗?我很愿意听取意见。 - some_bloody_fool
2
在使用三元运算符时需要小心。不要仅仅因为它看起来很酷或为了减少代码行数而使用它。就像马雷什所说,如果你真的想减少代码行数,你可以从去掉大括号开始。你不需要把所有东西都挤到一行里。你在这里提供的用例是一个你真的应该努力避免使用它的场景,尽管在理论上你可以使用它。 - BoltClock
6个回答

41

就像这样:

z =
  x == y ? z + x :
  x == z ? z + y :
  z + 1;
如果您将z += x用作操作数,它最终会执行z = (z += x)。虽然在这种特殊情况下它起作用,因为表达式z += x的结果是z的最终值,但在其他情况下可能无法正常工作。
然而,由于所有操作都具有共同点z +=,您可以这样做:
z +=
  x == y ? x :
  x == z ? y :
  1;

要小心使用。代码越简单易懂,可维护性就越高,而嵌套的条件操作并不容易阅读。此外,只有在将一个表达式作为条件操作的结果时才使用它,它不能替代if语句。


7

您可以使用

z += x == y ? x : x == z ? y : 1;

但是,老实说,这并不比之前更易读。你可以通过添加括号使其稍微清晰一些:
z += x == y ? x : (x == z ? y : 1);

但是通常情况下,除非在高尔夫比赛中使用,否则我会避免使用嵌套条件运算符。


经过一些谨慎的换行,我认为这比原来的代码更易读。 - recursive
Michael: 同意;我为此添加了一个注释。recursive:我刚试图将其格式化为多行,但未能使其更易理解。也许是我太菜了。但也许对于可读性来说,复杂的条件运算符难以格式化。 - Joey
@Joey:Guffa有和我一样的想法。在我看来,他的解决方案非常易读。 - recursive

5

只需四行代码,且我认为这是最易读的。这里不需要三目运算符:

if (x == y || x == z)
    z += y;
else 
   z++;    

如果我必须使用三目表达式进行编写,我会这样做:

z += (x == y || x == z) ? y : 1;

@AshBurlaczenko:有什么区别吗? - recursive
@Ash Burlaczenko:它的执行方式完全相同。如果xy都是相同的,那么决定添加哪一个就没有意义了;如果它们不同,那么你无论如何都会添加y - BoltClock
据我的测试,是的。 - Adam Houldsworth
是的,实际上这与原始版本相同,因为当 x == y 时,z += x 和 z += y 是一样的。但我相信这只是一个示例,使用条件运算符才是真正的问题。 - Guffa

3
您应该使用括号来执行此操作,就像这样:
(x==y)?(z+=x):((x==z)?(z+=y):(z+=1))

2
使用三目运算符比使用if else if条件语句更简单直观,只需要在“:”号之后继续执行即可。以下是示例:

var result = a ? x : b ? y : z;

参考示例


(本文为IT技术相关内容)

0

将计算 z 的过程转化为一行代码,我会这样做:

public int GetZBasedOnXY(int z, int x, int y)
{
    // Chose this solution, but any can go in here and work.
    if (x == y || x == z)
        return z + y;
    else 
        return z + 1;
}

然后:

z = GetZBasedOnXY(z, x, y);

更易读,并且如果命名良好且方法具有单元测试覆盖范围,那就更好了。


这不是 if else 的三元操作符。 - dicemaster
@dicemaster 是的,我知道。我提供了一种不同的方式来将条件压缩成单行使用。还有很多其他答案展示了三元运算符(以及它最终看起来有多么可怕)。 - Adam Houldsworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接