Các nhà điều hành trong C++: Cổng vào thế giới ma thuật lập trình

Xin chào các pháp sư tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới các nhà điều hành trong C++. Đừng lo nếu bạn chưa từng viết một dòng mã trước đây - tôi ở đây để hướng dẫn bạn từng bước, như tôi đã làm cho hàng trăm học sinh trong những năm dạy học của mình. Hãy lấy cây phép (bàn phím) của bạn và cùng chúng tôi thực hiện một số phép lập trình!

C++ Operators

Nhà điều hành là gì?

Trước khi chúng ta nhảy vào, hãy hiểu nhà điều hành là gì. Trong C++, nhà điều hành là các ký hiệu đặc biệt chỉ định máy tính thực hiện các thao tác toán học hoặc logic cụ thể. Hãy tưởng tượng chúng như những từ ma thuật trong sách phép của bạn - mỗi từ có một tác dụng duy nhất!

Nhà điều hành số học

Hãy bắt đầu từ cơ bản - các nhà điều hành số học. Những này có lẽ đã quen thuộc với bạn từ lớp toán,但现在 chúng ta sẽ sử dụng chúng để máy tính thực hiện các phép toán cho chúng ta!

Dưới đây là bảng các nhà điều hành số học trong C++:

Nhà điều hành Mô tả Ví dụ
+ Cộng a + b
- Trừ a - b
* Nhân a * b
/ Chia a / b
% Modulo (dư) a % b
++ Tăng a++ hoặc ++a
-- Giảm a-- hoặc --a

Hãy xem chúng trong hành động:

#include <iostream>
using namespace std;

int main() {
int a = 10, b = 3;

cout << "a + b = " << a + b << endl;  // Output: 13
cout << "a - b = " << a - b << endl;  // Output: 7
cout << "a * b = " << a * b << endl;  // Output: 30
cout << "a / b = " << a / b << endl;  // Output: 3
cout << "a % b = " << a % b << endl;  // Output: 1

cout << "a++ = " << a++ << endl;  // Output: 10
cout << "Now a = " << a << endl;  // Output: 11

cout << "++b = " << ++b << endl;  // Output: 4
cout << "Now b = " << b << endl;  // Output: 4

return 0;
}

Trong ví dụ này, chúng ta đang thực hiện các thao tác số học khác nhau. Lưu ý rằng a++ xuất ra 10 nhưng sau đó a trở thành 11? Điều này là vì a++ là tăng hậu tố - nó sử dụng giá trị hiện tại, sau đó tăng nó lên. Còn ++b là tăng tiền tố - nó tăng giá trị trước khi sử dụng nó.

Nhà điều hành quan hệ

Tiếp theo, chúng ta có các nhà điều hành quan hệ. Những này được sử dụng để so sánh các giá trị và trả về true (1) hoặc false (0). Chúng giống như các trọng tài trong một cuộc đọ ma thuật!

Dưới đây là bảng các nhà điều hành quan hệ:

Nhà điều hành Mô tả Ví dụ
== Bằng a == b
!= Không bằng a != b
> Lớn hơn a > b
< Nhỏ hơn a < b
>= Lớn hơn hoặc bằng a >= b
<= Nhỏ hơn hoặc bằng a <= b

Hãy xem chúng trong hành động:

#include <iostream>
using namespace std;

int main() {
int a = 10, b = 5;

cout << "a == b is " << (a == b) << endl;  // Output: 0 (false)
cout << "a != b is " << (a != b) << endl;  // Output: 1 (true)
cout << "a > b is " << (a > b) << endl;    // Output: 1 (true)
cout << "a < b is " << (a < b) << endl;    // Output: 0 (false)
cout << "a >= b is " << (a >= b) << endl;  // Output: 1 (true)
cout << "a <= b is " << (a <= b) << endl;  // Output: 0 (false)

return 0;
}

