我对一件简单的事情感到困惑。在我看来,第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
答案 0 :(得分:4)
在第4行中,b
递减并递增,剩下2。
在第5行中,b
递减,然后由于a == --b
为true
,因此表达式短路并且b
不递增,从而保留1。
第6行的a == --b
现在为false
。
答案 1 :(得分:1)
||运算符应用short-circuit evaluation。
因此,对于||运算符,如果表达式的第一项为true,则无需评估(执行)第二项。
此逻辑对您的代码的影响是,不执行第5行中表达式的第二部分,并且减量后变量b保持为1。
这导致第6行给出false作为结果
答案 2 :(得分:1)
调用4.和5.行时,它还会更改变量的值:
a为1,b为2
a == --b && a == b++ = true
a为1,b为2
a == --b && a == b++ = true
a为1,b为1,因为上述语句的第二部分未运行。如果or(||)运算符的第一部分为true,则不会执行第二部分。
a == --b && a == b++ = false
a不等于0(1-1)
答案 3 :(得分:0)
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
成为
1. int a = 1;
2. int b = 2;
3.
// now: a = 1, b = 2
// b is decremented to 1, expressions are evaluated. b is incremented to 2,
4. Console.WriteLine(1 == 1 && 1 == 1);
// now: a = 1, b = 2
// b is decremented to 1, first expression is evaluated to true,
// that causes the second expression to be short circuited. It doesnt
// matter whether it is true or false, the whole expression will be true anyway.
// So the second expression will not be executed.
5. Console.WriteLine(1 == 1);
// now: a = 1, b = 1
// b is decremented to 0, expressions are evaluated, b is incremented to 1
6. Console.WriteLine(1 == 0 && 1 == 0);