Phép toán sửa đổi
Phép sửa đổi, cũng được gọi là gán phức hợp, cho phép kết hợp phép tính số học hoặc phép tính bitwise với gán thường trong một toán tử.
P | Biểu tượng | Mô tả | Ví dụ | A |
---|---|---|---|---|
14 | += | Phép cộng có gán | e1 += e2 | R |
14 | -= | Phép trừ có gán | e1 -= e2 | R |
14 | *= | Phép nhân với phép gán | e1 *= e2 | R |
14 | /= | Phép chia có gán | e1 /= e2 | R |
14 | %= | Phép chia modulo có phép gán | e1 %= e2 | R |
14 | <<= | Chuyển sang trái với nhiệm vụ | e1 <<= e2 | R |
14 | >>= | Chuyển sang phải với nhiệm vụ | e1 >>= e2 | R |
14 | &= | Bitwise AND với phép gán | e1 &= e2 | R |
14 | |= | Bitwise OR với phép gán | e1 |= e2 | R |
14 | ^= | Bitwise AND/OR với phép gán | e1 ^= e2 | R |
Các toán tử này thực hiện hành động có liên quan cho các toán hạng e1
và e2
, sau đó kết quả được lưu trữ trong e1
.
Một biểu thức như e1 @= e2
trong đó @
là bất kỳ toán tử nào từ bảng thì gần tương đương với e1 = e1 @ e2
. Từ "gần" nhấn mạnh sự hiện diện của một số khía cạnh tinh tế.
Đầu tiên, nếu vị trí của e2
bị chiếm bởi một biểu thức có toán tử có mức ưu tiên thấp hơn @
, e2
vẫn được tính trước toán tử đó. Nghĩa là, nếu mức ưu tiên được đánh dấu bằng dấu ngoặc đơn, chúng ta sẽ có e1 = e1 @ (e2)
.
Thứ hai, nếu có các sửa đổi phụ của các biến trong biểu thức e1
, chúng chỉ được thực hiện một lần. Ví dụ sau đây chứng minh điều này.
int a[] = {1, 2, 3, 4, 5};
int b[] = {1, 2, 3, 4, 5};
int i = 0, j = 0;
a[++i] *= i + 1; // a = {1, 4, 3, 4, 5}, i = 1
// not equivalent!
b[++j] = b[++j] * (j + 1); // b = {1, 2, 4, 4, 5}, j = 2
2
3
4
5
6
Ở đây, mảng a
và b
chứa các phần tử giống hệt nhau và được xử lý bằng các biến chỉ số i
và j
. Đồng thời, biểu thức cho mảng a
sử dụng phép toán *=
, trong khi biểu thức cho mảng `b sử dụng phép toán tương đương. Kết quả không bằng nhau: Cả biến chỉ số và mảng đều khác nhau.
Các toán tử khác sẽ hữu ích trong các bài toán có thao tác ở cấp độ bit. Do đó, biểu thức sau có thể được sử dụng để đặt một bit cụ thể thành 1:
ushort x = 0;
x |= 1 << 10;
2
Ở đây, dịch chuyển 1 (0000 0000 0000 0001
) được thực hiện bằng 10 bit sang trái, kết quả là thu được một số với một bit thứ 10
được đặt (0000 0100 0000 0000
). Phép toán OR bitwise sao chép bit này vào biến x
.
Để thiết lập lại cùng một bit, chúng ta sẽ viết:
x &= ~(1 << 10);
Ở đây, phép toán đảo ngược được áp dụng cho 1 dịch chuyển 10 bit sang trái (mà chúng ta đã thấy trong biểu thức trước đó), dẫn đến tất cả các bit thay đổi giá trị của chúng: '1111 1011 1111 1111
'. Phép toán AND từng bit đặt lại các bit bằng 0 (trong trường hợp này là một) trong biến x
, trong khi tất cả các bit khác trong x
vẫn không thay đổi.