如何通过一个简短的"if-else"结果

本文关键字:quot 结果 if-else 何通过 一个 | 更新日期: 2023-09-27 18:07:30

假设我在循环中有一个简短的if-else语句,如下例所示:

for(...)
{
    a = b == c ? b : c;
    // More unnecessary code if the result was true.
}

我想用条件的结果来打破循环:

for(...)
{
    a = b == c ? b break : c;
    // Now the unnecessary code is not executed.
}

我意识到我可以像这个例子一样完整地输入它:

for(...)
{
    if( b == c )
    {
        a = b;
        break;
    }
    else
    {
        a = c;
    }
    // Now the unnecessary code is not executed.
}

但是它太长了,我试图把每个中断条件都放在一行中,因为有几个。

如何通过一个简短的"if-else"结果

您可以在不使用三元操作符的情况下使用缩短的语法,但是您想要做的是不可能的。如果在if中有break语句,也不需要else

for (...)
{
    if (b == c) { a = b; break; }
    a = c;
    // More code if b does not equal c
}

以下是有关三元操作符及其用法的一些信息:?: Operator (C#)

你想做的事是不可能的……不是这样的

对于您给出的示例,您可以将其重新构建为

for (int i = 0; i < count && b != c; ++i)
{
    if( b != c )
    {
        // code
    }
}
a = b;

但是,您想要做的特定事情(从三元内断开)是不可能的。

三元运算符(即"简写的if-else")仅用于根据布尔值计算两个语句中的一个。它不像if那样是一个流控制结构;它实际上返回它执行的语句的结果。你不能用它来执行这样的代码。

如果你最终得到一个很长的else-if-else-if链,请考虑稍微重构一下。可以将其替换为switch

为测试创建一个函数。如果它被重用,它至少比你的例子短。

int a;
if(TryEqual(b, c, out a))
    break;
bool TryEqual(int x, int y, out res)
{
    if(x == y)
    {
        res = x;
        return true;
    }
    res = y;
    return false;
}

我想出了这个办法。

for (...)
{
  if ( (b == c ? (a=b) == a : (a=c) != a) ) break;
}

当然,精明的读者会注意到,你可以总是赋值a=c,然后当且仅当b==c相等时将其断开。

for (...)
{
  a = c; if (b==c) break;
}

这是最简短和优雅的,同时仍然保持那些讨厌的if-else结构合并到单行。