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án | Hỗ trợ? | Giải pháp |
|---|---|---|
| Gán (=) | ✅ Có | Mặc định: member-wise copy |
| So sánh (==, !=) | ❌ Không | Viết hàm so sánh thủ công |
| Toán tử số học (+, -, *, /) | ❌ Không | Viết hàm tự định nghĩa |
| Toán tử bitwise | ❌ Không | Viế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
memcmpdo padding