Что происходит Под капотом в C # Компиляции? - PullRequest
0 голосов
/ 19 декабря 2018

Простая и очень интересная проблема:

Из приведенного ниже кода мне было интересно, что в обоих условиях переменная Check будет true, но я ошибался.

using System;
namespace Problem
{
    class Program
    {
        static void Main(string[] args)
        {
            int firstNumber = 1;
            int secondNumber = 9;

            bool Check = false;

            Console.WriteLine("Checking First Condition.");
            Console.WriteLine("------------------");
            if (firstNumber == (firstNumber = secondNumber))
            {
                Check = true;
                Console.WriteLine("First Check : {0}", Check);
            }
            else
            {
                Check = false;
                Console.WriteLine("First Check : {0}", Check);
            }

             Console.WriteLine("------------------");
             Console.WriteLine();
             Console.WriteLine("Checking Second Condition.");
             Console.WriteLine("------------------");

            // Resetting firstNumber value:
            firstNumber = 1;

            if ((firstNumber = secondNumber) == firstNumber)
            {
                Check = true;
                Console.WriteLine("Second Check : {0}", Check);
            }
            else
            {
                Check = false;
                Console.WriteLine("Second Check : {0}", Check);
            }
            Console.WriteLine("------------------");
        }
    }
}

Но с давних пор и думал об этом.но я не могу понять, почему первое условие возвращает True

Пробные прогоны:

Первое условие.(1 == (1 = 9) // firstnumber = 9. so 9 == 9 // True.

Второе условие.((1 = 9) == 1) // firstnumber = 9. so 9 == 9 // True.

Вывод:

enter image description here

Может кто-нибудь кратко объяснить, что происходит под капотом?

// Что делает компилятор C # в обоих случаях?.

1 Ответ

0 голосов
/ 19 декабря 2018

условия / выражения оцениваются слева направо.Итак,

 int firstNumber = 1;
 int secondNumber = 3;

Первый случай:

firstNumber == (firstNumber = secondNumber)
     1      == (firstNumber = secondNumber)
     1      == (     1      = secondNumber)
     1      == (     1      =      3      )
     1      ==   3
          false

Второй случай:

((firstNumber = secondNumber) == firstNumber)

 (     1      = secondNumber) == firstNumber
 (     1      =      3      ) == firstNumber   
 (            3             ) == firstNumber   //firstNumber became 3
              3               ==     3 
                             true
...