我有点困惑为什么这不起作用:
id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);
此处的输入可以是转换为INT的int或char。然后我递增id并增加int或char。问题是,当我输入一个字符时,数字似乎没有变化?
答案 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
传递它。 PostIncrement
在id
中复制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)。