• ベストアンサー

構造体の代入と比較

構造体のコピーは以下のようで正しいと思いますが、 struct A { int a; }; struct x, y; x.a=1; y = x; 構造体の比較は if (x != y)ではいけないのでしょうか? 構造体に限らずクラスも同じ考えでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★軽くアドバイス ・回答者No.3さんの >if (memcmp(&x, &y, sizeof(struct A)) != 0)  この方法はちょっと注意が必要です。  アライメントに気をつけましょう。 ・代入の方は古いCコンパイラでは無理なことがあります。  最近のコンパイラなら問題はありません。

その他の回答 (3)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

構造体のメモリを全部比較するという意味なら if (memcmp(&x, &y, sizeof(struct A)) != 0) で出来ます。

  • jx-word
  • ベストアンサー率40% (38/94)
回答No.2

構造体の代入はその方法で問題ありません。 比較の方は、構造体を丸ごと比較する方法はなく、メンバーを一つ一つ地道に比較するしかありません。 http://www.kouno.jp/home/c_faq/c2.html#8 C++のクラスも同様ですが、普通はoperator==をオーバーロードして比較処理を作成します。

  • lesskey
  • ベストアンサー率33% (66/200)
回答No.1

# if (x != y)ではいけないのでしょうか? 構造体ではこの比較は出来ないと思いますが、 C++のクラスであれば演算子の多重定義(演算子オーバーロード)を 使うことで実現が出来ます。リンク先を参照ください。

参考URL:
http://wisdom.sakura.ne.jp/programming/cpp/cpp27.html

関連するQ&A

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • C++で構造体のコピーはできても == や != で比較はできないので

    C++で構造体のコピーはできても == や != で比較はできないのでしょうか? struct ST { int a; int b[10]; }; ST a; ST b; a = b; // エラーなし if (a != b) {      // エラーあり printf("違います"); }

  • 構造体について

    以下のような構造体の宣言が合ったとき struct list { int a; char b[20]; struct list *next; }; struct list *add_list( int a, char *str, struct list *head );・・・1 struct list *del_list( int a, struct list *head );・・・2 1は引数の数が同じため問題ないのですが、2はどういう意味になるのでしょう?

  • 構造体メンバへの代入

    とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。

  • 構造体の要素すべてに対する四則演算の方法を教えてください.

    構造体の要素すべてに対する四則演算の方法を教えてください. たとえば、 2点a,bの座標成分x,y,zをそれぞれの座標ごとに足す方法を教えてください. 下のようにx,y,z成分を持ったa,bがあります。 struct point{ int x; int y; int z; }; struct point a; struct point b; struct point c; この場合, c=a+b; と書くことができず, それぞれの成分ごとに以下のように足さなくてはなりません. c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; この方法でできるのですが, 非常に効率的でないのでなにかもっと簡単に記述する方法を教えてください. お願いいたします.

  • 構造体のすべての変数を文字列に変換したい

    以下のような3つの構造体が与えられたときに、構造体tdが初期化されているとします。 そのときに、構造体tdのすべての要素を文字列に変換したいのですが,ひとつひとつ sprintf を使って変換するのは、ソースファイルにひとつずつ書かなければならず、あまり用いたくありません。 何かよい方法はないのでしょうか? ご回答よろしくお願いします。 struct area{  int x;  int y;  int r[20]; }; struct pinf{  struct area;  int s;  int r[18]; }; struct td{  char no[4];  char name[20];  struct pinf p1,p2[10];  int tpc;  int r[20]; };

  • 構造体を生成時にわざわざ初期化しないようにしたいのですが。

    ヘッダーファイルにstruct XXXを定義して、 struct XXX{ int x; int y; } 生成時に、 struct XXX param = {0,0}; のような初期化を毎回行う必要がないようにしたいのですが、 構造体を利用している時点でそれは不可能でしょうか? そこで、structをやめて、以下のようにclassにしてしまえば解決しそうですが、 class XXX{ public: XXX(): x(0); y(0); {}; ~XXX(){}; int x; int y; } この解決方法について同じような経験あるかたいらっしゃいましたらコメントいただけませんか? 私的には少し大げさなような気がしています。 classにpublic変数を持たせるのも変な感じがしますし、そもそも構造体用のclassを作ることがあるのかなって疑問に思ってます。 お気づきかと思いますが経験が浅いので、この解決方法が常套手段なのかどうかが知りたいところです。 お詳しい方、つっこみでも良いのでお願いします。

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • 構造体(問題→回答)

    えっと、昨日先生に 「構造体を作れ!」と言われて 全然出来ませんでした。 本とかを見て理解するのではなくて、 実際に自分で何も見ないで 出来るようになりたいのです。 で、何でもいいので、 何か問題を出して欲しいのです。 昨日の先生の例:四角形を作れ! #include <stdio.h> struct Sikaku{ int x1; int y1; int x2; int y2; }; main() { struct Sikaku s[100]; s[0].x1 = 20; s[0].y1 = 20; s[0].x2 = 40; s[0].y2 = 40; } 何か問題を出したら、考えて回答を書きますので、よろしくお願いします。 いっぱい出してください。 お願いします。

  • 構造体の配列とメンバの配列

    typedef struct _ex_table1 {   int  x[10];   int  y[10]; }ETable1; ETable1 et1; int ans1; for( int a = 0; a < 10; a++ ){   et1.x[a] = a+10;   et1.y[a] = a*2; } for( int b = 0; b < 10; b++ ){   if( et1.x[b] == 15 ){     ans1 = et1.y[b];     break;   }   else{     ans1 = 0;   } } printf( "%d", ans1 ); ///////////////////////////////// typedef struct _ex_table2 {   int xx;   int yy; }ETable2; ETable2 et2[10]; int ans2; for( int aa = 0; aa < 10; aa++ ){   et2[aa].xx = aa+10;   et2[aa].yy = aa*2; } for( int bb = 0; bb < 10; bb++){   if( et2[bb].xx == 15 ){     ans2 = et2[bb].yy;     break;   }   else   {     ans2 = 0;   } } printf("%d", ans2 ); と言う感じに、微妙にソースを書いてみたのですが、 上のメンバ(x,xx)の値が正しいものがあったら、 対応する下のメンバ(y,yy)を出力したいと思っていますが、 構造体を配列にした場合と、構造体メンバを配列にした場合は どのように違うのでしょうか? 私には、同じように思えてしまいます。 どなたか、利点・欠点など教えていただけませんか? よろしくお願い致します。

専門家に質問してみよう