这个问题在这里已有答案:
6342
2017-12-25 10:57
起源
答案:
假设 i
有价值 0
最初,就像你的例子中一样。
i++ == i
读 i
(0
),增量 i
,读 i
再次(1
),并比较这两个值: 0 == 1
。
i == i++
读 i
(0
),读 i
再次(0
),增量 i
,并比较两个值: 0 == 0
。
增量发生了 立即 读完旧值后。
9
2017-12-25 11:05
回答你的第一段代码:
这里, bool b = i++ == i;
是 0 == 1
这是因为你知道 i++
是一个后增量所以 i
遗迹 0
在 i++
但是在那部分完成执行并且正在与右侧进行比较之后 i
此时,由于之前的后增量,该值已更改为1。这就是你得到的原因 False
做的时候: bool b = i++ == i;
。
像@hvd一样说: 读取旧值后立即发生增量。
1
2017-12-25 11:08
在第二种情况下 bool b = i == i++; 即0 == 0,这是真的,然后发生增量。比如首先比较值,然后我增加但是在第一种情况下,它发生在其他方面 bool b = i++ == i; 即0 == 1它首先读取0然后递增i然后比较它到那时i增加到1这就是他得到假的原因。 - Aamerallous
这是正确的。如果您理解第一部分背后的概念,第二段代码是可自我理解的。它在大多数编程语言中都是相同的。这是一个基本的基本概念。 - Inconnu
答案:
假设 i
有价值 0
最初,就像你的例子中一样。
i++ == i
读 i
(0
),增量 i
,读 i
再次(1
),并比较这两个值: 0 == 1
。
i == i++
读 i
(0
),读 i
再次(0
),增量 i
,并比较两个值: 0 == 0
。
增量发生了 立即 读完旧值后。
9
2017-12-25 11:05
回答你的第一段代码:
这里, bool b = i++ == i;
是 0 == 1
这是因为你知道 i++
是一个后增量所以 i
遗迹 0
在 i++
但是在那部分完成执行并且正在与右侧进行比较之后 i
此时,由于之前的后增量,该值已更改为1。这就是你得到的原因 False
做的时候: bool b = i++ == i;
。
像@hvd一样说: 读取旧值后立即发生增量。
1
2017-12-25 11:08
在第二种情况下 bool b = i == i++; 即0 == 0,这是真的,然后发生增量。比如首先比较值,然后我增加但是在第一种情况下,它发生在其他方面 bool b = i++ == i; 即0 == 1它首先读取0然后递增i然后比较它到那时i增加到1这就是他得到假的原因。 - Aamerallous
这是正确的。如果您理解第一部分背后的概念,第二段代码是可自我理解的。它在大多数编程语言中都是相同的。这是一个基本的基本概念。 - Inconnu
后缀和等式运算符的求值顺序是从左到右,因此代码的行为与代码注释中的说明相同。
int i = 0;
bool b = i++ == i;
// 1.) i++ returns old value i.e. 0
// 2.) but after that it increments and becomes 1
// 3.) hence, bool b = 0 == 1; --> evaluates to false
Console.WriteLine(b); // prints false
int i = 0;
bool b = i == i++;
// 1.) i returns old value i.e. 0
// 2.) i++ returns old value i.e. 0, as this is the end of the statement after that it would increment
// 3.) hence, bool b = 0 == 0; --> evaluates to true
Console.WriteLine(b); // prints true
1
2017-12-25 11:19