我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。

这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:

v = (v == 0 ? 1 : 0);

你能改进一下吗?

编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。


当前回答

我不知道你为什么要建立你自己的布尔值?我喜欢时髦的语法,但为什么不编写易懂的代码呢?

这不是最短/最快的,但最清楚的(每个人都能读懂)是使用众所周知的if/else状态:

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

如果你想更清楚,你应该使用布尔值而不是数字。在大多数情况下,它们足够快。对于布尔值,你可以使用这样的语法,它将在简短中获胜:

v = !v;

其他回答

如果v的可能值只有0和1,那么对于任意整数x,表达式为: v = Math.pow((Math。Pow (x, v) - x), v); 将切换该值。

我知道这是一个丑陋的解决方案,而且OP并没有想要这个…但我在厕所的时候想到了另一个解决方案:P

如果你保证你的输入是1或0,那么你可以使用:

v = 2+~v;

如果它必须是整数1或0,那么你这样做是好的,尽管括号是不需要的。如果这些a被用作布尔值,那么你可以这样做:

v = !v;

我会说得更清楚一点。

v是什么意思?

例如v是某种状态。创建对象Status。在DDD中是一个值对象。

在这个值对象中实现逻辑。这样你就可以以更实用的方式编写代码,从而更易于阅读。切换状态可以在当前状态的基础上创建一个新的status。然后,你的if语句/逻辑被封装在你的对象中,你可以单元测试。valueObject总是不可变的,所以它没有标识。为了改变它的值,你必须创建一个新的。

例子:

public class Status
{
    private readonly int _actualValue;
    public Status(int value)
    {
        _actualValue = value;
    }
    public Status(Status status)
    {
        _actualValue = status._actualValue == 0 ? 1 : 0; 
    }

    //some equals method to compare two Status objects
}

var status = new Status(0);

Status = new Status(status);

我不知道你为什么要建立你自己的布尔值?我喜欢时髦的语法,但为什么不编写易懂的代码呢?

这不是最短/最快的,但最清楚的(每个人都能读懂)是使用众所周知的if/else状态:

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

如果你想更清楚,你应该使用布尔值而不是数字。在大多数情况下,它们足够快。对于布尔值,你可以使用这样的语法,它将在简短中获胜:

v = !v;