繁体   English   中英

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

[英]Odd result using multiple - operator in 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;

注意,操作员之间的空间很重要。 z为5,因为加号没有作用,减号的数量为奇数。

是否有任何理由支持这种操作员行为? 是故意的还是一种错误? 是否有设置任何标志以便至少获得警告?

干杯

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

我不认为这是一个错误,并且我非常怀疑是否有任何其他方法可以使此警告。

我需要对此处的术语稍加小心,但我相信运算符的绑定受C#规范第7.3.1节中其优先级的控制。 您可以将一元运算符视为比二元运算符“绑定更紧密”。

那不是错误。 10 - -5 的确是 15 -5等于加5

然后,您可以任意次数取反数,最后得到该数。 否定数的奇数都会使您得到否定。 换一种说法:

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

那句话完全有道理。

你有双重否定。 -等同于+,所以您实际上是在写:

int z = y + x; // Obviously 15

基本数学概念

您仅使用一元正负的多个实例。 奇怪,但不一定是错误的。 我怀疑检测和防止这种类型的使用的成本相对于有人实际在实际代码中实现的可能性而言过高。 另外,它只是很难阅读,从技术上来说并不是错误的。

那几乎就是我被教做数学的方式。 如果您从10中删除-5,那么您期望除15之外还能得到什么。

如果您对数学有一个哲学的认识,那么您可能需要在http://math.stackexchange.com上提问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM