3

假设我在循环中有一个速记 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.
}

但它太长了,我试图在一行中包含每个中断条件,因为它们中有几个。

4

6 回答 6

5

您可以在不使用三元运算符的情况下使用缩短的语法,但是您尝试做的事情是不可能的。else如果您breakif.

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

    a = c;
    // More code if b does not equal c
}
于 2013-04-04T15:44:22.177 回答
2

对于您给出的示例,您可以对其进行重组

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

但是,您尝试做的特定事情(从三元组中打破)是不可能的。

于 2013-04-04T15:44:28.780 回答
2

以下是有关三元运算符及其用途的一些信息: ?: Operator (C#)

你想做的事是不可能的……这不是它的工作方式。

于 2013-04-04T15:45:51.060 回答
1

三元运算符(即“速记 if-else”)仅用于评估基于布尔值的两个语句之一。与其说是流控制结构,不如说是if; 它实际上返回它执行的语句的结果。你不能用它来执行这样的代码。

如果您最终得到一个很长的 else-if-else-if 链,请考虑进行一些重构。可以用switch块代替它。

于 2013-04-04T15:47:44.197 回答
0

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

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;
}
于 2013-04-04T15:47:51.607 回答
0

我想出了这个解决方案。

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

当然,精明的读者会注意到,当且仅当as 等价时,您总是可以分配a=c然后中断。b==c

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

这将尽可能短而优雅,同时仍将那些讨厌的 if-else 构造合并为一行。

于 2013-04-04T19:00:12.473 回答