无需操作员订单即可计算

时间:2014-01-11 14:06:22

标签: c# .net math operators

C#中是否有某些函数可以让我计算忽略运算符的顺序?我的意思是2 + 6 / 2结果为4而不是5

4 个答案:

答案 0 :(得分:3)

即使您尝试重载这些运算符,也不会改变优先级。许多编程语言(包括C#)使用的优先级符合数学中常用的顺序,

作为大卫mentioned,这不仅仅是关于C#。它也是Mathematics。我不认为在C#中这是可能的,除了编写自己的数学运算符(这对我来说听起来极其困难和复杂)。

来自7.2.2 Operator overloading

  

用户定义的运算符实现始终优先于   预定义的运算符实现:仅在不适用时   预定义的用户定义的运算符实现将存在   算术运算实现。

     

用户定义的运算符声明无法修改语法,   优先级,或运营商的关联性。例如,/   运算符始终是二元运算符,始终具有优先级   在Section 7.2.1中指定,并且始终是左关联的。

答案 1 :(得分:0)

由于C#内置了值整数类型,因此无法修改其行为。你为什么要这么做?您可以使用括号来确定优先级,例如: (2 + 6)/ 2

答案 2 :(得分:0)

鉴于您无法覆盖c#运算符的优先行为,我将创建自己的表达式计算器。

根据您的问题,我相信您的表达始终为number operator number并输出number

因此,您可以选择上一个number并使用以下operator number进行处理,依此类推......

我想到了两种不同的方法:

  1. 将字符串作为输入并解析它
  2. System.Linq.Expressions.Expression获取并从此处解析
  3. c#有几种可扩展的数学表达式计算器。只是谷歌的问题,看看它是否适合您的需求。
  4. 尽管如此,我很想听听你为什么需要这样的行为。这是学术上的吗?

答案 3 :(得分:0)

运算符重载不允许您更改运算符优先级。为了达到你想要的效果,你需要为数学表达式实现自己的解析器。仅支持数字0-9和4运算符(+, - ,*,/)并不太难,但如果您以前从未编写过解析器,则会很费时间。有很多关于在互联网上编写编译器的教程;他们会教你如何编写一个简单的标记化器,然后教你如何解释标记流。在您的情况下,您只需要处理数字和运算符,这使得这项工作比实现整个语言容易得多。

编辑:实际上,编写一个忽略运算符优先级的解析器实际上比实现BODMAS容易得多。