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

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

コンパイラがアセンブリコードを生成してバイトを移動するため、割り当てが機能します。他のオペレーターに対しても同じことができます。では、なぜ C にはこの機能がないのでしょうか??

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

尋ねられたように、いくつかの機能は次のようになります.. 1.大きな数(long以上)を追加する間、ループを使用してlongごとに追加する必要はありません。

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+の使用方法を教えられない理由です。ベースラインは、そのような操作からどのような結果が得られるべきかわからないということです。演算子のオーバーロードをサポートする言語 (C++/C#) は存在しますが、この場合、C はそれらの言語の 1 つではないため、いくつかの設計アプローチを使用する必要があるため、その操作のメソッドを作成する必要があります。

したがって、代わりにc = d + eと書くことができますMyStructMath_add(d,e)

そして、そのような操作に期待するロジックを自分で実装します。

于 2012-08-13T15:53:06.057 に答える