Operator trong lập trình là gì năm 2024

Tuy nhiên, trong nhiều trường hợp C# không thể tự thực hiện được mà bạn phải tự mình chỉ định kiểu đích. Loại ép kiểu này được gọi là explicit casting.

Show

Lưu ý, nếu bạn chuyển đổi từ chuỗi “1234” thành số 1234 hay ngược lại, dữ liệu đã bị thay đổi về bản chất. Đây được gọi là type conversion.

Để thực hiện type casting, bạn cần dùng phép toán casting theo cách sau:

(

Biểu thức này sẽ thực hiện chuyển đổi sang . Nếu quá trình ép kiểu không thành công, biểu thức sẽ phát ra ngoại lệ (exception).

Ví dụ sau đây sẽ ép kiểu của biến o1 (kiểu object) sang kiểu string và gán vào biến str1:

object o1 = "Hello world"; string str1 = (string)o1; str1 "Hello world"

Type casting với phép toán as

Một cách khác để thực hiện ép kiểu là sử dụng phép toán as. Phép toán as thực hiện ép kiểu cho giá trị. Nếu không thành công sẽ trả về giá trị null. Phép toán này an toàn hơn so với sử dụng phép toán ép kiểu trực tiếp ở trên do nó tránh được exception khi ép kiểu không thành công.

object o1 = "Hello world";

string str2 = o1 as string; str2 "Hello world" object o2 = 12345; string str3 = o2 as string; str3 null

Tuy nhiên, phép toán as lại chỉ có thể áp dụng được đối với các kiểu tham chiếu (reference type). Nó không áp dụng được với kiểu giá trị (value type). Lý do là vì trong trường hợp ép kiểu không thành công, nó trả về giá trị null. Đây là giá trị đặc trưng riêng của kiểu tham chiếu (và kiểu nullable).

Kiểm tra kiểu – phép toán is

Để đảm bảo không gây lỗi khi ép kiểu, bạn nên kiểm tra kiểu (type checking) trước khi thực hiện.

C# sử dụng phép toán is để kiểm tra kiểu của một giá trị (object). Hãy thực hiện một vài ví dụ trên C# interactive:

object o1 = "Hello world"; o1 is string true o1 is int false

Phép toán is nhận một giá trị ở bên trái và tên kiểu ở bên phải. Nó trả về giá trị true nếu giá trị thuộc về kiểu đó. Trong ví dụ trên, giá trị của o1 thuộc kiểu string nên biểu thức

object o1 = "Hello world"; string str1 = (string)o1; str1 "Hello world"

1 trả về giá trị

object o1 = "Hello world"; string str1 = (string)o1; str1 "Hello world"

2, còn

object o1 = "Hello world"; string str1 = (string)o1; str1 "Hello world"

3 trả về giá trị

object o1 = "Hello world"; string str1 = (string)o1; str1 "Hello world"

4.

Lấy thông tin về kiểu: phép toán typeof

Phép toán typeof trả về một object chứa thông tin về kiểu dữ liệu. Từ kết quả này bạn có thể lấy tất cả các thông tin cần thiết về chính kiểu dữ liệu. Ví dụ:

Type stringType = typeof(string); stringType [System.String] stringType.UnderlyingSystemType [System.String] stringType.Assembly [mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089] stringType.BaseType [System.Object] stringType.FullName "System.String"

Lưu ý rằng, typeof chỉ nhận tham số là tên kiểu dữ liệu. Nếu muốn lấy thông tin về kiểu từ biến, bạn phải dùng phương thức GetType():

// Lưu ý: nếu bạn muốn lấy thông tin về kiểu dữ liệu từ biến, bạn phải dùng phương thức GetType()
stringType = "Hello world".GetType(); // hai phương pháp này cho cùng một kết quả

Phép toán typeof được sử dụng rất nhiều cùng với lập trình dynamic, generic và reflection.

Kết luận

Trong bài học này bạn đã tiếp xúc với các phép toán (toán tử) cơ bản của C#. Rất dễ nhận thấy rằng, các toán tử này hoàn toàn tương tự như trong các ngôn ngữ kế thừa cú pháp của ngôn ngữ C.

Nếu bạn có xuất phát điểm là một trong những ngôn ngữ này, việc nắm bắt các toán tử cơ bản của C# rất đơn giản. Ngay cả khi bạn xuất phát từ một ngôn ngữ khác, các phép toán cơ bản của C# không có gì phức tạp. Các vấn đề cần lưu ý đã được trình bày trong bài.

Cập nhật nhanh các toán tử - operators quan trọng trong Dart để có thể sử dụng ngôn ngữ này một cách hiệu quả nhất nhé.

Toán tử (Operators) trong Dart là gì?

Operators trong Dart là những ký hiệu được dùng để thực hiện một phép toán số hoặc logic nhằm để tùy chỉnh hoặc thao tác dữ liệu. Thao tác dữ liệu là một phần thiết yếu của bất kỳ ngôn ngữ lập trình nào và Dart cũng không ngoại lệ. Nó cung cấp một tập hợp các toán tử phong phú cho các kiểu cơ bản của nó.

Photo by Tudor Baciu / Unsplash

Toán tử trong Dart là những biểu tượng đặc biệt giúp thực hiện các phép tính với các giá trị. Ví dụ, toán tử '+' dùng để cộng hai giá trị lại với nhau. Dart có nhiều loại toán tử khác nhau như toán tử số học (thực hiện phép tính toán), toán tử gán (để định giá trị cho biến), toán tử quan hệ (so sánh giá trị), toán tử kiểm tra kiểu dữ liệu (kiểm tra loại dữ liệu), toán tử logic (thực hiện phép logic), toán tử bit (thao tác bit), và toán tử điều kiện (thực hiện kiểm tra điều kiện).

Mỗi toán tử có thể hoạt động với một hoặc hai giá trị, tùy thuộc vào loại toán tử. Bạn cũng có thể tạo ra các toán tử tùy chỉnh cho lớp của mình.

1. Có bao nhiêu loại Dart Operators?

Trong Dart, có nhiều loại toán tử khác nhau, bao gồm các toán tử số học, gán, quan hệ, kiểm tra loại, logic, bit và điều kiện. Mỗi loại toán tử có một chức năng riêng và được sử dụng để thực hiện các thao tác khác nhau trên toán hạng. Trong phần này, chúng ta sẽ cùng tìm hiểu về các toán tử được tích hợp sẵn trong Dart:

  • Toán tử số học - Arithmetic operators
  • Toán tử so sánh - Relational operators
  • Toán tử gán - Assignment operators
  • Toán tử logic - Logical operators
  • Toán tử kiểm tra kiểu - Type test operators
  • Toán tử Bitwise và Shift - Bitwise and Shift operators

2. Toán tử trong Dart và các biểu thức quan trọng

Một biểu thức là một kiểu đặc biệt của câu lệnh nhằm ước lượng ra một số giá trị. Ví dụ, trong toán học, 1 + 1 là một biểu thức bởi vì nó ước lượng ra bằng 2.

Một biểu thức thì bao gồm 2 phần: toán hạng và toán tử.

Toán tử thường tuân theo một ký hiệu trung tố (infix notation). Ký hiệu trung tố là ký hiệu biểu diễn biểu thức, nơi toán tử nằm giữa hai toán hạng.

Toán hạng là các đối tượng dữ liệu mà toán tử đang thực hiện một phép toán trên nó. Nói cách khác toán tử xác định cách các toán hạng được xử lý để tạo ra một giá trị.

Những toán tử khác nhau thực hiện những phép tính khác nhau. Vậy nên, bạn cần biết mình muốn dữ liệu của mình được xử lý như thế nào để mà chọn đúng toán tử.

Photo by Arif Riyanto / Unsplash

Hãy cùng tìm hiểu về từng loại toán tử trong Dart ở các phần dưới đây.

3. Toán tử số học - Arithmetic operators

Toán tử số học là những toán tử thực hiện những phép tính toán học như là cộng hoặc trừ.

3.1. Danh sách của những toán tử số học

Dưới đây là danh sách những toán tử số học được hỗ trợ bởi Dart.

Operator Use

173
-10
70
1.4285714285714286
1
3

5 Adds two operands

173
-10
70
1.4285714285714286
1
3

6 Subtracts the second operand from the first

173
-10
70
1.4285714285714286
1
3

6expr Reverses the sign of the expression (unary minus)

173
-10
70
1.4285714285714286
1
3

8 Multiplies both operands

173
-10
70
1.4285714285714286
1
3

9 Divides the first operand by the second operand

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

0 Divides the first operand by the second operand and returns an integer value

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

1 Gets the remainder after division of one number by another

Chúng ta lấy toán tử đầu tiên là 10 và toán tử thứ hai là 7, xem ví dụ dưới đây:

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 + operand2);
  print(operand1 - operand2);
  print(- operand1);
  print(operand1 * operand2);
  print(operand1 / operand2);
  print(operand1 ~/ operand2);
  print(operand1 % operand2);
}