Trong phép thuật này... tôi có nghĩa là chương trình, chúng ta đang so sánh ab bằng các nhà điều hành quan hệ khác nhau. Nhớ rằng, trong C++, true được biểu thị bằng 1 và false bằng 0.

Nhà điều hành logic

Bây giờ, hãy thêm một chút logic vào ma thuật của chúng ta! Các nhà điều hành logic được sử dụng để kết hợp các câu điều kiện.

Dưới đây là bảng các nhà điều hành logic:

Nhà điều hành Mô tả Ví dụ
&& Logic AND a && b
|| Logic OR a || b
! Logic NOT !a

Hãy thực hiện một phép thuật với những này:

#include <iostream>
using namespace std;

int main() {
bool a = true, b = false;

cout << "a && b is " << (a && b) << endl;   // Output: 0 (false)
cout << "a || b is " << (a || b) << endl;   // Output: 1 (true)
cout << "!a is " << (!a) << endl;           // Output: 0 (false)
cout << "!b is " << (!b) << endl;           // Output: 1 (true)

return 0;
}

Trong phép thuật này, chúng ta đang sử dụng các nhà điều hành logic để kết hợp hoặc phủ định các giá trị boolean. && chỉ trả về true nếu cả hai operand đều true, || trả về true nếu ít nhất một operand là true, và ! phủ định giá trị boolean.

Nhà điều hành bitwise

Bây giờ, chúng ta đang bước vào lĩnh vực của ma thuật tiên tiến - các nhà điều hành bitwise. Những này hoạt động trên các bit cá nhân của các giá trị số nguyên. Chúng giống như các microspell của thế giới lập trình!

Dưới đây là bảng các nhà điều hành bitwise:

Nhà điều hành Mô tả Ví dụ
& Bitwise AND a & b
| Bitwise OR a | b
^ Bitwise XOR a ^ b
~ Bitwise NOT ~a
<< Left shift a << n
>> Right shift a >> n

Hãy xem một chút bit magic:

#include <iostream>
using namespace std;

int main() {
unsigned int a = 60;  // 60 = 0011 1100 in binary
unsigned int b = 13;  // 13 = 0000 1101 in binary

cout << "a & b = " << (a & b) << endl;   // Output: 12 (0000 1100 in binary)
cout << "a | b = " << (a | b) << endl;   // Output: 61 (0011 1101 in binary)
cout << "a ^ b = " << (a ^ b) << endl;   // Output: 49 (0011 0001 in binary)
cout << "~a = " << (~a) << endl;         // Output: -61 (1100 0011 in binary)
cout << "a << 2 = " << (a << 2) << endl; // Output: 240 (1111 0000 in binary)
cout << "a >> 2 = " << (a >> 2) << endl; // Output: 15 (0000 1111 in binary)

return 0;
}

Phép thuật này có thể trông hơi phức tạp, nhưng nó đang thực hiện các thao tác trên các bit riêng lẻ của số của chúng ta. Ví dụ, & thực hiện phép AND trên mỗi cặp bit tương ứng, | thực hiện phép OR, và vân vân. Các thao tác dịch <<>> di chuyển tất cả các bit sang trái hoặc phải theo số vị trí chỉ định.

Nhà điều hành gán

Các nhà điều hành gán được sử dụng để gán giá trị cho các biến. Chúng giống như các bút viết trong sách phép của bạn!

Dưới đây là bảng các nhà điều hành gán:

Nhà điều hành Mô tả Ví dụ
= Gán đơn giản a = b
+= Cộng và gán a += b
-= Trừ và gán a -= b
*= Nhân và gán a *= b
/= Chia và gán a /= b
%= Modulo và gán a %= b
<<= Dịch trái và gán a <<= b
>>= Dịch phải và gán a >>= b
&= Bitwise AND và gán a &= b
^= Bitwise XOR và gán a ^= b
|= Bitwise OR và gán a |= b

Hãy viết một số giá trị trong sách phép của chúng ta:

