嵌套的内联IF语句

bob*_*rob 3 .net c# ternary-operator

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

id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ert 14

这是一个非常糟糕的编程实践,你正在使用.条件表达式应该不会有副作用; 他们应该计算价值.你正在执行副作用,然后扔掉副作用!您应该(1)制作无副作用的版本:

id = (isChar && id > 121) ? 65 : id + 1;
Run Code Online (Sandbox Code Playgroud)

或(2)将您的副作用版本写为陈述,而不是表达:

if (isChar && id > 121)
  id = 65;
else 
  id++;
Run Code Online (Sandbox Code Playgroud)

让我们更详细地了解这个原始错误代码的简化版本有什么问题:

id = whatever ? 65 : id++;
Run Code Online (Sandbox Code Playgroud)

假设whatever是假的.怎么了? id++在道德上等同于:

int PostIncrement(ref int x)
{
    int temp = x;
    x = temp + 1;
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

所以假设你做了:

id = whatever ? 65 : PostIncrement(ref id);
Run Code Online (Sandbox Code Playgroud)

怎么了?假设id是1.你通过参考传递它PostIncrement.PostIncrement复制id- 1 - 的值temp.然后它添加一个 - 2 - 并将结果分配给id.所以,id现在是2.然后返回1.

回到调用者,id现在是2,然后你分配结果PostIncrement,即1,现在又id是1.

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


Kon*_*lph 7

更改id++id + 1在这两种情况下.你正在丢弃最后执行的赋值增量的变化.

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

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

id += 1;
if (isChar && id > 122)
    id = 65;
Run Code Online (Sandbox Code Playgroud)

要么

id = (isChar && id > 121) ? 65 : id + 1;
Run Code Online (Sandbox Code Playgroud)