Output là:

173
-10
70
1.4285714285714286
1
3

Hầu hết các toán tử là những dấu chúng ta thường thấy trong toán học. Chỉ có một dấu có thể mới với chúng ta đó là toán tử

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

0.

3.2. Toán tử tiền tố và hậu tố

Ngôn ngữ Dart cũng hỗ trợ cả toán tử tăng giảm dạng tiền tố và hậu tố.

Dưới đây là danh sách các toán tử tăng giảm dạng tiền tố và hậu tố được hỗ trợ bởi Dart.

Operator Use

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

3var var = var + 1 var

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

3 var = var + 1

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

5var var = var - 1 var

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

5 var = var - 1

Hãy xem thử cách mà mỗi toán tử hoạt động ở một vài ví dụ bên dưới nhé:

++var

Giá trị biểu thức của

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

7 là

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

8. Khi bạn chèn biểu thức vào một câu lệnh in, đầu tiên trình biên dịch sẽ tăng biến thêm 1 đơn vị sau đó mới in ra giá trị của biến đó.

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

Output:

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

9

Giá trị sau khi tăng là 6, tức là 5+1, được hiển thị ra output.

var++

Giá trị biểu thức của

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

0 là

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

1. Khi bạn chèn biểu thức vào một câu lệnh in, đầu tiên trình biên dịch sẽ in ra giá trị của biến đó rồi sau đó mới tăng thêm 1.

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

