【问题标题】:Ternary operator in -for- statement-for- 语句中的三元运算符
【发布时间】:2015-01-13 20:00:10
【问题描述】:

我试图在 for 语句的最后部分使用三元运算符来增加或减少我的索引..但这似乎不是 c 语言中的正确语句?我正在尝试从 Javascript 中移动一些代码,这就是我尝试这样做的原因。

  for (int _j = 0, _ref = (int) Math.Floor((double)array.Count / 2);
       0 <= _ref ? _j < _ref : _j > _ref; 
       0 <= _ref ? _j++ : _j--)
  { 
      _results1.Add(_j); 
  }

知道如何在 C# 的 for 语句中实现三元运算符吗?

【问题讨论】:

  • 只需将逻辑提取到方法中即可;不要尝试内联它。
  • 那个嵌套的三元让我的眼睛流血了:(
  • 可读代码要好得多..
  • 三元是没用的,因为array.Count永远不会是负数。只需确定采用哪个分支并删除另一个。
  • 我没有投反对票,但问题是“没用”,因为您永远不应该这样做。你坐在 +1/-2,还不错。

标签: javascript c#


【解决方案1】:

在 C# 中,for 语句需要一个 init 语句、一个 bool 表达式、一个增量语句

你可以把它分成两种情况:

_ref = (int) Math.Floor((double)array.Count / 2); // assuming this can go negative...
if(0 <= _ref)
{
    for (int _j = 0; _j < _ref; _j++)
    { 
        _results1.Add(_j); 
    }
}
else
{
    for (int _j = 0; _j > _ref; _j--)
    { 
        _results1.Add(_j); 
    }
}

如果你喜欢它更短,你可以删除所有花括号...

【讨论】:

  • 在第二个循环中我想你的意思是int _j = _ref
  • 不,在这两种情况下都是_j=0
  • 然后您会注意到if 条件始终为真,除非有人在我不注意的时候发明了负长度的数组。
  • @BenVoigt array 实际上不是一个数组。数组没有 Count 属性。不知道它是什么,它可能是某种具有返回负值的Count 成员的类型。
  • 另外,一个除以二在某处丢失了。我确实相信(int)Math.Floor((double) array.Count / 2.0)array.Count &gt;&gt; 1 一样。
【解决方案2】:

条件表达式0 &lt;= _ref ? _j++ : _j-- 不是有效语句。您可以通过多种方式对其进行陈述,但因为它是不完整的。正如您收到的错误消息所示,您需要该语句是 await、方法调用、递增/递减或新对象表达式,才能使其成为有效的表达式语句。条件运算符不在该列表中。

当然,与其在表达式中添加完全多余的方法调用,真正的解决方法是一开始就根本不使用这样的条件运算符,而不是添加更多不可读的代码来编译它。

【讨论】:

    【解决方案3】:

    三元运算符需要两个表达式,所以这不起作用。你可以做的是:

    _j += (0 <= _ref ? 1 : -1);
    

    不过,这看起来比可怕还要糟糕。

    【讨论】:

    • 他提供了两种表达方式。他的代码是一个有效的条件表达式。 _j++ 是一个表达式。
    • @Servy 在 C# 中,这甚至不会编译。 for (var i = 0; i &lt; 10; someBool ? i++ : i--) { } 或者我错过了什么?
    • 你是正确的它不会编译,你错了它不会编译的原因。由于您所说的完全不同的原因,它会出错。为条件运算符提供的语法非常好;代码无法编译,因为有效的条件运算符在使用它的上下文中无效。
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2016-06-28
    • 1970-01-01
    • 2015-10-13
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多