#include <iostream>
using namespace std;

int main() {
int a = 10;

cout << "Initial value of a: " << a << endl;

a += 5;  // Equivalent to: a = a + 5
cout << "After a += 5: " << a << endl;

a -= 3;  // Equivalent to: a = a - 3
cout << "After a -= 3: " << a << endl;

a *= 2;  // Equivalent to: a = a * 2
cout << "After a *= 2: " << a << endl;

a /= 4;  // Equivalent to: a = a / 4
cout << "After a /= 4: " << a << endl;

a %= 3;  // Equivalent to: a = a % 3
cout << "After a %= 3: " << a << endl;

return 0;
}

Trong chương trình ma thuật này, chúng ta đang sử dụng các nhà điều hành gán khác nhau để thay đổi giá trị của a. Những nhà điều hành này kết hợp việc gán với một thao tác khác, làm cho mã của chúng ta ngắn gọn hơn.

Nhà điều hành khác nhau

C++ cũng có một số nhà điều hành khác không thuộc vào các类别 khác. Chúng giống như các lá bài wild card trong bộ bài phép thuật của chúng ta!

Dưới đây là bảng các nhà điều hành khác nhau:

Nhà điều hành Mô tả Ví dụ
sizeof Trả về kích thước của một biến sizeof(a)
?: Nhà điều hành ba ngôi condition ? expr1 : expr2
& Trả về địa chỉ của một biến &a
* Con trỏ đến một biến *ptr
. Truy cập thành viên của struct hoặc đối tượng class object.member
-> Truy cập thành viên của struct hoặc class thông qua con trỏ ptr->member

Hãy xem một số trong những này trong hành động:

#include <iostream>
using namespace std;

int main() {
int a = 10;
int* ptr = &a;

cout << "Size of int: " << sizeof(int) << " bytes" << endl;
cout << "Value of a: " << a << endl;
cout << "Address of a: " << &a << endl;
cout << "Value pointed by ptr: " << *ptr << endl;

int b = (a > 5) ? 1 : 0;
cout << "b = " << b << endl;

return 0;
}

Trong phép thuật này, chúng ta đang sử dụng sizeof để lấy kích thước của một int, & để lấy địa chỉ của a, * để dereference một con trỏ, và nhà điều hành ba ngôi ?: như một cách viết ngắn gọn cho câu lệnh if-else.

Độ ưu tiên của nhà điều hành trong C++

Giống như trong toán học, các nhà điều hành trong C++ có thứ tự ưu tiên. Điều này xác định thứ tự mà các phép toán được thực hiện trong một biểu thức. Nó giống như các quy tắc của cuộc chiến ma thuật - một số phép thuật có precedense cao hơn các phép thuật khác!

Dưới đây là bảng đơn giản về thứ tự ưu tiên của nhà điều hành (từ cao nhất đến thấp nhất):

Precedence Operator
1 ::
2 () [] -> . ++ --
3 ! ~ ++ -- + - * & (type) sizeof
4 * / %
5 + -
6 << >>
7 < <= > >=
8 == !=
9 &
10 ^
11 |
12 &&
13 ||
14 ?:
15 = += -= *= /= %= >>= <<= &= ^= |=
16 ,

Nhớ rằng, bạn luôn có thể sử dụng dấu ngoặc để覆写默认的优先级 và明确指定 thứ tự các phép toán.

Và thế là bạn đã hoàn thành bài học đầu tiên về ma thuật các nhà điều hành trong C++. Hãy nhớ, thực hành là cách tốt nhất để trở nên hoàn hảo, vì vậy hãy tiếp tục thực hiện các phép lập trình này cho đến khi chúng trở nên tự nhiên. Trước khi bạn biết điều đó, bạn sẽ dễ dàng tạo ra các chương trình phức tạp. Chúc bạn may mắn và ít lỗi biên dịch!

Credits: Image by storyset