2012-03-07 145 views
3

我有点困惑,为什么这不工作:嵌套的内嵌IF语句

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

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

+0

输入一个字符?请显示所有相关的代码。 – vulkanino 2012-03-07 16:11:25

+0

如何让您的代码首先可读。我看到很多神奇的数字。 – RvdK 2012-03-07 16:12:34

回答

7

在两种情况下将id++改为id + 1。您正在抛弃最后执行的赋值中的增量更改。

作为一般规则,避免在复杂表达式中出现副作用(如++)。他们使整个表达难以对付。这让你在这里绊倒了。

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

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

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

另外添加一些括号可能会使它更容易阅读。 – Khan 2012-03-07 16:12:51

14

这是一个极差的编程实践您使用。条件表达式应该是而不是有副作用;他们应该计算的值。你正在执行副作用,然后扔掉副作用!你应该:(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来传递它。 PostIncrementtemp中复制了价值id - 1 - 。然后它添加一个 - 2 - 并将结果分配给id。所以id现在2.然后返回1.

回到调用者,现在id是2,然后您分配的PostIncrement,这是1,现在id又是1的结果。

请勿使用id++来表示id + 1,因为那根本不是什么意思。

0

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

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

有关更多详情,请参阅++ Operator (C# Reference)