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)的结构
。是的,运算符优先级规则有很好的文档记录和一致性,但您不应该让读者停下来仔细思考您的代码在做什么。清晰是避免错误的好方法,也可以让维护程序员的生活更轻松