Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C 언어 구조체 변수에 적용 가능한 연산 완벽 정리

C 언어에서 구조체(struct) 변수에는 어떤 연산을 적용할 수 있을까요? 결론부터 말하면, 구조체 변수에 기본적으로 허용되는 연산은 대입(assignment) 연산뿐입니다. 두 구조체를 비교하는 동등성 검사(==)나 기타 다른 연산자는 구조체에 직접 사용할 수 없습니다.

구조체 대입 연산 예제

아래 예제는 복소수를 표현하는 구조체를 정의하고, 각 구조체 변수에 값을 초기화한 뒤 출력하는 코드입니다.

#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)

이 코드는 정상적으로 동작합니다. 구조체 변수를 선언하면서 중괄호 { }를 이용해 초기화했기 때문입니다. 또한 이미 값이 설정된 구조체 변수를 다른 변수에 통째로 대입하는 것도 가능합니다.

구조체 비교 연산 시 발생하는 문제

그렇다면 두 구조체 객체가 같은지 비교하려면 어떻게 될까요? 아래 예제에서 직접 확인해 보겠습니다.

#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')

위와 같이 컴파일 에러가 발생합니다. C 언어에서는 구조체 타입의 피연산자에 대해 == 연산자를 사용할 수 없기 때문입니다. 즉, c1 == c2처럼 구조체 전체를 한 번에 비교하는 것은 문법적으로 허용되지 않습니다.

구조체 비교가 안 되는 이유와 해결 방법

구조체 내부에는 패딩(padding) 바이트가 포함될 수 있고, 멤버 구성이 다양하기 때문에 C 표준에서는 구조체 단위의 비교 연산을 지원하지 않습니다. 따라서 두 구조체가 같은지 확인하려면 멤버별로 하나씩 비교해야 합니다.

if(c1.real == c2.real && c1.imag == c2.imag){
    printf("Complex numbers are same.");
} else {
    printf("Complex numbers are not same.");
}

정리

  • 구조체 변수는 대입 연산(=)이 가능합니다. 선언과 동시에 초기화하거나, 다른 구조체 변수를 통째로 복사할 수 있습니다.
  • ==, != 같은 비교 연산은 구조체에 직접 사용할 수 없습니다.
  • 구조체를 비교하려면 각 멤버를 개별적으로 비교하는 함수를 직접 작성해야 합니다.