【发布时间】:2020-05-29 13:01:36
【问题描述】:
我对一件简单的事情感到困惑。在我看来,第 4 行的结果必须与第 6 行的结果相同。有人能解释一下优化器在第 5 行做了什么吗?
我希望b 在每一行上递减和递增。因此,b 的值必须在解释行的开头为 2。所以第 4 行和第 6 行的结果应该是一样的。
1. int a = 1;
2. int b = 2;
3.
4. Console.WriteLine(a == --b && a == b++); // expected: true, real: true
5. Console.WriteLine(a == --b || a == b++); // expected: true, real: true
6. Console.WriteLine(a == --b && a == b++); // expected: true, real: false
【问题讨论】:
-
请解释为什么你认为4和6的输出应该是一样的。 (提示,
b在这两个语句的开头没有相同的值,这与您的意图相反) -
b 在每一行上递减和递增。所以 b 的起始值必须在解释行的开头为 2。所以第 4 行和第 6 行的结果必须相同。
-
我知道这可能只是理解c#的一个学术例子。但是你看到了结果。很难阅读。切勿在实际代码中将增量与布尔表达式混合。
-
实际上,虽然我同意不将递增或递减运算符混入其他表达式,但这里的问题实际上是与短路布尔运算符结合使用的表达式中的副作用。
-
作为一个小补充,您可以使用
if (a == --b | a == b++)|运算符永远不会短路并始终评估双方,从而产生您想要的行为