C++
 Computer >> コンピューター >  >> プログラミング >> C++

C言語における構造体変数の操作|代入はできるが比較はできない?

C言語において、構造体(struct)変数に対して直接実行できる操作は限られています。基本的に構造体に対して行えるのは代入操作のみであり、==演算子を使った等価比較などの操作は標準ではサポートされていません。

ここでは、実際のコード例を通じて、構造体でできること・できないことを確認していきましょう。

代入操作の例

まずは、構造体変数への値の代入が正しく動作する例です。

#include <stdio.h>
typedef struct { // 複素数を表すための構造体を定義
    int real, imag;
}complex;
void displayComplex(complex c){
    printf("(%d + %di)\n", c.real, c.imag);
}
main() {
    complex c1 = {5, 2};
    complex c2 = {8, 6};
    printf("Complex numbers are:\n");
    displayComplex(c1);
    displayComplex(c2);
}

実行結果

Complex numbers are:
(5 + 2i)
(8 + 6i)

このように、構造体変数の宣言時に値を代入する初期化は問題なく行えます。また、c2 = c1; のように構造体変数同士を丸ごと代入することも可能です。

では、次に2つの構造体を比較しようとした場合、どのようなことが起きるのか見てみましょう。

比較操作の例

#include <stdio.h>
typedef struct { // 複素数を表すための構造体を定義
    int real, imag;
}complex;
void displayComplex(complex c){
    printf("(%d + %di)\n", c.real, c.imag);
}
main() {
    complex c1 = {5, 2};
    complex c2 = c1;
    printf("Complex numbers are:\n");
    displayComplex(c1);
    displayComplex(c2);
    if(c1 == c2){
        printf("Complex numbers are same.");
    } else {
        printf("Complex numbers are not same.");
    }
}

実行結果

[Error] invalid operands to binary == (have 'complex' and 'complex')

このコードをコンパイルすると、「== 演算子のオペランドとして complex 型は無効である」というエラーが発生します。つまり、C言語では構造体変数同士をそのまま比較することはできないのです。

構造体を比較したい場合はどうする?

構造体全体を == で比較できないため、実務では以下のように各メンバを個別に比較する関数を自作するのが一般的です。

int isEqual(complex a, complex b){
    return (a.real == b.real) && (a.imag == b.imag);
}

このようにメンバ単位で比較処理を記述すれば、構造体の等価性を正しく判定できます。

まとめ

  • 構造体変数には代入(初期化や別変数へのコピー)が可能。
  • ==!= による構造体同士の直接比較は不可(コンパイルエラーになる)。
  • 比較が必要な場合は、メンバごとの比較関数を自作して対応する。
  1. C#のUInt32構造体とは?CompareTo・Equalsメソッドの使い方を実例付きで解説

    UInt32構造体は、C#における32ビット符号なし整数(unsigned integer)を表す値型です。扱える値の範囲は 0 ~ 4,294,967,295 となっており、負の値を持たない整数データを効率的に処理したい場合に活用されます。 この記事では、UInt32構造体が提供する主要なメソッドである「CompareTo()」と「Equals()」について、構文やサンプルコード、実行結果を交えながら詳しく解説していきます。 UInt32.CompareTo()メソッドとは UInt32.CompareTo()メソッドは、現在のインスタンスを指定したオブジェクトまたはUInt32の値と比較

  2. C#のUInt16構造体とは?特徴と主要メソッド(CompareTo・Equals)の使い方を解説

    C#におけるUInt16構造体は、16ビットの符号なし整数を表す値型です。扱える値の範囲は「0 ~ 65,535」となっており、負の値を格納することはできません。その代わり、同じ16ビット幅のInt16(short型)と比較して、正の数を約2倍の範囲まで表現できるのが特徴です。この記事では、UInt16構造体が提供する代表的なメソッドであるCompareTo()とEquals()について、構文や実際のコード例を交えながら詳しく解説していきます。UInt16.CompareTo()メソッドUInt16.CompareTo()メソッドは、現在のインスタンスと指定したオブジェクト、または別のUInt