【问题标题】:Nested inline IF statements嵌套的内联 IF 语句
【发布时间】:2012-03-25 04:34:11
【问题描述】:

我有点困惑为什么这不起作用:

id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);

这里的输入可以是一个 int 或一个转换为 INT 的 char。然后我增加 id 并增加 int 或 char。问题是,当我输入一个字符时,数字似乎没有变化?

【问题讨论】:

  • 输入一个字符?请显示所有相关代码。
  • 先让你的代码可读怎么样。我看到了很多神奇的数字。

标签: c# .net ternary-operator


【解决方案1】:

这是您正在使用的极差的编程实践。条件表达式应该有副作用;他们应该计算。您正在执行副作用,然后丢弃副作用!您应该(1)制作一个无副作用的版本:

id = (isChar && id > 121) ? 65 : id + 1;

或 (2) 将您的副作用版本写为 statements,而不是 expressions

if (isChar && id > 121)
  id = 65;
else 
  id++;

让我们更详细地看一下这个简化版的原始错误代码有什么问题:

id = whatever ? 65 : id++;

假设whatever 为假。发生什么了? id++ 在道德上等同于:

int PostIncrement(ref int x)
{
    int temp = x;
    x = temp + 1;
    return temp;
}

假设你这样做了:

id = whatever ? 65 : PostIncrement(ref id);

会发生什么?假设id 是1。你通过引用PostIncrement 来传递它。 PostIncrementtemp 中复制id -- 1 -- 的值。然后将其加一——2——并将结果分配给id。所以id 现在是 2。然后它返回 1。

回到调用者,id 现在是 2,然后你将 PostIncrement 的结果赋值为 1,现在 id 又是 1。

不要使用id++ 来表示id + 1,因为这根本不是它的意思。

【讨论】:

    【解决方案2】:

    在这两种情况下将id++ 更改为id + 1。您正在丢弃最后执行的分配增量中的更改。

    作为一般规则,应避免复杂表达式中的副作用(例如++)。它们使整个表达变得难以处理。这让你在这里绊倒了。

    更好的是,事先增加id,因为你似乎总是增加它:

    id += 1;
    if (isChar && id > 122)
        id = 65;
    

    id = (isChar && id > 121) ? 65 : id + 1;
    

    【讨论】:

    • 另外添加一些括号可能会使其更易于阅读。
    【解决方案3】:

    其他答案都是正确的。您应该首先考虑他们的建议,但是,可以简单地通过将 ++ 运算符移动到变量之前来解决这个问题,即++id

    本质上,将 ++ 放在变量之后(后缀递增操作)会返回变量在递增发生之前的值。通过将 ++ 移动到变量前面(前缀递增操作),它会在执行递增后返回变量的值。请注意,在这两种情况下,增加的值仍然存储在变量中,只有操作返回的值受到影响。

    有关详细信息,请参阅++ Operator (C# Reference)

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多