为什么不存在数组赋值操作但是C语言中的结构赋值呢?

int a[10];
int b[10];

a = b; // illegal

typedef struct {
    int real;
    int imag;
    } complex;

complex c,d;
c = d; //legal

[我意识到a和b是第一种情况下的地址,但是第二种情况下的符号]

解决方法

对于历史信息,这可能很有趣: http://cm.bell-labs.com/who/dmr/chist.html

在B中,声明一个数组会为数组留出内存,就像C一样,但是为变量提供的名称用于定义指向数组的指针. Ritchie在C中改变了这个,所以名字“是”数组,但在使用时可以衰减为指针:

The rule,which survives in today’s C,is that values of array type
are converted,when they appear in expressions,into pointers to the
first of the objects making up the array.

This invention enabled most existing B code to continue to work,
despite the underlying shift in the language’s semantics. The few
programs that assigned new values to an array name to adjust its
origin—possible in B and BCPL,meaningless in C—were easily repaired.

如果在那个早期阶段,Ritchie已经定义了a = b来复制数组,那么他试图从B端口移植到C的代码就不那么容易修复了.正如他所定义的那样,该代码会产生错误,他可以修复它.如果他让C复制数组,那么他就会地改变代码的含义来复制数组,而不是重新设置用于访问数组的名称.

还有一个问题,“为什么自40年以来没有添加这个功能”,但我认为这就是为什么它不是从那里开始的.这本来是努力实现的,并且这种努力实际上会使C的早期版本更糟糕,因为稍微更难将B和BCPL代码移植到C.所以当然Ritchie没有这样做.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...