&&=和||=operator可能重复:为什么Java没有条件和条件运算符的复合赋值版本?(&&=,||=)为什么“&&=”运算符不存在?今天上班写了如下LOC(b和b1的真实身份保密:)b&&=b1;//意思是b=b&&b1;我盯着它看了几秒钟,发现没有这个运算符。可以肯定的是,我点击了编译但失败了。可以肯定的是,我已经查阅了标准。没有这样的运营商有什么具体原因吗?我能想到几个:b&&=b1和b=b&&b1由于&&的短路评估可能不等价。&&=丑陋的很少需要&&=我不认为有这样一个运算符很有用,不。我也不是说上述三个原因中的任何一个或所有都不足以避免创建此运算符。我的问题如下:是否有更严重的理由让我监督?我不知道为什么这个问题和一些答案都提到相应逻辑运算符的短路行为是一个潜在问题。定义&&=和||=运算符绝对没有与短路相关的问题。它们应该与+=和其他类似的运算符统一定义,这意味着a&&=b应该等于a=a&&b,但在&&=版本中只计算一次。这意味着如果a最初为零,则根本不会评估b。简单的。所以它们在语言中不存在的唯一原因是“仅仅因为”。我以前也想要它们。我怀疑丑陋本身是决定性因素,而短路行为是迄今为止我听到的反对他们的最好理由。另一个促成因素是C被设计为接近金属运行,几乎所有运算符都直接对应于主体系结构中的指令。我认为x86、PPC等不直接实现b&&=b1;的最大原因。指令b&&=b1;operatordoesn'texist是K&R没有想到任何有吸引力的方式来定义它。我有时也想要一个->=运算符(ptr->=next等同于ptr=ptr->whatever)。我认为使用&&=的一个问题是以下哪一项最有用,或者应该是什么并不明显:if(lhs&&rhs)lhs=1;否则lhs=0;如果(!rhs)lhs=0;否则lhs=!(!lhs));如果(lhs&&!rhs)lhs=0;如果(!rhs)lhs=0;第一个变体是最合乎语法的建议,但从实际的角度来看,如果两个项都不为零,那么保留左侧通常比将其设置为“1”更有用。顺便说一句,我经常希望逗号运算符的变体会评估左侧,保存值,然后评估右侧,并返回左侧的值。等价于:intfoo(intp1,intp2)返回p1;except适用于任何类型(p2不必与p1属于同一类型,并且可能无效),并且具有保证的从左到右的评估顺序。对于非单位步骤中的后增量索引之类的事情会很方便,例如arr[ptr~,ptr+=2];或者对于某些类型的数据交换操作,例如var1=(var2~,var2=var1);etc.由于a&&b的结果总是0或1,我认为C99_Bool类型的解释只是明确的。由于创建C时它不存在,因此未包含该运算符。现在没有人会轻易地向C添加另一个运算符,因为这会对所有现有的解析器产生影响。就个人而言,我会投票给你的#1理由。布尔运算符具有短路语义,如果转换为对齐运算符,可能会导致一些非常粗糙的情况。要么你不再将它们短路,要么你创建一些奇怪的“可选”赋值运算符(它只做左边的事情,并且只在LHS上的值已经非零时才分配结果)。无论哪种方式,您都会遇到细微的错误,因为人们会期待其他行为。编辑:错误的语言,但仍然适用我同意你的三个原因,尽管有一种情况我在编写自定义反序列化例程时感叹缺少此运算符。在某些情况下,错误序列化的对象并不是真正的“异常”(并且为了防止C#中非常常见的异常开销),我会使用布尔返回值来指示反序列化操作是否成功。这段代码完全是理论的,Nested1、Nested2、Nested3都是结构:以上就是C#学习教程的全部内容:&&=和||=运算符,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——publicstructComplexStruct{privateNested1nested1;私人嵌套2嵌套2;私有Nested3[]nested3;publicboolRead(Readerreader){boolret=true;intnested3Length=0;ret&&=嵌套1。阅读(读者);ret&&=nested2.Read(阅读器);ret&&=reader.ReadInt32(refnested3Length);for(inti=0;(ret&&i本文搜集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载,请注明出处:
