C#编译的幕后黑手是什么?

C#编译的幕后黑手是什么?,c#,console-application,C#,Console Application,简单而有趣的问题: firstNumber == (firstNumber = secondNumber) 1 == (firstNumber = secondNumber) 1 == ( 1 = secondNumber) 1 == ( 1 = 3 ) 1 == 3 false ((firstNumber = secondNumber

简单而有趣的问题:

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
从下面的代码中,我想知道在这两种情况下,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

干运行:

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
第一个条件。
(1==(1=9)//firstnumber=9。因此9==9//True。

第二个条件。
((1=9)==1)//firstnumber=9。因此9==9//True。

输出:

有人能解释一下引擎盖下发生了什么吗


//在这两种情况下,C#编译器都做了什么?

条件/表达式从左到右求值

 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
第二种情况:

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

条件/表达式从左到右求值。因此

 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
第二种情况:

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

在您进行任何测试之前,第一个数字将被更改:firstNumber=secondNumberTwo words:。我不确定为什么第一个条件会返回true,因为当我运行代码时,它会返回false:。请注意,赋值将返回指定的值。通常,您应该避免使用类似
if的构造((firstNumber=secondNumber)==firstNumber)
。是的,运算符优先级规则有很好的文档记录和一致性,但你不应该让读者停下来仔细思考你的代码在做什么。清晰是避免错误的好方法,也是让维护程序员的生活更轻松的好方法。在你做任何测试之前,第一个数字正在改变:firstNumber=secondNumberTwo words:。我不确定为什么第一个条件返回true,因为当我运行代码时,它返回false:。请注意,赋值将返回指定的值。一般来说,您应该避免使用类似于
if((firstNumber=secondNumber)==firstNumber)的结构
。是的,运算符优先级规则有很好的文档记录和一致性,但您不应该让读者停下来仔细思考您的代码在做什么。清晰是避免错误的好方法,也可以让维护程序员的生活更轻松