为什么此代码示例在c和C#中的行为不同.
[C示例]
int arr[2];
int index = 0;
arr[index] = ++index;
其结果将是arr [1] = 1;
[C#示例]
int[] arr = new int[2];
int index = 0;
arr[index] = ++index;
其结果将是arr [0] = 1;
我觉得这很奇怪.对于两种语言,一定要有一些不同的实施原理吗?我想知道C/C++LI输出什么?
解决方法:
正如其他人指出的那样,此代码的行为在C/C++中未定义.您可以得到任何结果.
C#代码的行为由C#标准严格定义.
Surely there must be some rationale for both languages to implement it differently?
好吧,假设您正在设计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