我有一个简单的代码片段,在使用 C ++ 编译器和 C#编译器构建时显示了不同的行为。
C#
static void Main(string[] args)
{
int i = 0;
i += i++;
Console.WriteLine(i);
Console.ReadLine();
}
i
的结果是0
。
复制此链接。 For i = 0, why is (i += i++) equal to 0?
C ++
int main()
{
int i = 0;
i += i++;
cout << i << endl;
}
i
的结果是1
。
我只是想知道为什么 C#和 C ++ 中的代码输出存在差异。
答案 0 :(得分:2)
C#和C ++和C made different decisions about how to handle order of evaluation的设计者,而C# the order of evaluation中的设计者从左到右:
表达式中的操作数从左到右进行计算。
并且副作用也从左到右发生。
在C ++中并非如此,draft C++ standard部分1.9
程序执行段 15 表示:
除非另有说明,否则对单个操作符的操作数和单个表达式的子表达式的评估是不合理的。
如果对相同标量对象的副作用相对于另一侧的顺序进行排序,则结果为undefined behavior:
[...]如果标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值计算的值没有排序,则行为未定义。[.. 。]
并且草案给出了未定义行为的示例:
i = i++ + 1; // the behavior is undefined
如果我们从你的代码中查看表达式:
i += i++;
相当于:
i = i + i++ ;
我们现在可以清楚地看到它调用未定义的行为,这意味着结果是不可预测的,不能依赖。
答案 1 :(得分:0)
在C中,类似i= i++;
的表达式具有未定义的行为,并且可以计算为0或1(在评估整个表达式之后或在赋值之前递增)。
这是一个奇怪的设计决定,因为显然无辜且完全合理的代码会产生意想不到的结果,例如sum= a[i++] + a[i++];
。奇怪的是,似乎没有人感到困扰。