可能重复:
为什么会进入无限循环?
类似于i = i++
C和C++中的未定义行为,因为标量对象的值在同一表达式中更改两次而没有插入序列点.
但是我认为这些表达式在C#或Java中具有明确定义的行为,因为AFAIK对参数的评估从左到右,并且全部都有序列点.
那就是说,我希望i = i++
相当于i++
.但事实并非如此.以下程序输出0
.
using System;
class Program
{
static void Main(string[] args)
{
int i = 0;
i = i++;
Console.WriteLine(i);
}
}
Run Code Online (Sandbox Code Playgroud)
你能帮我理解为什么吗?
免责声明: 我完全清楚,无论是否定义了上述结构的行为,它们都是愚蠢,无用,不可读,不必要的,不应在代码中使用.我只是好奇.
Cod*_*aos 42
行为在C#中定义良好,评估顺序为:
i
被评估为变量i
i
递增(现在i==1
)i
为0.(现在i==0
)最终的结果是i==0
.
通常,您首先创建一个表达式树.要评估它,首先评估左侧,然后评估右侧,最后评估根部的操作.递归地做.
Mar*_*ell 19
后增量表达式的结果i++
是原始值i
.所以之后i++
进行了评估(递增i
),您指定的旧值i
来...... i
.
只是用
i++;
Run Code Online (Sandbox Code Playgroud)
;)
小智 17
i = ++i
是你在想这里做的事情的代码.i++
实际上表现得有点不同.
随着i++
,值i
增加,但值i++
不是新值i
,它是先前的值.所以当你这样做时i = i++
,你会说"增加值i
,然后设置i
为旧值".
好吧,必须在赋值之前评估右侧的表达式。现在,i++
将计算为 的当前值i
,而 i 的值随后将增加 1。但是,分配尚未执行,当它执行时,它将i
使用 rhs 表达式计算的任何值覆盖(1)的当前值,在您的情况下为 0。
主要区别在于++i
(pre-increment, 评估为递增后的新值) 和, or post-increment, 评估为递增前的当前值。i
i++
i
如果您++i
改为使用,则右侧表达式的计算结果将为 1,从而导致 i == 1。
归档时间: |
|
查看次数: |
12556 次 |
最近记录: |