C# интерпретация оператора if - PullRequest
1 голос
/ 29 мая 2020

Меня запутала простая вещь. На мой взгляд, результат в строке 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 ]

4 голосов
/ 29 мая 2020

В строке 4, b уменьшается и увеличивается, оставляя 2.

В строке 5, b уменьшается, тогда, поскольку a == --b равно true, выражение замыкается и b не увеличивается, остается 1.

В строке 6 a == --b теперь false.

1 голос
/ 29 мая 2020

Когда вызывается строка 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 (||) истинна, вторая часть не будет выполняться.

a == --b && a == b++ = false

a не равно 0 (1 - 1)

1 голос
/ 29 мая 2020

|| оператор применяет оценку короткого замыкания .
Итак, для || оператор, если первый член выражения истинен, нет необходимости оценивать (выполнять) второй член.

Влияние этого logi c на ваш код состоит в том, что вторая часть выражения в строке 5 не выполняется, и переменная b остается на 1 после декремента.
Это приводит к строке 6 дает ложный результат

0 голосов
/ 29 мая 2020
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); 
...