Iva*_*nov 5 c# c++ indexing operators prefix-operator
为什么这个代码示例在c ++和C#中表现不同.
[C++示例]
int arr[2];
int index = 0;
arr[index] = ++index;
Run Code Online (Sandbox Code Playgroud)
结果将是arr [1] = 1 ;
[C#示例]
int[] arr = new int[2];
int index = 0;
arr[index] = ++index;
Run Code Online (Sandbox Code Playgroud)
结果将是arr [0] = 1 ;
我觉得这很奇怪.当然,两种语言必须有不同的理由来实现它吗?我想知道C++/CLI会输出什么?
Eri*_*ert 11
正如其他人所指出的那样,这个代码的行为在C/C++中是未定义的.你可以得到任何结果.
C#代码的行为由C#标准严格定义.
当然,两种语言必须有不同的理由来实现它吗?
好吧,假设您正在设计C#,并希望使C++程序员能够轻松学习该语言.您是否会选择复制C++解决此问题的方法,即保持未定义?你是否真的想让完全聪明的开发人员轻易地编写代码,编译器可以根据需要编写任何意义?
C#的设计者不相信简单表达式的未定义行为是一件好事,因此我们严格定义了这样的表达式.我们不可能同意每个C++编译器的功能,因为不同的C++编译器会为这类代码提供不同的结果,因此我们不能同意所有这些代码.
至于为什么C++的设计者认为最好让这样的简单表达式具有未定义的行为,那么你将不得不问其中一个.我当然可以做一些推测,但那些只是受过教育的猜测.
我写了很多关于这类问题的博客文章; 我最近的一个几乎就是你在这里提到的代码.您可能想要阅读的一些文章:
C#的设计如何鼓励消除细微的错误:
http://blogs.msdn.com/ericlippert/archive/2007/08/14/c-and-the-pit-of-despair.aspx
究竟什么是优先级,关联性和C#中的执行顺序之间的关系?
http://blogs.msdn.com/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx
索引,分配和增量的副作用会以什么顺序发生?
http://blogs.msdn.com/ericlippert/archive/2009/08/10/precedence-vs-order-redux.aspx