2
struct a{
int a;
char b;
} c,d={1,2},e;

c=d //allowed
c=d+e  //not allowed

赋值有效,因为编译器生成汇编代码来移动字节。所以其他运营商也可以做同样的事情。那么为什么C没有这个功能呢?

<============>

正如所问的,一些功能可以...... 1.在添加大量(超过长的)时,我们不必使用循环来长长地添加它。

c=a+b

将工作。

  1. 移动数组。

  2. 乘法。

所以我们不必编写额外的代码,因为这些东西编译器可以生成汇编代码。

4

3 回答 3

11

因为在 C 中没有办法告诉编译器预期的结果是什么。例如,您将如何添加 2 个这样的对象:

struct ss {
    char *str;
};
于 2012-08-13T15:39:48.637 回答
3

因为你不能在结构上定义算术运算。它们不是数字,也不是字符串,也不是浮点数,也不是任何可计算的。如果您的结构是一些个人数据的列表,例如:

struct person {
  int age;
  char name[200];
  int zipcode;
  int sex;
  whatever_t whatever;
} Mary, Ivan;

那你怎么定义 Mary + Ivan 呢?

编辑:

如果要添加下面的位,可以创建一个 char 数组,然后在其中创建 memcpy

int size = sizeof (struct person); 
char arr[size];
memcpy(arr, &person, size);

然后将位与您以相同方式转换的另一个结构添加到内部。

于 2012-08-13T15:51:19.523 回答
1

我们可以。我们应该使用另一种技术。

作为 cnicutar 可悲的是,为什么我们不能告诉 C 编译器如何将 uperator+用于结构。基线是 complie 不知道这样的操作会产生什么结果。存在支持运算符重载(C++/C#)的语言,但对于这种情况,我们必须使用一些设计方法,因为 C 不是其中之一,因此我们必须为该操作创建方法。

所以c = d + e我们可以写而不是MyStructMath_add(d,e).

并自行实现您对此类操作所期望的逻辑。

于 2012-08-13T15:53:06.057 回答