Output:

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

2

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

9

Trong trường hợp này, câu lệnh

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

4 sẽ hiển thị giá trị của biến trước sau đó mới tăng nó lên. 5 là output của dòng

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

5, trong khi đó câu lệnh

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

4 được gọi lại thì giá trị của biến sẽ được tăng lên. Dòng

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

7 sẽ cho ra ouput là 6.

--var

Giá trị biểu thức của

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

8 là

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

9. Khi chúng ta chèn biểu thức vào câu lệnh in, đầu tiên trình biên dịch sẽ giảm biến đi một 1 đơn vị sau đó mới in ra giá trị của biến.

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

Output:

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

0

Giá trị được hiển thị sau khi giảm là 4, tức là 5-1.

var--

Giá trị biểu thức của

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

1 là

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

1. Khi chúng ta chèn biểu thức vào câu lệnh in, đầu tiên trình biên dịch sẽ in ra giá trị của biến đó rồi sau đó mới giảm đi 1

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

Output:

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

2

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

0

Trong trường hợp này, câu lệnh

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

4 sẽ hiển thị giá trị của biến trước sau đó mới giảm nó đi. 5 là output của dòng

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

6, trong khi đó câu lệnh

main() {
  var postfixIncrement = 5;
  print(postfixIncrement++);
  print(postfixIncrement);
}

4 được gọi lại thì giá trị của biến sẽ giảm xuống. Dòng

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

8 sẽ cho ra ouput là 4.

4. Toán tử so sánh (toán tử quan hệ và đẳng thức) - Relational operators

Toán tử quan hệ là những toán tử thực hiện những phép so sánh giữa các toán hạng của kiểu numeric. Ví dụ như so sánh lớn hơn hay nhỏ hơn. Toán tử đẳng thức có thể so sánh các toán hạng thuộc bất kỳ kiểu

Dưới đây là danh sách các toán tử so sánh được hỗ trợ bởi Dart:

Operator Use

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

9 Checks if the values of the two operands are equal (true if equal)

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

0 Checks if the values of the two operands are not equal (true if not equal)

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

1 Checks if the value of the left operand is greater than the value of the right operand

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

2 Checks if the value of the left operand is less than the value of the right operand

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

3 Checks if the value of the left operand is greater than or equal to the value of the right operand

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

4 Checks if the value of the left operand is less than or equal to the value of the right operand

