程序输出的差异
Difference in output of program
我有一个简单的代码片段,在使用 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?
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++];
。奇怪的是,似乎没有人在意。
相关文章:
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 显示错误输出的简单数组排序程序
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 如何从Windows应用程序输出到标准?
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 如何使用C++读取另一个程序中的源代码输出
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 为什么这个程序的输出不如预期
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ 每次运行程序时我都会"nan"输出的问题
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 而循环:简单的除法程序输出零,不明白为什么
- 如何在 html 页面中插入 cgi 应用程序的输出?
- C 中的输出程序无明显的原因是白色的
- C++:更改简单输出程序的字体
- C++ 简单的输入/输出程序 + 枚举器
- C++字母等效数字代码输出程序
- 编译输出程序集