嵌套的内联IF语句

3

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

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

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


输入一个字符?请展示所有相关的代码。 - vulkanino
先让你的代码易读化怎么样?我看到了很多神奇数字。 - RvdK
3个回答

14

这是一种极其糟糕的编程实践,你正在使用它。条件表达式不应该具有副作用; 它们应该计算值。你正在执行副作用,然后抛弃这个副作用!你应该要么(1)创建一个无副作用的版本:

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

或者(2)将您具有副作用的版本编写为语句,而不是表达式

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

让我们更详细地看一下这个简化版本的错误代码存在哪些问题:

id = whatever ? 65 : id++;

假设whatever为false。会发生什么?id++在道义上等同于:

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

假设你这样做了:

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

发生了什么? 假设id是1。 你通过引用将其传递给PostIncrementPostIncrementtemp中复制了id的值 - 1。 然后它加上1 - 2,并将结果赋给id。 因此,id现在为2。 然后它返回1。

回到调用者,id现在为2,然后您分配了PostIncrement的结果,即1,现在id再次为1。

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


7
在这两种情况下,将id++更改为id + 1。你正在丢弃赋值中增量的变化,而这是最后执行的。
一般来说,避免在复杂表达式中使用副作用(例如 ++ )。它们使整个表达式难以处理。这在这里使你出了错。
更好的方法是先增加id,因为你似乎总是要增加它:
id += 1;
if (isChar && id > 122)
    id = 65;

或者

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

同时加上一些括号可能会使它更容易阅读。 - Khan

0
其他回答是正确的。你应该首先考虑他们的建议,然而,通过将++操作符放在变量之前,即++id,可以简单地修复这个问题。
基本上,将++放在变量后面(后缀递增操作)会返回递增之前的变量值。将++放在变量前面(前缀递增操作)会返回递增后的变量值。请注意,在这两种情况下,递增后的值仍然存储在变量中,只有操作返回的值受到影响。
有关更多详细信息,请参阅++ 运算符 (C# 参考)

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