程序输出的差异

Difference in output of program

本文关键字:输出 程序      更新时间:2023-10-16

我有一个简单的代码片段,在使用 c++ 编译器和 c# 编译器构建时显示不同的行为。

c#

static void Main(string[] args)
{
   int i = 0;
   i += i++;
   Console.WriteLine(i);
   Console.ReadLine();
}

i的结果为0。从这个链接复制的。对于i = 0,为什么(i += i++)等于0?

c++

int main() 
{
    int i = 0;
    i += i++;
    cout << i << endl;
}

i的结果为1

我只是想知道为什么 c# c++ 的代码输出有差异。

c#、c++和C的设计者对如何处理求值顺序做出了不同的决定,而在c#中,求值顺序是从左到右:

表达式中的

操作数从左到右求值。

和副作用也从左到右依次发生。

在c++中不是这样,c++标准草案1.9 程序执行段落15说:

除特别说明外,单个操作符的操作数和单个表达式的子表达式的求值都是无序的。

,如果对同一标量对象的副作用相对于另一个副作用排序,则结果为未定义行为:

[…如果一个标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值进行的值计算是无序的,则该行为是未定义的。[…])

和草稿给出了未定义行为的例子:

i = i++ + 1; // the behavior is undefined

如果我们看一下你代码中的表达式:

i += i++;

相当于:

i = i + i++ ;

我们现在可以清楚地看到它调用了未定义的行为,这意味着结果是不可预测的,不能依赖

在C语言中,像i= i++;这样的表达式具有未定义的行为,可以求值为0或1(在整个表达式求值之后或在赋值之前都可以递增)。

这是一个奇怪的设计决定,因为看似无辜和完全合理的代码可能会产生意想不到的结果,比如sum= a[i++] + a[i++];。奇怪的是,似乎没有人在意。