如何通过使用“?”缩小这个特殊的行(杂乱)操作者

时间:2012-01-31 05:52:22

标签: c# operators

我正在开展一个项目,我必须查看其他人的代码并对其进行修改。 然而,由于我班上的许多同学都很擅长编程,所以很多人都有这样一个混乱的组织。 我被赋予即兴创作的代码有很多缺陷和冗余的冗余行。 我正在尽力清理它们,但由于我的经验不足,我发现很难清理它们。 诸如

之类的行
if (turnElapsed[1] == 2)
{
    turnElapsed[0] += 1;
    turnElapsed[1] = 0;
}
turnElapsed[1]++;

对我来说看起来很多余。 我相信,必须有一个更好的方法来编写它的简单版本。 所以我尝试了下面的代码,但它似乎无法正常工作。

turnElapsed[0] += (turnElapsed[1]++ == 2) ? 1 ; 0 ;
turnElapsed[1] = (turnElapsed[1] == 2 ) ? 0; turnElapsed[1];

3 个答案:

答案 0 :(得分:5)

首先,您使用;作为分隔符而不是:,这是语法错误。其次,你在第一行递增turnElapsed[1],这意味着当它到达第二行时它将不再等于2 - 这与原始逻辑不同。这就是您的版本无法正常运行的原因。

但是,如果您确实修复了这些错误,我认为您的代码不会更容易阅读。原件更具可读性,因为它更清楚地表达了意图。您可以阅读并将其表达为“如果turnElapsed [1]为2然后......”。您的替代方案占用的线路更少,但更“神秘”。原始代码的另一个优点是,如果你想在if条件为真时中断,你可以在大括号内放置一个断点 - 你不能用三元运算符(?)来做。

答案 1 :(得分:1)

你的问题是它不易阅读和理解。这就是为什么你没有看到你的错误 问题是你没有在第二个版本中增加。试试这个

turnElapsed[0] += (turnElapsed[1]++ == 2) ? 1 : 0 ;
turnElapsed[1] = ((turnElapsed[1] == 2 ) ? 0; turnElapsed[1]) + 1;

答案 2 :(得分:1)

难道你不只是在turnElapsed中保留二进制数,而最重要的位在turnElapsed [0]中?一个更好的代码版本是:

long turnElapsed;

...

turnElapsed++;

或者,如果你真的不想开始搞乱位:

turnElapsed[0] += turnElapsed[1]
turnElapsed[1] = (1 + turnElapsed[1]) % 2

编辑:显然,turnElapsed [1]为0或1,每当turnElapsed从1变为0时,turnElapsed [0]就会递增。所以你有以下内容:

long number;

...

number++;
turnElapsed[0] = number/2;
turnElapsed[1] = number%2;

不需要ifs,?:或其他任何东西。实际上,你甚至不需要数组。