Toán Tử Đơn Trong C

Xin chào các người, những siêu sao lập trình trong tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình phiêu lưu vào thế giới của các toán tử đơn trong C. Đừng lo nếu bạn mới bắt đầu học lập trình - tôi sẽ là người hướng dẫn bạn thân thiện, và chúng ta sẽ khám phá chủ đề này bước từng bước. Vậy, hãy chuẩn bị túi đựng của bạn và bắt đầu nào!

C - Unary Operators

Toán Tử Tăng Trong C

Hãy bắt đầu với toán tử tăng, nó như một nút "tăng thêm 1" ma thuật cho các biến của chúng ta. Trong C, chúng ta sử dụng "++" để tăng giá trị. Điều này rất tiện lợi khi chúng ta muốn đếm điều gì đó hoặc di chuyển qua một chuỗi.

Có hai cách sử dụng toán tử tăng:

  1. Tăng trước: ++biến
  2. Tăng sau: biến++

Hãy xem một số ví dụ:

#include <stdio.h>

int main() {
int banh_kem = 5;

printf("Tôi có %d bánh kẹo.\n", banh_kem);

// Tăng trước
printf("Sau khi ăn một: %d\n", ++banh_kem);

// Tăng sau
printf("Số hiện tại: %d\n", banh_kem++);
printf("Sau khi đếm: %d\n", banh_kem);

return 0;
}

Đầu ra:

Tôi có 5 bánh kẹo.
Sau khi ăn một: 6
Số hiện tại: 6
Sau khi đếm: 7

Trong ví dụ này, chúng ta bắt đầu với 5 bánh kẹo. Khi chúng ta sử dụng tăng trước (++banh_kem), nó ngay lập tức tăng giá trị trước khi sử dụng. Với tăng sau (banh_kem++), nó sử dụng giá trị hiện tại trước, sau đó tăng nó.

Toán Tử Giảm Trong C

Bây giờ, hãy gặp toán tử giảm, người anh em đẹp của toán tử tăng. Nó làm điều ngược lại - giảm 1 khỏi biến của chúng ta. Chúng ta sử dụng "--" cho hoạt động này.

Giống như anh em của nó, nó cũng có hai loại:

  1. Giảm trước: --biến
  2. Giảm sau: biến--

Hãy xem nó hoạt động:

#include <stdio.h>

int main() {
int mang = 3;

printf("Bạn có %d mạng.\n", mang);

// Giảm trước
printf("Ôi! Bạn mất một: %d\n", --mang);

// Giảm sau
printf("Mạng hiện tại: %d\n", mang--);
printf("Game Over: %d\n", mang);

return 0;
}

Đầu ra:

Bạn có 3 mạng.
Ôi! Bạn mất một: 2
Mạng hiện tại: 2
Game Over: 1

Ở đây, chúng ta bắt đầu với 3 mạng trong trò chơi tưởng tượng của mình. Giảm trước (--mang) ngay lập tức giảm số lượng, trong khi giảm sau (mang--) sử dụng giá trị hiện tại trước khi giảm.

Toán Tử "Dương" trong C

Toán tử "dương" có thể có vẻ hơi không cần thiết ban đầu. Cuối cùng, một số dương đã... dương phải không? Đúng vậy, nhưng toán tử này có ích, đặc biệt khi làm việc với các kiểu dữ liệu khác nhau.

#include <stdio.h>

int main() {
int so = 42;
float pi = 3.14;

printf("Số dương int: %d\n", +so);
printf("Số dương float: %f\n", +pi);

return 0;
}

Đầu ra:

Số dương int: 42
Số dương float: 3.140000

Trong ví dụ này, toán tử "dương" không thay đổi giá trị, nhưng nó đảm bảo rằng chúng được coi là số dương. Nó như đang đưa cho các biến của bạn một lời khuyên nhỏ: "Duỗi dương, bạn nhé!"

Toán Tử "Âm" Trong C

Toán tử "âm" như một chiếc cánh ma thuật có thể chuyển đổi số dương thành số âm (và ngược lại). Nó rất hữu ích khi chúng ta cần đảo ngược dấu của một giá trị.

#include <stdio.h>

int main() {
int nhiet_do = 25;
float so_du = -100.50;

printf("Nhiệt độ ban đầu: %d\n", nhiet_do);
printf("Dưới không: %d\n", -nhiet_do);

printf("Số dư ban đầu: %.2f\n", so_du);
printf("Xin cấp nợ: %.2f\n", -so_du);

return 0;
}

Đầu ra:

Nhiệt độ ban đầu: 25
Dưới không: -25
Số dư ban đầu: -100.50
Xin cấp nợ: 100.50

Nhìn thấy chúng ta đã chuyển một ngày nóng thành một ngày lạnh và xin cấp nợ chỉ với một dấu "-" nhỏ? Đó là sức mạnh của toán tử âm!

Toán Tử Địa Chỉ (&) Trong C

Bây giờ, hãy buộc tay vào một chủ đề phức tạp hơn - toán tử địa chỉ. Dấu và (&) này như một chiếc GPS cho các biến của chúng ta, nói rõ ràng vị trí mà chúng ở trong bộ nhớ máy tính.

