一个语句中的索引,赋值和增量在C和C#中的行为不同.为什么?

为什么此代码示例在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

上一篇:python – 赋值运算符左/右侧的不同切片行为


下一篇:Java优先级 – 转换和按位运算符