为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕斯709654 2022-06-12 16:24:30
例如://Does NOT honor the rules of Math precedenceInt32 value=10;value*=15 + 12;  //value=170//Does honor the rules of Math precedence, and does the multiplication on the second line BEFORE the additionInt32 value=10;value=value * 15 + 12; //value=162我希望第一个能正常工作,编译器会先完成*,但它没有。这是意料之中的,因为 * 在赋值运算符的左侧。有什么方法可以创建另一个像 ++ 和 – 运算符一样运行的运算符,有点像这样......public Int32 =*(Int32 lhs , Int32 rhs){     //Using the above values      lhs=lhs*rhs}操作和 =* 将在右侧有 *,因此清楚地指示到达赋值运算符之前的 *。我只是不确定如何在评估 rhs 变量之前将其分解。任何想法都会有所帮助。
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

如果您希望更改运算符的优先级,则您的代码没有意义*=。


如果我从这个开始(忽略它不是有效的 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。


这将与内置*=运算符的行为相同。


查看完整回答
反对 回复 2022-06-12
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

根据 OP 在问题评论部分的进一步评论,可能创建运算符是为了更容易编写聚合操作 : sum = sum + value,因此不遵循正常的数学规则,它可能比你提出的更有用.

C# 你不能创建新的运算符。现有的运算符是内置在语言中的,因此至少要添加任何新的运算符,您还需要在编译器中实现一些部分来解析它们。

C# 确实允许运算符重载,但它会导致定义您自己的整数,我认为这不是一条幸福的道路。

除了 C# 之外,还有其他语言确实允许这样做(特别是运算符只是普通方法的函数式语言)。

来自C# 语言规范

某些运算符可以重载。运算符重载允许为其中一个或两个操作数属于用户定义的类或结构类型的操作指定用户定义的运算符实现(运算符重载)。


查看完整回答
反对 回复 2022-06-12
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信