在C#中使用多个运算符的奇数结果

时间:2011-03-09 16:20:57

标签: c#

我正在使用Visual Studio 2010,今天我遇到了一个奇怪的错误。看看这段代码:

using System;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 5;
            int y = 10;
            int z = y - -x;
            Console.WriteLine(z);
        }
    }
}

代码编译正常(没有错误,没有警告)并显示15!我认为这种行为有点奇怪。我不知道它是否应该是这样的。但是,您可以编写如此愚蠢的代码:

int z = y - - - + + + + - - - - - - - - x;

N.B。运营商之间的空间很重要。 z为5,因为加号没有任何影响,减号的数量是奇数。

有任何理由支持此操作符行为吗?这是故意还是一种错误?有任何标志可以设置以获得至少一个警告吗?

干杯

5 个答案:

答案 0 :(得分:7)

我根本看不出它有什么问题。它从10减去-5 - 即它使用一元运算符将5转为-5,然后使用二元运算符执行减法。我想不出任何类似的语言(C,Java等)这个不会有效。

我不认为这是一个错误,我非常怀疑有任何选择可以使这个警告。

我需要对这里的术语略微小心,但我认为运算符的绑定由它们的优先级控制,符合C#规范的7.3.1节。您可以将一元运算符视为“绑定更紧密”而不是二元运算符。

答案 1 :(得分:3)

这不是一个错误。 10 - -5 确实是 15。减去-5与添加5相同。

你可以在你想要的任意次数上否定一个数字,你最终会得到这个数字。任何奇数的否定都会给你否定。换句话说:

5 == -(-(-(-5)))

答案 2 :(得分:1)

这句话完全合情合理。

你有双重否定。 - 相当于+所以你真的在写:

int z = y + x; // Obviously 15

......基本的数学概念。

答案 3 :(得分:1)

你只是使用一元加/减的多个实例。奇怪,但不一定错。我怀疑检测和防止这种类型使用的成本相对于某人在实际代码中实际执行它的几率而言太高了。此外,它只是难以阅读,而不是技术错误。

答案 4 :(得分:0)

这就是我被教导做数学的方式。如果你从10中删除-5,那么你还期望从15中除去-5。

如果您对数学有一个哲学观点,那么您可能需要在http://math.stackexchange.com

询问它