Toán tử so sánh mang lại kết quả kiểu

main() { var postfixDecrement = 5; print(postfixDecrement--); print(postfixDecrement); }

5

Lấy toán tử đầu tiên là 10, toán tử thứ hai là 7. Hãy xem thử ví dụ sau đây:

Toán tử quan hệ

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

Output:

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7

Toán tử đẳng thức

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 == operand2);
  print(operand1 != operand2);
}

Output:

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6

Chúng ta có thể sử dụng các toán tử đẳng thức trên với các ký tự không phải là số nguyên ví dụ như các ký tự

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

2. Hãy xem ví dụ dưới đây. Toán tử đầu tiên là

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

3 và toán tử thứ hai là

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

4

main() {
  var operand1 = 'a';
  var operand2 = 'b';
  print(operand1 == operand2);
  print(operand1 != operand2);  
}

Output:

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6

5. Toán tử kiểm tra kiểu - Type test operators

Toán tử kiểm tra kiểu là những toán tử có thể sử dụng để kiểm tra kiểu của một đối tượng tại thời gian chạy.

Dưới đây là danh sách các toán tử kiểm tra kiểu được hỗ trợ bởi Dart:

Operator Use

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

7 typecast

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

8 True if the object has the specified type

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

9 False if the object has the specified type

Chúng ta sẽ không đề cập đến toán tử

main() { var operand1 = 10; var operand2 = 7; print(operand1 > operand2); print(operand1 < operand2); print(operand1 >= operand2); print(operand1 <= operand2); }

7 trong series bài viết này.

Mặc dù toán tử kiểm tra kiểu chỉ có hai toán hạng nhưng thứ tự của toán hạng thì rất quan trọng và chúng ta cần phân biệt rõ ràng. Giá trị của kiểu cần được kiểm tra phải ở bên trái của toán tử. Còn bên phải của toán tử chính là bản thân của kiểu.

Đây là syntax cơ bản:

Operator trong lập trình là gì năm 2024

Hãy xem ví dụ dưới đây để hiểu hơn cách sử dụng toán tử kiểm tra kiểu trong ngôn ngữ Dart:

main() {
  double type1 = 5.0;
  int type2 = 87;
  String type3 = "educative";
  bool type4 = true;
  print(type1 is int);
  print(type2 is int);
  print(type3 is String);
  print(type4 is double);
  print(type4 is! double);
}

Output:

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6

  • Dòng

    main() { var operand1 = 10; var operand2 = 7; print(operand1 == operand2); print(operand1 != operand2); }

    6 hiển thị

    main() { var postfixDecrement = 5; print(postfixDecrement--); print(postfixDecrement); }

    7 vì

    main() { var operand1 = 10; var operand2 = 7; print(operand1 == operand2); print(operand1 != operand2); }

    8 là kiểu

    main() { var operand1 = 10; var operand2 = 7; print(operand1 == operand2); print(operand1 != operand2); }

    9 mà chúng ta đang hỏi trình biên dịch là liệu nó có phải là kiểu

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    0 hay không
  • Dòng

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    1 hiển thị

    main() { var postfixDecrement = 5; print(postfixDecrement--); print(postfixDecrement); }

    6 vì

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    3 là kiểu

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    0 và chúng ta cũng đang hỏi trình biên dịch là liệu nó có phải là kiểu

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    0 hay không
  • Dòng

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    6 hiển thị

    main() { var postfixDecrement = 5; print(postfixDecrement--); print(postfixDecrement); }

    6 vì

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    8 là kiểu

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    9 và chúng ta cũng đang hỏi trình biên dịch là liệu nó có phải là kiểu

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    9 hay không
  • Dòng

    main() { double type1 = 5.0; int type2 = 87; String type3 = "educative"; bool type4 = true; print(type1 is int); print(type2 is int); print(type3 is String); print(type4 is double); print(type4 is! double); }

    1 hiển thị

    main() { var postfixDecrement = 5; print(postfixDecrement--); print(postfixDecrement); }

    7 vì

    main() { double type1 = 5.0; int type2 = 87; String type3 = "educative"; bool type4 = true; print(type1 is int); print(type2 is int); print(type3 is String); print(type4 is double); print(type4 is! double); }

    3 là kiểu

    main() { double type1 = 5.0; int type2 = 87; String type3 = "educative"; bool type4 = true; print(type1 is int); print(type2 is int); print(type3 is String); print(type4 is double); print(type4 is! double); }

    4 mà chúng ta đang hỏi trình biên dịch là liệu nó có phải là kiểu

    main() { var operand1 = 10; var operand2 = 7; print(operand1 == operand2); print(operand1 != operand2); }

    9 hay không
  • Dòng

    main() { double type1 = 5.0; int type2 = 87; String type3 = "educative"; bool type4 = true; print(type1 is int); print(type2 is int); print(type3 is String); print(type4 is double); print(type4 is! double); }

    6 hiển thị

    main() { var postfixDecrement = 5; print(postfixDecrement--); print(postfixDecrement); }

    6 vì

    main() { double type1 = 5.0; int type2 = 87; String type3 = "educative"; bool type4 = true; print(type1 is int); print(type2 is int); print(type3 is String); print(type4 is double); print(type4 is! double); }

    3 không phải là kiểu

    main() { double type1 = 5.0; int type2 = 87; String type3 = "educative"; bool type4 = true; print(type1 is int); print(type2 is int); print(type3 is String); print(type4 is double); print(type4 is! double); }

    4 và chúng ta cũng đang hỏi trình biên dịch là liệu nó không phải là kiểu

    main() { var operand1 = 'a'; var operand2 = 'b'; print(operand1 == operand2); print(operand1 != operand2); }

    9 đúng không

