我有点困惑为什么这个不起作用:
id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);
这里的输入可以是一个int或转换为int的char。然后我会递增ID并增加int或char。问题是,当我输入一个char时,数字似乎没有变化?
我有点困惑为什么这个不起作用:
id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);
这里的输入可以是一个int或转换为int的char。然后我会递增ID并增加int或char。问题是,当我输入一个char时,数字似乎没有变化?
这是一种极其糟糕的编程实践,你正在使用它。条件表达式不应该具有副作用; 它们应该计算值。你正在执行副作用,然后抛弃这个副作用!你应该要么(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。 你通过引用将其传递给PostIncrement
。 PostIncrement
在temp
中复制了id
的值 - 1。 然后它加上1 - 2,并将结果赋给id
。 因此,id
现在为2。 然后它返回1。
回到调用者,id
现在为2,然后您分配了PostIncrement
的结果,即1,现在id
再次为1。
不要使用id++
来表示id + 1
,因为这完全不是它的意思。
id++
更改为id + 1
。你正在丢弃赋值中增量的变化,而这是最后执行的。 ++
)。它们使整个表达式难以处理。这在这里使你出了错。id
,因为你似乎总是要增加它:id += 1;
if (isChar && id > 122)
id = 65;
或者
id = (isChar && id > 121) ? 65 : id + 1;
++id
,可以简单地修复这个问题。