Các toán tử cho phép xử lý các dữ liệu. Chúng nhận một hoặc nhiều toán hạng đầu vào và trả về một kết quả. Toán tử trong C# là các ký tự đặc biệt (chẳng hạn như +,-,*, /, …) và chúng thực hiện các phép biến đổi trên một, hai hoặc ba tốn hạng. Trong C# có các loại tốn tử sau:
- Tốn tử số học - được sử dụng để thực hiện các phép toán số học đơn giản. - Toán tử gán - cho phép gán giá trị cho các biến.
- Toán tử so sánh - cho phép so sánh hai hằng hoặc biến.
- Toán tử logic - toán tử hoạt động với các kiểu dữ liệu Boolean và các biểu thức Boolean.
- Toán tử nhị phân - được sử dụng để thực hiện các thao tác trên biểu diễn nhị phân của dữ liệu số.
- Toán tử chuyển đổi kiểu - cho phép chuyển đổi dữ liệu từ loại này sang loại khác.
3.1.1. TỐN TỬ SỐ HỌC
Tốn tử Ký hiệu Cú
pháp
Kết quả
Cộng(addition) + x+y Cộng x với y
Trừ(substraction) - x-y Trừ x cho y
Nhân(multiplication) * x*y Nhân x với y
Chia(division) / x/y -Chia x cho y nếu x, y là số thực -Lấy phần nguyên phép chia x/y nếu x, y là số nguyên
Lấy phần dư (remainder) % x%y Lấy phần dư phép chia x/y nếu x, y là số nguyên
Tăng trước(preIncrement) ++ ++x Tăng x 1 đơn vị trước khi dùng Tăng sau(posIncrement) ++ x++ Tăng x 1 đơn vị sau khi dùng Giảm trước(preDecrement) -- --x Giảm x 1 đơn vị trước khi dùng Giảm sau(posIncrement) -- x-- Giảm x 1 đơn vị sau khi dùng
Tài liệu giảng dạy Th p T nh 1 Trang 35
Ví dụ:
class ToanTuSoHoc
{
static void Main() {
//khai bao bien int a = 5; int b = 4;
//in ket qua
Console.WriteLine("a + b = " + (a + b)); Console.WriteLine("a = " + a); Console.WriteLine("b = " + b); Console.WriteLine("a + (b++) = " + (a + (b++))); Console.WriteLine("a = " + a); Console.WriteLine("b = " + b); Console.WriteLine("a + (++b) = " + (a + (++b))); Console.WriteLine("a = " + a); Console.WriteLine("b = " + b); a--; Console.WriteLine("a = " + a); Console.WriteLine("b = " + b); Console.WriteLine("b / a = "+ (b / a)); Console.WriteLine("b % a = " + (b % a)); } } Kết quả:
Tài liệu giảng dạy Th p T nh 1 Trang 36
3.1.2.TỐN TỬ LUẬN LÝ
Ví dụ:
class ToanTuLogic
{
static void Main() {
//khai bao bien bool a = true; bool b = false; //in ket qua
Console.WriteLine("a = " + a); Console.WriteLine("b = " + b);
Console.WriteLine("a && b = "+ (a && b)); Console.WriteLine("a || b = " + (a || b)); Console.WriteLine("!b = " + !b);
Console.WriteLine("b || true = " + (b || true)); Console.WriteLine("(5 > 7) ^ (a == b)" + ((5 > 7) ^ (a == b))); }
}
Kết quả:
Toán tử Ký hiệu Cú pháp Kết quả
Not ! !x true nếu x=false, và ngược lại
And && x && y true nếu x và y = true, và false khi x hoặc y false
Or || x || y true nếu x hoặc y true, và false khi tất cả x, y cùng false
exclusive OR
^ x^y true nếu x và y khác nhau, và false khi x, y giống nhau
Tài liệu giảng dạy Th p T nh 1 Trang 37
3.1.3. TỐN TỬ NỐI CHUỖI
Ví dụ:
class ToanTuConcatenation {
static void Main() {
//khai bao bien string csharp = "C#"; string dotnet = ".NET"; //in ket qua
string csharpDotNet = csharp + dotnet; Console.WriteLine(csharpDotNet);
string csharpDotNet4 = csharpDotNet + " " + 5; Console.WriteLine(csharpDotNet4); } } Kết quả: 3.1.4. TOÁN TỬ BIT x y ~x x & y x | y x ^ y 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 Ví dụ: class ToanTuBitwise
Tài liệu giảng dạy Th p T nh 1 Trang 38
{
static void Main() {
//khai bao bien
byte a = 3; // 0000 0011 = 3 byte b = 5; // 0000 0101 = 5 //in ket qua
Console.WriteLine("a = " + a); Console.WriteLine("b = " + b);
Console.WriteLine("a | b = " + (a | b)); // 0000 0111 = 7 Console.WriteLine("a & b = " + (a & b)); // 0000 0001 = 1 Console.WriteLine("a ^ b = " + (a ^ b)); // 0000 0110 = 6 Console.WriteLine("~a & b = " + (~a & b)); // 0000 0100 = 4 Console.WriteLine("a << 1 = " + (a << 1)); // 0000 0110 = 6 Console.WriteLine("a << 2 = " + (a << 2)); // 0000 1100 = 12 Console.WriteLine("a >> 1 = " + (a >> 1)); // 0000 0001 = 1 } } Kết quả: 3.1.5. TOÁN TỬ SO SÁNH Ví dụ: class ToanTuComparison {
static void Main() {
Toán tử Ký hiệu Cú pháp Kết quả
Greater than > x > y True nếu x>y, và ngược lại Greater than or equal >= x >= y True nếu x>=y, và ngược lại Less than < x < y True nếu x<y, và ngược lại Less than or equal <= x <= y True nếu x<=y, và ngược lại
Equal == x == y True nếu x==y, và ngược lại
Tài liệu giảng dạy Th p T nh 1 Trang 39
//khai bao bien int x = 10; int y = 5; //in ket qua
Console.WriteLine("x > y : " + (x > y)); Console.WriteLine("x < y : " + (x < y)); Console.WriteLine("x >= y : " + (x >= y)); Console.WriteLine("x <= y : " + (x <= y)); Console.WriteLine("x == y : " + (x == y)); Console.WriteLine("x != y : " + (x != y)); } } Kết quả 3.1.6. TOÁN TỬ GÁN Ví dụ: class ToanTuAssignment {
static void Main() {
//khai bao bien int x = 5;
//in ket qua
Console.WriteLine("x = " + x); Console.WriteLine("x *= 2, x = " + (x *= 2)); Console.WriteLine("x /= 3, x = " + (x /= 3)); Console.WriteLine("x += 14, x = " + (x += 14)); Console.WriteLine("x -= 3, x = " + (x -= 3)); Console.WriteLine("x %= 3, x = " + (x %= 3)); } }
Toán tử Ký hiệu Cú pháp Kết quả
Gán bằng = x=y Gán y cho x, sao chép trị của y
cho biến x Gán hợp(compound
assignment)
O= x O= y x = x O y, O là các toán tử +, - , *, /, %, …
Tài liệu giảng dạy Th p T nh 1 Trang 40
Kết quả
3.1.7.TOÁN TỬ ĐIỀU KIỆN ? :
Cú pháp:
Biểu thức logic ? Kết quả 1 : Kết quả 2 ; Biểu thức logic: cho kết quả True/ False Kết quả 1, kết quả 2 phải cùng kiểu dữ liệu
Ý nghĩa: Nếu biểu thức logic = True, phép toán trả Kết quả 1, ngược lại nếu biểu thức logic = False trả Kết quả 2.
Ví dụ:
class ToanTuConditional
{
static void Main() {
//khai bao bien int a = 6; int b = 4; //in ket qua
Console.WriteLine("a = " + a); Console.WriteLine("b = " + b);
Console.WriteLine(a > b ? "a > b " : " b <= a"); }
}
Kết quả:
3.1.8.ĐỘ ƯU TIÊN CỦA CÁC TỐN TỬ
Loại tốn tử Toán tử Độ ư iên
Ưu tiên () 1
Tài liệu giảng dạy Th p T nh 1 Trang 41
Hai ngôi
* , / , % 3
+, - 4
Độ ưu tiên nhỏ thực hiện trước, lớn thực hiện sau.
3.2| CÁC TỐN TỬ KHÁC
Tốn tử “.” (do ) được sử dụng truy cập các thành viên, phương thức của lớp hoặc
đối tượng.
Toán tử as được sử dụng để chuyển đổi kiểu nhưng chuyển đổi không hợp lệ trả
về null.
Toán tử new được sử dụng khởi tạo đối tượng mới.
Toán tử is được sử dụng để kiểm tra một đối tượng có tương thích với một kiểu
nhất định khơng. Tốn tử ??
Cú pháp: Toán hạng 1 ?? toán hạng 2;
Ý nghĩa: trả kết quả là toán hạng 1 nếu toán hạng 1 khác null, ngược lại trả kết quả là toán hạng 2.
Ví dụ:
class OtherOperators
{
static void Main() {
//khai bao bien string s = "Beer";
string notNullString = s; string nullString = null; //in ket qua
Console.WriteLine("s = " + s);
Console.WriteLine("notNullString = " + notNullString); Console.WriteLine("nullString = " + nullString);
Console.WriteLine("s is string" + s is string); Console.WriteLine("nullString ?? " + "Unspecified = "
+ (nullString ?? Unspecified")); Console.WriteLine("notNullString ?? "+ "Specified = "
+ (notNullString ?? "Specified")); Console.WriteLine("ngay gio hien tai la: " + DateTime.Now);
} }
Tài liệu giảng dạy Th p T nh 1 Trang 42
3.3| CHUYỂN ĐỔI CÁC KIỂU DỮ LIỆU
Những đối tượng của một kiểu dữ liệu này có thể được chuyển sang những đối tượng của một kiểu dữ liệu khác thông qua cơ chế chuyển đổi tường minh hay ngầm định. Chuyển đổi ngầm định được thực hiện một cách tự động, trình biên dịch sẽ thực hiện cơng việc này. Cịn chuyển đổi tường minh diễn ra khi gán ép một giá trị cho kiểu dữ liệu khác.
Việc chuyển đổi giá trị ngầm định được thực hiện một cách tự động và đảm bảo là không mất thơng tin. Ví dụ, có thể gán ngầm định một số kiểu short (2 byte) vào một số kiểu int (4 byte) một cách ngầm định. Sau khi gán hồn tồn khơng mất dữ liệu vì bất cứ giá trị nào của short cũng thuộc về int
short x = 10;
int y = x; // chuyển đổi ngầm định
Tuy nhiên, nếu chuyển đổi ngược lại, chắc chắn sẽ bị mất thông tin. Nếu giá trị của số nguyên đó lớn hơn 32.767 thì nó sẽ bị cắt khi chuyển đổi. Trình biên dịch sẽ không thực hiện việc chuyển đổi ngầm định từ số kiểu int sang số kiểu short:
Tài liệu giảng dạy Th p T nh 1 Trang 43
Lỗi:
Để không bị lỗi phải dùng lệnh gán tường minh, đoạn mã trên được viết lại như sau:
Kết quả:
Trong C # khơng phải tất cả các kiểu có thể được chuyển đổi sang tất cả các kiểu khác, mà chỉ với một số trong số chúng. Chuyển đổi kiểu trong C # bao gồm ba loại:
- Chuyển đổi ngầm định - Chuyển đổi tường minh
- Chuyển đổi sang chuỗi hoặc từ chuỗi
3.3.1.CHUYỂN ĐỔI NGẦM ĐỊNH
Chuyển đổi kiểu ngầm định chỉ có thể thực hiện khi khơng có nguy cơ mất dữ liệu trong quá trình chuyển đổi, tức là khi chuyển đổi từ kiểu có phạm vi thấp hơn sang phạm vi lớn hơn (ví dụ: từ int sang long). Để thực hiện chuyển đổi kiểu ngầm định, khơng cần thiết phải sử dụng bất kỳ tốn tử nào và do đó chuyển đổi đó được gọi là
Tài liệu giảng dạy Th p T nh 1 Trang 44
ẩn. Việc chuyển đổi ngầm định được trình biên dịch thực hiện tự động khi gán một giá trị có phạm vi thấp hơn cho một biến có phạm vi lớn hơn hoặc nếu biểu thức có một số kiểu với các phạm vi khác nhau. Trong trường hợp đó, việc chuyển đổi được thực hiện thành kiểu có phạm vi cao nhất.
Ví dụ:
Kết quả:
Trong ví dụ trên, Num2 đã được chuyển đổi ngầm từ int sang long.
Một số chuyển đổi ngầm định có thể có của các kiểu dữ liệu nguyên thủy trong C #:
sbyte → short, int, long, float, double, decimal;
byte → short, ushort, int, uint, long, ulong, float, double, decimal; short → int, long, float, double, decimal;
Tài liệu giảng dạy Th p T nh 1 Trang 45
char → ushort, int, uint, long, ulong, float, double, decimal ( char là một kiểu ký tự trong một số trường hợp, nó có thể được coi là một số và có các hành vi của số, nó thậm chí có thể tham gia vào các biểu thức số);
uint → long, ulong, float, double, decimal; int → long, float, double, decimal;
long → float, double, decimal; ulong → float, double, decimal; float → double.
Khơng có mất dữ liệu khi chuyển đổi các kiểu phạm vi nhỏ hơn sang các kiểu có phạm vi lớn hơn. Giá trị số vẫn giữ nguyên sau khi chuyển đổi. Có một vài trường hợp ngoại lệ. Khi chuyển đổi kiểu int thành kiểu float (giá trị 32 bit), điểm khác biệt là int sử dụng tất cả các bit cho tồn bộ số, trong khi float có một phần bit được sử dụng để biểu diễn một phần phân số. Do đó, có thể mất độ chính xác là do làm tròn khi chuyển đổi từ int sang float được thực hiện. Điều tương tự cũng áp dụng cho việc chuyển đổi từ long sang
3.3.2.CHUYỂN ĐỔI TƯỜNG MINH
Chuyển đổi kiểu tường minh được sử dụng bất cứ khi nào có khả năng mất dữ liệu. Khi chuyển đổi loại dấu phẩy động sang loại số ngun, ln có sự mất dữ liệu từ việc loại bỏ phần thập phân (ví dụ: double thành long).
Để thực hiện chuyển đổi tường minh, cần phải sử dụng toán tử để chuyển đổi dữ liệu (type).
Có thể xảy ra mất dữ liệu khi chuyển đổi một loại có phạm vi lớn hơn thành loại với loại có phạm vi hẹp hơn (double,long thành int).
Tài liệu giảng dạy Th p T nh 1 Trang 46
Kết quả:
Trong ví dụ trên từ double ép kiểu sang long bị mất giá trị phần thập phân; ép kiểu từ double sang int bị mất giá trị.
Toán tử chuyển đổi kiểu cũng có thể được sử dụng trong trường hợp chuyển đổi ngầm định có chủ ý. Điều này góp phần vào khả năng đọc code, giảm khả năng xảy ra lỗi và nó được coi là thơng lệ tốt.
Thay vì nhận kết quả sai khi tràn dữ liệu khi chuyển từ kiểu lớn hơn sang kiểu nhỏ hơn, để nhận thông báo về vấn đề này sử dụng từ khóa được checked như sau:
Tài liệu giảng dạy Th p T nh 1 Trang 47
Kết quả:
Trong quá trình thực thi đoạn code trên một ngoại lệ (thông báo lỗi) OverflowException được nêu ra.
3.3.3.CHUYỂN ĐỔI THÀNH KIỂU STRING
Có thể chuyển đổi bất kỳ loại dữ liệu nào, bao gồm giá trị null thành chuỗi. Việc chuyển đổi chuỗi được thực hiện bằng các cách sau:
3.3.3.1| Sử dụng toán tử ghép chuỗi “+”
Tài liệu giảng dạy Th p T nh 1 Trang 48
Kết quả:
3.3.3.2| Sử dụng toString:
Tài liệu giảng dạy Th p T nh 1 Trang 49
Kết quả:
3.3.4.CHUYỂN ĐỔI TỪ STRING SANG CÁC KIỂU KHÁC
3.3.4.1| Sử dụng Convert
C# cung cấp các phương thức chuyển kiểu sau:
Phương thức Miêu tả
ToBoolean Chuyển đổi một kiểu thành một giá trị Boolean, nếu có thể
ToByte Chuyển đổi một kiểu thành một byte
ToChar Chuyển đổi một kiểu thành một Unicode character, nếu có thể
ToDateTime Chuyển đổi một kiểu (kiểu integer hoặc string) thành các cấu trúc date-
time
Tài liệu giảng dạy Th p T nh 1 Trang 50
ToDouble Chuyển đổi một kiểu thành một kiểu double
ToInt16 Chuyển đổi một kiểu thành một 16-bit integer
ToInt32 Chuyển đổi một kiểu thành một 32-bit integer
ToInt64 Chuyển đổi một kiểu thành một 64-bit integer
ToSbyte Chuyển đổi một kiểu thành một kiểu signed byte
ToSingle Chuyển đổi một kiểu thành một số small floating point
ToString Chuyển đổi một kiểu thành một string
ToType Chuyển đổi một kiểu thành một kiểu đã xác định
ToUInt16 Chuyển đổi một kiểu thành một kiểu unsigned int
ToUInt32 Chuyển đổi một kiểu thành một kiểu unsigned long
ToUInt64 Chuyển đổi một kiểu thành một unsigned big integer
Ví dụ:
Tài liệu giảng dạy Th p T nh 1 Trang 51
3.3.4.2| Sử dụng Parse
Ví dụ:
Kết quả:
Trong trường hợp đối số của Parse là rỗng, không đúng định dạng hoặc vượt quá giá trị cho phép thì sẽ nhận được các Exception tương ứng ví dụ khi chạy chương trình trên, nhập giờ là “an” sẽ phát sinh exception sau
Tài liệu giảng dạy Th p T nh 1 Trang 52
3.3.4.3| Sử dụng TryParse
TryParse là phương thức được tích hợp sẵn trong các lớp kiểu dữ liệu cơ bản của
C#. Cú pháp của TryParse được viết như sau:
TryParse( chuỗi chuyển đổi, out tên biến nhận giá trị); Ví dụ:
Tài liệu giảng dạy Th p T nh 1 Trang 53
Trong trường hợp đối số của TryParse là rỗng, không đúng định dạng hoặc vượt quá giá trị cho phép thì TryPart sẽ trả kết quả false.
Ví dụ nhập giờ là “an” chương trình sẽ cho kết quả sau
3.4| BIỂU THỨC
Biểu thức là một sự kết hợp giữa các toán tử (operator) và các toán hạng (operand) theo đúng một trật tự nhất định.
Mỗi tốn hạng có thể là một hằng, một biến hoặc một biểu thức khác.
Trong trường hợp, biểu thức có nhiều tốn tử, ta dùng cặp dấu ngoặc đơn () để chỉ định tốn tử nào được thực hiện trước.
Ví dụ:
Biểu thức nghiệm của phương trình bậc hai: X1 = (-b + sqrt(delta))/(2*a)
Trong đó 2 là hằng; a, b, Delta là biến.
3.5| CÂU LỆNH NHẬP, XUẤT
Lớp System.Console gồm các thuộc tính và phương thức khác nhau được sử dụng để đọc và hiển thị văn bản trên console. Trong số đó có ba phương thức liên quan đến việc nhập và hiển thị dữ liệu, đó là:
Console.Out ghi dữ liệu lên console Console.In đọc dữ liệu từ console Console.Error thông báo lỗi tương ứng.
CONSOLE.OUT STREAM 3.5.1|
Ghi dữ liệu lên console Cú pháp 1:
Tài liệu giảng dạy Th p T nh 1 Trang 54
Console.WriteLine(…);
Ý nghĩa: In nội dung trong () lên console, và sang dòng mới. Cú pháp 2:
Console.Write(…);
Ý nghĩa: In nội dung trong () lên console, và khơng sang dịng mới. Bên trong cặp dấu ():
Nếu là chuỗi đặt trong “”
Nếu là chuỗi và các đối tượng khác sử dụng toán tử “+” để ghép chuỗi Ví dụ:
class InChuoi
{
static void Main() {
//khai bao bien
string age = "twenty six";
//in ket qua
Console.WriteLine("He is " + age + " years old."); }
}
Kết quả:
Sử dụng chuỗi định dạng Cú pháp 3:
Console.Write(string format, object arg0,object arg1, object arg2, …); Cú pháp 4:
Console.Writeline(string format, object arg0,object arg1, object arg2, …); Ví dụ:
class InChuoi2
{
static void Main() {
//khai bao bien string name = "John"; int age = 18;
Tài liệu giảng dạy Th p T nh 1 Trang 55