6. Toán tử gán - Assignment operators

Toán tử gán là những toán tử được dùng để thực hiện những phép gán một giá trị cho một toán hạng.

Trong phần này chúng ta sẽ gặp lại những toán tử mà chúng ta đã thảo luận, đặc biệt là toán tử

173
-10
70
1.4285714285714286
1
3

01. Bên cạnh đó, chúng ta cũng sẽ tập trung vào những toán tử gán kết hợp (compound assignment operators).

6.1. Toán tử gán kết hợp (Compound Assignment Operators)

Toán tử gán kết hợp sẽ kết hợp những toán tử khác với toán tử gán (

173
-10
70
1.4285714285714286
1
3

01).

\= -= /= %= >>= ^= += *= ~/= <<= &= |=

Dưới đây là syntax chung:

Operator trong lập trình là gì năm 2024

Ở cú pháp trên, toán tử đang đang thực hiện phép toán giữa operand1 và operand2 rồi sau đó gán giá trị kết quả cho operand1.

Nó cũng tương tự như syntax sau:

Operator trong lập trình là gì năm 2024

Để ý mô hình ở trên. Các toán tử gán yêu cầu rằng các toán hạng của nó phải là các biến vì kết quả của phép toán được chứa trong toán hạng bên trái / đầu tiên.

Ví dụ về toán tử gán trong Dart:

173
-10
70
1.4285714285714286
1
3

03

Trong ví dụ dưới đây, chúng ta sẽ lấy toán hạng bên trái

173
-10
70
1.4285714285714286
1
3

04 là 10, toán hạng bên phải

173
-10
70
1.4285714285714286
1
3

05 là 7. Thử sử dụng cả toán tử gán và toán tử gán kết hợp xem thử như thế nào nhé:

173
-10
70
1.4285714285714286
1
3

0

Output:

173
-10
70
1.4285714285714286
1
3

06

173
-10
70
1.4285714285714286
1
3

07

173
-10
70
1.4285714285714286
1
3

08

173
-10
70
1.4285714285714286
1
3

09

Trước khi chúng ta gán lại biến

173
-10
70
1.4285714285714286
1
3

04 thì giá trị của nó là 10. Sau khi sử dụng toán tử gán kết hợp

173
-10
70
1.4285714285714286
1
3

03 thì giá trị mới của nó là 17. Phép

173
-10
70
1.4285714285714286
1
3

12 thì cũng giống như

173
-10
70
1.4285714285714286
1
3

13.

Hãy xem thêm một vài ví dụ nữa nhé:

173
-10
70
1.4285714285714286
1
3

14

173
-10
70
1.4285714285714286
1
3

1

Output:

173
-10
70
1.4285714285714286
1
3

15

173
-10
70
1.4285714285714286
1
3

16

173
-10
70
1.4285714285714286
1
3

17

173
-10
70
1.4285714285714286
1
3

