嵌套的内联IF语句

时间:2012-03-07 16:08:54

标签: c# .net ternary-operator

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

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

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

3 个答案:

答案 0 :(得分:14)

这是您正在使用的极差的编程习惯。条件表达式应该有副作用;他们应该计算。你正在执行副作用,然后扔掉副作用!您应该(1)制作无副作用的版本:

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

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

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传递它。 PostIncrementid中复制temp - 1 - 的值。然后它添加一个 - 2 - 并将结果分配给id。所以id现在是2.然后它返回1.

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

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

答案 1 :(得分:7)

在这两种情况下,将id++更改为id + 1。你丢弃了最后执行的赋值增量的变化。

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

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

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

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

答案 2 :(得分:0)

其他答案都是正确的。您应该首先考虑他们的建议,但是,可以通过在变量之前移动++运算符来修复此问题,即++id

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

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