C# Post 增量
C# Post Increment
当我在一个简单的控制台应用程序中测试 post 增量运算符时,我意识到我不理解完整的概念。我觉得很奇怪:
int i = 0;
bool b = i++ == i;
Console.WriteLine(b);
输出是错误的。我已经预料到这是真的。 AFAIK,在第 2 行,由于 post 递增,编译器进行比较并在 i 递增 1 后将 b 分配给 true。但显然我错了。
之后我这样修改代码:
int i = 0;
bool b = i == i++;
Console.WriteLine(b);
这次输出一直为真。与第一个样本相比有何变化?
假设 i
最初的值为 0
,就像您的示例中那样。
i++ == i
读取i
(0
),递增i
,再次读取i
(1
),然后比较两者值:0 == 1
.
i == i++
读取i
(0
),再次读取i
(0
),递增i
,然后比较两者值:0 == 0
.
读取旧值后立即增加。
回答您的第一段代码:
在这里,bool b = i++ == i;
是0 == 1
,这是因为如你所知,i++
是一个post增量,所以i
仍然是0
在 i++
但在该部分完成执行并将其与右侧 i
进行比较之后,此时由于先前的 post 增量,该值已更改为 1 .这就是为什么您在执行以下操作时得到 False
的原因:bool b = i++ == i;
.
如@hvd 所说:读取旧值后立即发生增量。
后缀和相等运算符的计算顺序是从左到右,因此代码的行为如代码注释中所述。
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
当我在一个简单的控制台应用程序中测试 post 增量运算符时,我意识到我不理解完整的概念。我觉得很奇怪:
int i = 0;
bool b = i++ == i;
Console.WriteLine(b);
输出是错误的。我已经预料到这是真的。 AFAIK,在第 2 行,由于 post 递增,编译器进行比较并在 i 递增 1 后将 b 分配给 true。但显然我错了。 之后我这样修改代码:
int i = 0;
bool b = i == i++;
Console.WriteLine(b);
这次输出一直为真。与第一个样本相比有何变化?
假设 i
最初的值为 0
,就像您的示例中那样。
i++ == i
读取i
(0
),递增i
,再次读取i
(1
),然后比较两者值:0 == 1
.
i == i++
读取i
(0
),再次读取i
(0
),递增i
,然后比较两者值:0 == 0
.
读取旧值后立即增加。
回答您的第一段代码:
在这里,bool b = i++ == i;
是0 == 1
,这是因为如你所知,i++
是一个post增量,所以i
仍然是0
在 i++
但在该部分完成执行并将其与右侧 i
进行比较之后,此时由于先前的 post 增量,该值已更改为 1 .这就是为什么您在执行以下操作时得到 False
的原因:bool b = i++ == i;
.
如@hvd 所说:读取旧值后立即发生增量。
后缀和相等运算符的计算顺序是从左到右,因此代码的行为如代码注释中所述。
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