18

173
-10
70
1.4285714285714286
1
3

19 cũng tương tự

173
-10
70
1.4285714285714286
1
3

20

173
-10
70
1.4285714285714286
1
3

21

173
-10
70
1.4285714285714286
1
3

2

Output:

173
-10
70
1.4285714285714286
1
3

15

173
-10
70
1.4285714285714286
1
3

16

173
-10
70
1.4285714285714286
1
3

17

173
-10
70
1.4285714285714286
1
3

25

173
-10
70
1.4285714285714286
1
3

26 cũng tương tự

173
-10
70
1.4285714285714286
1
3

27

7. Toán tử logic - Logical operators

Toán tử logic là những toán tử thực hiện các phép toán logic như là logic và (and), logic hoặc (or). Chúng lấy toán hạng kiểu

main() {
  double type1 = 5.0;
  int type2 = 87;
  String type3 = "educative";
  bool type4 = true;
  print(type1 is int);
  print(type2 is int);
  print(type3 is String);
  print(type4 is double);
  print(type4 is! double);
}

4 và mang lại kết quả kiểu

main() {
  double type1 = 5.0;
  int type2 = 87;
  String type3 = "educative";
  bool type4 = true;
  print(type1 is int);
  print(type2 is int);
  print(type3 is String);
  print(type4 is double);
  print(type4 is! double);
}

4. Dưới đây là danh sách các toán tử logic được hỗ trợ bởi ngôn ngữ Dart.

Operator Name Use

173
-10
70
1.4285714285714286
1
3

30 Logical NOT Reverses the logical state of its operand. If a condition is true, then the Logical NOT operator will make it false

173
-10
70
1.4285714285714286
1
3

31 Logical OR If any of the two operands is not false, then the result is true

173
-10
70
1.4285714285714286
1
3

32 Logical AND If both the operands are not false, then the result is true

7.1. Những quy tắc sử dụng toán tử logic trong Dart

Dưới đây là danh sách các quy tắc ngắn gọn cho các toán tử logic. Danh sách này rất hữu ích vì nó sẽ tóm tắt cách mỗi toán tử trả các biểu thức về kết quả cuối cùng của nó.

expr là một biểu thức tùy ý có thể được thay thế bằng một toán hạng kiểu

173
-10
70
1.4285714285714286
1
3

33. Toán hạng có thể là

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6 hoặc

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7 hoặc có thể là một biểu thức rút gọn thành

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6 hoặc

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7.

7.2. Ví dụ về logical operators trong Dart

Hãy xem những quy tắc trên được thực hiện như thế nào trong ví dụ dưới đây nhé. Biểu thức

173
-10
70
1.4285714285714286
1
3

38 sẽ là

173
-10
70
1.4285714285714286
1
3

39 trong đó

173
-10
70
1.4285714285714286
1
3

04 là

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

6 và

173
-10
70
1.4285714285714286
1
3

05 là

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7.

173
-10
70
1.4285714285714286
1
3

3

Output:

173
-10
70
1.4285714285714286
1
3

44

173
-10
70
1.4285714285714286
1
3

45

173
-10
70
1.4285714285714286
1
3

45

173
-10
70
1.4285714285714286
1
3

44

173
-10
70
1.4285714285714286
1
3

44

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7

173
-10
70
1.4285714285714286
1
3

39 trả về

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7 vì

173
-10
70
1.4285714285714286
1
3

05 là

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

7 và từ danh sách các quy tắc ở trên chúng ta biết rằng

173
-10
70
1.4285714285714286
1
3

54.

8. Toán tử Bitwise và Shift - Bitwise and Shift operators

Toán tử Bitwise và toán tử Shift là những toán tử thực hiện những phép toán trên những bit riêng rẻ của kiểu integer.

Trong lập trình máy tính kỹ thuật số. Phép toán bitwise hoạt động trên một hoặc nhiều số nhị phân (binary numbers), hoặc các chuỗi giống số nhị phân. Đây là một phép toán đơn giản và nhanh, được hỗ trợ trực tiếp bởi bộ xử lý (processor).

Thông thường các phép tính bitwise nhanh hơn rất nhiều so với phép nhân, phép chia, đôi khi nhanh hơn đáng kể so với phép cộng. Các phép tính bitwise sử dụng ít năng lượng hơn bởi nó ít sử dụng tài nguyên

