猿问

乘法赋值运算符不尊重数学优先级

例如:


//Does NOT honor the rules of Math precedence

Int32 value=10;

value*=15 + 12;  //value=170



//Does honor the rules of Math precedence, and does the multiplication on the second line BEFORE the addition

Int32 value=10;

value=value * 15 + 12; //value=162

我希望第一个能正常工作,编译器会先完成*,但它没有。这是意料之中的,因为 * 在赋值运算符的左侧。有什么方法可以创建另一个像 ++ 和 – 运算符一样运行的运算符,有点像这样......


public Int32 =*(Int32 lhs , Int32 rhs)

{

     //Using the above values 

     lhs=lhs*rhs

}

操作和 =* 将在右侧有 *,因此清楚地指示到达赋值运算符之前的 *。我只是不确定如何在评估 rhs 变量之前将其分解。


任何想法都会有所帮助。


慕斯709654
浏览 152回答 2
2回答

largeQ

如果您希望更改运算符的优先级,则您的代码没有意义*=。如果我从这个开始(忽略它不是有效的 C# 的事实):Public Int32 =*(Int32 lhs , Int32 rhs){     //Using the above values      Return (10*15) + 12;}...然后有这个代码:Int32 value = 10;value =* 15 + 12;...调用=*将设置lhs为10,但它必须设置rhs为的结果15 + 12。这将与内置*=运算符的行为相同。

慕盖茨4494581

根据 OP 在问题评论部分的进一步评论,可能创建运算符是为了更容易编写聚合操作 : sum = sum + value,因此不遵循正常的数学规则,它可能比你提出的更有用.C# 你不能创建新的运算符。现有的运算符是内置在语言中的,因此至少要添加任何新的运算符,您还需要在编译器中实现一些部分来解析它们。C# 确实允许运算符重载,但它会导致定义您自己的整数,我认为这不是一条幸福的道路。除了 C# 之外,还有其他语言确实允许这样做(特别是运算符只是普通方法的函数式语言)。来自C# 语言规范某些运算符可以重载。运算符重载允许为其中一个或两个操作数属于用户定义的类或结构类型的操作指定用户定义的运算符实现(运算符重载)。
随时随地看视频慕课网APP
我要回答