c - 阻止分配给数组的理由是什么?

标签 c arrays variable-assignment

我尝试用谷歌搜索并阅读:

但它们都表明了一个显而易见的事实:您不能为数组赋值,因为标准是这样规定的。这很好,但我想知道为什么标准不包括对分配给数组的支持。标准委员会详细讨论了事情,如果他们从未讨论过使数组可分配,我会感到惊讶。假设他们已经讨论过了,他们一定有一些理由不让数组分配给。

我的意思是,我们可以把一个数组放在一个结构中,然后赋值给这个结构就好了:

struct wrapper
{
    int array[2];
};

struct wrapper a = {{1, 2}};
struct wrapper b = {{3, 4}};
a = b; // legal

但是直接使用数组是被禁止的,即使它有效地完成了同样的事情:

int a[2] = {1, 2};
int b[2] = {3, 4};
a = b; // Not legal

标准委员会禁止赋值给数组的理由是什么?

最佳答案

在 C 中,赋值将一个固定大小对象的内容复制到另一个固定大小对象。对于标量类型(整数、 float 、指针、自 C99 以来的复杂类型),这是定义明确且实现起来相当简单的。结构的赋值几乎一样简单;较大的可能需要调用 memcpy() 或等效方法,但它仍然很简单,因为大小和对齐方式在编译时已知。

数组是另一回事。大多数数组对象的大小直到运行时才确定。一个很好的例子是 argv。运行时环境为每个命令行参数构造一个 char 数组,以及一个包含指向参数的指针的 char* 数组。这些通过 argvchar** 和动态分配的 char[] 可用于 main argv 的元素指向的数组。

C 数组本身就是对象,但它们通常不作为对象访问。相反,它们的元素是通过指针访问的,代码使用指针算法从一个元素遍历到下一个元素。

语言可以设计为将数组视为一流的对象,并进行赋值——但这很复杂。作为语言设计者,你必须判断一个包含 10 个整数的数组和一个包含 20 个整数的数组是否是同一类型。如果是,您必须决定当您尝试将一个分配给另一个时会发生什么。它复制较小的尺寸吗?它会导致运行时异常吗?您是否必须添加 slice 操作才能对数组的子集进行操作?

如果 int[10]int[20] 是没有隐式转换的不同类型,则数组操作不灵活(例如,参见 Pascal)。

所有这些东西都可以定义(参见 Ada),但只能通过定义比 C 中的典型结构更高级的构造。相反,C 的设计者(主要是 Dennis Ritchie)选择为数组提供低级操作。诚然,它有时会带来不便,但它是一个可用于实现任何其他语言的所有高级数组操作的框架。

关于c - 阻止分配给数组的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881442/

相关文章:

javascript - JS - 创建智能自动完成

c - MKL CBlas 错误

c - 免费 - SP16 缓冲器

php - array_key_exists 二维数组 php

c - C中n数组的交集和并集

java - 为什么不能将两个字节加一个整数并可以将两个最后字节加一个字节?

c# - 为十进制值分配字符串值

Javascript - [为什么?] 将变量分配给对象

C - 使用 char 和 int 创建数据包

c++ - 将 GNU 汇编程序编译到 Windows