Dưới đây là danh sách các toán tử bitwise được hỗ trợ bởi Dart:

Operator Name Use

173
-10
70
1.4285714285714286
1
3

55 Bitwise AND If the corresponding bit in both operands is 1 it will give a 1, else 0

173
-10
70
1.4285714285714286
1
3

56 Bitwise OR If the corresponding bit in at least one operand is 1 it will give a 1, else 0

173
-10
70
1.4285714285714286
1
3

57 Bitwise XOR If the corresponding bit in only one operand is 1 it will give a 1, else 0

173
-10
70
1.4285714285714286
1
3

58 Unary Bitwise Complement Bits which are 0 become 1 and bits which are 1 become 0

Dưới đây là danh sách các toán tử shift được Dart hỗ trợ:

Operator Name Use

173
-10
70
1.4285714285714286
1
3

59 Shift Left Shifts all the bits of its operand to the left by the specified amount

173
-10
70
1.4285714285714286
1
3

60 Shift Right Shifts all the bits of its operand to the right by the specified amount

Cả hai toán tử Bitwise và Shift đều hoạt động trên số nhị phân.

8.1. Những quy tắc sử dụng Bitwise and Shift operators

Dưới đây chúng ta có một danh sách các quy tắc mà mỗi toán tử bitwise tuân theo. Đối với toán tử bitwise, chúng ta làm việc với số nhị phân. Do đó, thay vì false và true, chúng ta sẽ sử dụng 1 và 0 trong đó 1 đóng vai trò là true và 0 đóng vai trò là false. bit có thể là 1 hoặc 0.

8.2. Ví dụ về Bitwise and Shift operators trong Dart

Bây giờ chúng ta hãy xem các quy tắc trên trong hoạt động như thế nào nhé. Chúng ta sẽ lấy toán hạng đầu tiên

173
-10
70
1.4285714285714286
1
3

04 là 12 và toán hạng thứ hai

173
-10
70
1.4285714285714286
1
3

05 là 5.

173
-10
70
1.4285714285714286
1
3

4

Output:

173
-10
70
1.4285714285714286
1
3

63

173
-10
70
1.4285714285714286
1
3

64

173
-10
70
1.4285714285714286
1
3

65

173
-10
70
1.4285714285714286
1
3

66

173
-10
70
1.4285714285714286
1
3

67

173
-10
70
1.4285714285714286
1
3

68

173
-10
70
1.4285714285714286
1
3

69

8.3. Phân tích code

Output của đoạn code trên có thể không rõ ràng như những output mà chúng ta đã thấy trước đây trong series này. Nhưng đừng lo quá nhé! Từng bước một chúng ta sẽ chia nhỏ những gì mà các toàn tử đang làm.

A & B

Đầu tiên toán tử sẽ chuyển các số thập phân sang dạng nhị phân.

  • 12 trong dạng nhị phân sẽ là 0000 1100
  • 5 trong dạng nhị phân sẽ là 0000 0101

