作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有点困惑为什么这不起作用:
id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);
这里的输入既可以是int,也可以是转换为INT的char。然后我递增 id 并增加 int 或 char。问题是,当我输入一个字符时,数字似乎没有变化?
最佳答案
这是您正在使用的极差的编程实践。条件表达式应该不有副作用;他们应该计算值。您正在执行副作用,然后丢弃副作用!您应该 (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
在 temp
中复制了 id
的值 - 1 -。然后它将 1 添加到那个 - 2 - 并将结果分配给 id
。所以 id
现在是 2。然后它返回 1。
回到调用者,id
现在是 2,然后你分配 PostIncrement
的结果,它是 1,现在是 id
又是 1。
不要使用 id++
来表示 id + 1
因为那根本不是它的意思。
关于c# - 嵌套内联 IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605028/
我是一名优秀的程序员,十分优秀!