#include <stdio.h>

int main() {
int tuoi = 25;
float chieu_cao = 1.75;

printf("Giá trị tuổi: %d\n", tuoi);
printf("Địa chỉ tuổi: %p\n", (void*)&tuoi);

printf("Giá trị chiều cao: %.2f\n", chieu_cao);
printf("Địa chỉ chiều cao: %p\n", (void*)&chieu_cao);

return 0;
}

Đầu ra (lưu ý: địa chỉ thực tế sẽ thay đổi):

Giá trị tuổi: 25
Địa chỉ tuổi: 0x7ffd5e8e3994
Giá trị chiều cao: 1.75
Địa chỉ chiều cao: 0x7ffd5e8e3998

Ở đây, chúng ta không chỉ nhìn thấy giá trị của các biến mà còn nhìn thấy các địa điểm bí mật của chúng trong bộ nhớ. Cool, phải không?

Toán Tử Định Địa (*) Trong C

Toán tử định địa như một bản đồ kho báu - nó giúp chúng ta tìm giá trị bị ẩn ở một địa chỉ cụ thể. Nó là đồng minh của toán tử địa chỉ.

#include <stdio.h>

int main() {
int kho_bau = 1000;
int *ban_do = &kho_bau;

printf("Giá trị kho báu: %d\n", kho_bau);
printf("Bản đồ trỏ tới: %p\n", (void*)ban_do);
printf("Tìm thấy kho báu: %d\n", *ban_do);

*ban_do = 2000;  // Thay đổi kho báu!
printf("Giá trị kho báu mới: %d\n", kho_bau);

return 0;
}

Đầu ra:

Giá trị kho báu: 1000
Bản đồ trỏ tới: 0x7ffd5e8e3994
Tìm thấy kho báu: 1000
Giá trị kho báu mới: 2000

Trong ví dụ này, 'ban_do' (con trỏ) dẫn chúng ta đến kho báu, và chúng ta có thể thay đổi giá trị của kho báu bằng cách sử dụng toán tử định địa. Đó thật sự như ma thuật!

Toán Tử Không Logic (!) Trong C

Toán tử không logic như một kẻ phản bội - nó chuyển đổi đúng thành sai và sai thành đúng. Trong C, bất kỳ giá trị khác không đều được coi là đúng, và không là sai.

#include <stdio.h>

int main() {
int mua = 1;  // 1 có nghĩa là đúng
int mua_dong = 0;  // 0 có nghĩa là sai

printf("Trời có mưa? %d\n", mua);
printf("Trời không mưa? %d\n", !mua);

printf("Trời có mưa đông? %d\n", mua_dong);
printf("Trời không mưa đông? %d\n", !mua_dong);

return 0;
}

Đầu ra:

Trời có mưa? 1
Trời không mưa? 0
Trời có mưa đông? 0
Trời không mưa đông? 1

Nhìn thấy toán tử không logic lật ngược điều kiện thời tiết? Nó như có một nút "ngược lại" ngay cả!

Toán Tử Lẻ 1 (1's Complement) (~) Trong C

Cuối cùng nhưng không kém phần quan trọng, hãy nói về toán tử lẻ 1. Toán tử này lật ngược tất cả các bit của một số, chuyển đổi 0 thành 1 và ngược lại. Nó như đang mang lại cho số nhị phân của bạn một trạng thái hoàn toàn mới!

#include <stdio.h>

int main() {
unsigned char a = 5;  // Nhị phân: 00000101
unsigned char b = ~a; // Nhị phân: 11111010

printf("Giá trị ban đầu: %d\n", a);
printf("Giá trị lẻ: %d\n", b);

printf("Biểu diễn nhị phân:\n");
printf("a: ");
for (int i = 7; i >= 0; i--) {
printf("%d", (a >> i) & 1);
}
printf("\nb: ");
for (int i = 7; i >= 0; i--) {
printf("%d", (b >> i) & 1);
}
printf("\n");

return 0;
}

Đầu ra:

Giá trị ban đầu: 5
Giá trị lẻ: 250
Biểu diễn nhị phân:
a: 00000101
b: 11111010

Trong ví dụ này, chúng ta có thể thấy toán tử lẻ 1 lật ngược mọi bit. Nó như làm cho số nhị phân của bạn đảo lộn!

Và thế là, các người! Chúng ta đã khám phá tất cả các toán tử đơn trong C. Hãy nhớ, luyện tập là chìa khóa để thành công, vì vậy đừng sợ hãi để thử nghiệm với các toán tử này trong mã của bạn. Chúc mừng lập trình, và may các toán tử đơn luôn ở bên cạnh bạn!

Toán tử Tên Mô tả
++ Tăng Tăng giá trị lên 1
-- Giảm Giảm giá trị xuống 1
+ Dương Chỉ ra giá trị dương (thường không sử dụng)
- Âm Nghịch đảo biểu thức
& Địa chỉ Trả về địa chỉ bộ nhớ của biến
* Định địa Truy cập giá trị tại địa chỉ con trỏ
! Không logic Nghịch đảo trạng thái logic
~ Lẻ 1 (1's Complement) Lật ngược tất cả các bit

Credits: Image by storyset