Từ đó, nó sẽ áp dụng những quy tắc trên vào toán tử nhị phân AND (

173
-10
70
1.4285714285714286
1
3

  1. trên từng cặp bits, tức là, áp dụng toán tử

173
-10
70
1.4285714285714286
1
3

55 lên bit đầu tiên của 12 và bit đầu tiên của 5 rồi cứ tiếp tục như thế.

Đó là cách mà

173
-10
70
1.4285714285714286
1
3

72 sẽ trả về kết quả là

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

0.

Thử áp dụng những quy tắc trên vào những toán tử khác và xem liệu bạn có nhận được kết quả cùng với output ở trên hay không?

8.4. Toán tử Shift

Toán tử Shift dịch chuyển các bit của toán hạng. Số lượng bit được dịch chuyển được chỉ định bằng cách sử dụng toán hạng bên phải. Vì vậy, trên dòng

173
-10
70
1.4285714285714286
1
3

74 của mã,

173
-10
70
1.4285714285714286
1
3

05 được dịch sang trái bằng

173
-10
70
1.4285714285714286
1
3

18. Hãy xem cách này hoạt động như thế nào ở hình dưới nhé.

Và đó là cách mà

173
-10
70
1.4285714285714286
1
3

77 trả về kết quả là

173
-10
70
1.4285714285714286
1
3

78

Hãy thử giải thích biểu thức ở dòng

173
-10
70
1.4285714285714286
1
3

79 và hiểu cách mà

173
-10
70
1.4285714285714286
1
3

80 trả về

173
-10
70
1.4285714285714286
1
3

69

9. Mức độ ưu tiên của các toán tử trong Dart

Mức độ ưu tiên của toán tử xác định thứ tự mà các phần khác nhau của code hay biểu thức sẽ được thực hiện. Ví dụ, biểu thức 1 + 1 * 5 sẽ cho kết quả là 6 thay vì 10. Vì

173
-10
70
1.4285714285714286
1
3

8 có mức độ ưu tiên cao hơn

173
-10
70
1.4285714285714286
1
3

5. Nếu chúng ta muốn ra kết quá là 10 thì phải viết (1 + 1) * 5 vì

173
-10
70
1.4285714285714286
1
3

84 có mức độ ưu tiên cao hơn

173
-10
70
1.4285714285714286
1
3

8.

Dưới đây là bảng mức độ ưu tiên của các toán tử. Với mức độ ưu tiên cao nhất sẽ nằm ở trên cùng và thứ tự sẽ giảm dần xuống. Mỗi toán tử có mức độ ưu tiên cao hơn các toán tử trong các hàng theo sau nó.

Description Operator Unary postfix

173
-10
70
1.4285714285714286
1
3

86,

173
-10
70
1.4285714285714286
1
3

87,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

3,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

5,

173
-10
70
1.4285714285714286
1
3

90,

173
-10
70
1.4285714285714286
1
3

84 Unary prefix

173
-10
70
1.4285714285714286
1
3

6,

173
-10
70
1.4285714285714286
1
3

30,

173
-10
70
1.4285714285714286
1
3

94,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

3,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

5,

173
-10
70
1.4285714285714286
1
3

97 Multiplicative

173
-10
70
1.4285714285714286
1
3

8,

173
-10
70
1.4285714285714286
1
3

9,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

00,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

1 Additive

173
-10
70
1.4285714285714286
1
3

5,

173
-10
70
1.4285714285714286
1
3

6 Shift

173
-10
70
1.4285714285714286
1
3

59,

173
-10
70
1.4285714285714286
1
3

60,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

06 Bitwise AND

173
-10
70
1.4285714285714286
1
3

55 Bitwise XOR

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

08 Bitwise OR

173
-10
70
1.4285714285714286
1
3

56 Relational

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

2,

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

1,

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

4,

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

3,

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

7,

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

8,

main() {
  var operand1 = 10;
  var operand2 = 7;
  print(operand1 > operand2);
  print(operand1 < operand2);
  print(operand1 >= operand2);
  print(operand1 <= operand2);
}

9 Equality

main() {
  var prefixDecrement = 5;
  print(--prefixDecrement);
}

9,

main() {
  var postfixDecrement = 5;
  print(postfixDecrement--);
  print(postfixDecrement);
}

0 Logical AND

173
-10
70
1.4285714285714286
1
3

32 Logical Or

173
-10
70
1.4285714285714286
1
3

31 If-null

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

21 Conditional

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

22

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

23 Cascade

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

24 Assignment

173
-10
70
1.4285714285714286
1
3

01,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

26,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

27,

173
-10
70
1.4285714285714286
1
3

03,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

29,

173
-10
70
1.4285714285714286
1
3

14,

main() {
  var prefixIncrement = 5;
  print(++prefixIncrement);
}

31, etc.

Có thể có một số toán tử trong danh sách trên bạn không quen thuộc, nhưng không sao cả; chúng sẽ được đề cập đến trong các bài viết sau. Mục đích của danh sách này là cung cấp cho bạn một thứ tự ưu tiên toán tử toàn diện để bạn có thể quay lại xem bất cứ khi nào bạn cần.

Chúng ta hãy tiếp tục tìm hiểu về Collection của Dart trong bài viết tiếp theo nhé.

Bạn mới “nhập môn” ngôn ngữ Dart? Hãy tham khảo thêm các bài viết liên quan trên trang Blog Lập Trình và Dữ Liệu của 200Lab nhé. Những kiến thức này sẽ là hành trang tuyệt vời cho bạn trên cho đường học tập đấy.