嵌套的内嵌IF语句
我有点困惑,为什么这不工作:嵌套的内嵌IF语句
id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);
这里的输入可以是一个int或转换为INT一个字符。然后我增加id并增加int或char。问题是,当我输入一个字符时,这个数字似乎没有改变?
在两种情况下将id++
改为id + 1
。您正在抛弃最后执行的赋值中的增量更改。
作为一般规则,避免在复杂表达式中出现副作用(如++
)。他们使整个表达难以对付。这让你在这里绊倒了。
更重要的是,增加id
事先因为你总是似乎递增它:
id += 1;
if (isChar && id > 122)
id = 65;
或
id = (isChar && id > 121) ? 65 : id + 1;
另外添加一些括号可能会使它更容易阅读。 – Khan 2012-03-07 16:12:51
这是一个极差的编程实践您使用。条件表达式应该是而不是有副作用;他们应该计算的值。你正在执行副作用,然后扔掉副作用!你应该:(1)做一个免费的副作用版本:
id = (isChar && id > 121) ? 65 : id + 1;
或(2)写你的副作用的版本声明,不表达式:
if (isChar && id > 121)
id = 65;
else
id++;
让我们仔细看看这个简化版本的原车错误代码有什么问题:
id = whatever ? 65 : id++;
Sup构成whatever
是错误的。怎么了? id++
在道德上是等同于:
int PostIncrement(ref int x)
{
int temp = x;
x = temp + 1;
return temp;
}
因此,假设你做:
id = whatever ? 65 : PostIncrement(ref id);
会发生什么?假设id
是1.您通过参考PostIncrement
来传递它。 PostIncrement
在temp
中复制了价值id
- 1 - 。然后它添加一个 - 2 - 并将结果分配给id
。所以id
现在2.然后返回1.
回到调用者,现在id
是2,然后您分配的PostIncrement
,这是1,现在id
又是1的结果。
请勿使用id++
来表示id + 1
,因为那根本不是什么意思。
其他答案是正确的。您应该首先考虑他们的建议,但是可以通过简单地将++运算符移到变量之前来解决此问题,即++id
。
本质上,在您的变量(后缀增量操作)之后将++放在变量之前返回变量的值。通过将++移动到变量前面(前缀增量操作),它会在执行增量后返回变量的值。请注意,在这两种情况下,递增的值仍存储在变量中,只有操作返回的值受到影响。
有关更多详情,请参阅++ Operator (C# Reference)。
输入一个字符?请显示所有相关的代码。 – vulkanino 2012-03-07 16:11:25
如何让您的代码首先可读。我看到很多神奇的数字。 – RvdK 2012-03-07 16:12:34