c# - 一条语句中的索引、赋值和增量在 C++ 和 C# 中的行为不同。为什么?

标签 c# c++ operators indexing prefix-operator

为什么这个代码示例在 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++/CLI 会输出什么?

最佳答案

正如其他人所指出的,此代码的行为在 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

关于c# - 一条语句中的索引、赋值和增量在 C++ 和 C# 中的行为不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606407/

相关文章:

C# 正则表达式来验证日期?

c# - 无法创建用户

c# - 在 C# 中将字符串散列为颜色

c++ - 关于在 Linux 中使用管道和守护进程编写聊天室 C 程序有什么建议吗?

c# - 以编程方式指定运算符

Haskell 点运算符 : what difference does it make exactly?

c# - 在没有管道功能的情况下,在格式字符串漏洞中输入地址的技巧是什么?

android - cv::cvtColor 没有分配内存问题

c++ - 为什么链表中的节点不能负责删除自己? (C++)

c - C 中的运算符优先级 - 返回值