Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các phép toán trên biến struct trong C

Trong C, biến struct (cấu trúc) chỉ hỗ trợ một số phép toán hạn chế. Phép toán duy nhất được hỗ trợ sẵn là phép gán (assignment). Các phép so sánh (==, !=) và toán tử khác không được hỗ trợ mặc định.

Phép gán (Assignment) - Hỗ trợ sẵn


#include <stdio.h>

typedef struct {
    int real, imag;
} Complex;

void display(Complex c) {
    printf("(%d + %di)\n", c.real, c.imag);
}

int main() {
    Complex c1 = {5, 2};
    Complex c2 = {8, 6};
    
    printf("So phuc 1: "); display(c1);
    printf("So phuc 2: "); display(c2);
    
    // Phép gán - HOẠT ĐỘNG
    Complex c3 = c1;  // Copy toàn bộ struct
    printf("c3 = c1: "); display(c3);
    
    return 0;
}

Kết quả

So phuc 1: (5 + 2i)
So phuc 2: (8 + 6i)
c3 = c1: (5 + 2i)

Phép so sánh (==) - KHÔNG hỗ trợ


Complex c1 = {5, 2};
Complex c2 = c1;

if (c1 == c2) {  // LỖI BIÊN DỊCH: invalid operands to binary ==
    printf("Bang nhau\n");
}

Kết quả biên dịch

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

Cách so sánh struct

1. So sánh từng thành viên (Manual)


int complex_equal(Complex a, Complex b) {
    return a.real == b.real && a.imag == b.imag;
}

2. Dùng memcmp (Cẩn thận!)


#include <string.h>

int complex_equal_memcmp(Complex a, Complex b) {
    return memcmp(&a, &b, sizeof(Complex)) == 0;
}

Cảnh báo: memcmp so sánh byte-by-byte bao gồm cả padding bytes (đệm bộ nhớ) → kết quả không tin cậy nếu struct có padding.

3. C++: Nạp chồng operator==


// Chỉ trong C++
struct Complex {
    int real, imag;
    bool operator==(const Complex& other) const {
        return real == other.real && imag == other.imag;
    }
};

Các phép toán KHÔNG hỗ trợ trên struct C

Phép toánHỗ trợ?Giải pháp
Gán (=)✅ CóMặc định: member-wise copy
So sánh (==, !=)❌ KhôngViết hàm so sánh thủ công
Toán tử số học (+, -, *, /)❌ KhôngViết hàm tự định nghĩa
Toán tử bitwise❌ KhôngViết hàm
Kích thước (sizeof)✅ CóTrả về size bytes (có padding)
Địa chỉ (&)✅ CóLấy địa chỉ struct

Ví dụ: Các phép toán số phức tự định nghĩa (C)


Complex add(Complex a, Complex b) {
    Complex result;
    result.real = a.real + b.real;
    result.imag = a.imag + b.imag;
    return result;
}

Complex multiply(Complex a, Complex b) {
    Complex result;
    result.real = a.real * b.real - a.imag * b.imag;
    result.imag = a.real * b.imag + a.imag * b.real;
    return result;
}

Tóm tắt

  • C chỉ hỗ trợ gán (=) và sizeof/& cho struct
  • So sánh phải viết hàm thủ công
  • C++ hỗ trợ nạp chồng toán tử cho struct/class
  • Cẩn thận với memcmp do padding