TOÁN TỬ

Toán t đưc kí hiu bng mt biu tưng dùng đ thc hin mt hành đng. Các kiu d liu cơ bn ca C# như kiu nguyên h tr rt nhiu các toán t như toán t gán, toán t toán hc, logic....

 

1.     Toán tử gán

Đến lúc này toán t gán khá quen thuc vi chúng ta, hu hết các chương trình minh ha t đu sách đu đã s dng phép gán. Toán t gán hay phép gán làm cho toán hng bên trái thay đi giá tr bng vi giá tr ca toán hng bên phi. Toán t gán là toán t hai ngôi. Đây là toán t đơn gin nht thông dng nht và cũng d s dng nht.

 

2.     Toán tử toán học

Ngôn ng C# cung cp năm toán t toán hc, bao gm bn toán t đu các phép toán cơ bn. Toán t cui cùng là toán t chia nguyên ly phn dư.

 

Các phép toán số học cơ bản (+,-,*,/)

Các phép toán này không th thiếu trong bt c ngôn ng lp trình nào, C# cũng không ngoi l, các phép toán s hc đơn gin nhưng rt cn thiết bao gm: phép cng (+), phép tr (-), phép nhân (*), phép chia (/) nguyên và không nguyên.

Khi chia hai s nguyên, thì C# s b phn phân s, hay b phn dư, tc là nếu ta chia 8/3 thì s đưc kết qu là 2 và s b phn dư là 2, do vy đ ly đưc phn dư này thì C# cung cp thêm toán t ly dư s đưc trình bày trong phn kế tiếp.

Tuy nhiên, khi chia cho s thc có kiu như float, double, hay decimal thì kết qu chia đưc tr v là mt s thc.

 

Phép toán chia lấy dư

 

Đ tìm phn dư ca phép chia nguyên, chúng ta s dng toán t chia ly dư (%). Ví d, câu lnh sau 8%3 thì kết qu tr v là 2 (đây là phn dư còn li ca phép chia nguyên). Tht s phép toán chia ly dư rt hu dng cho ngưi lp trình . Khi chúng ta thc hin mt phép chia dư n cho mt s khác, nếu s này là bi s ca n thì kết qu ca phép chia dư là 0. Ví d 20 % 5 = 0 vì 20 là mt bi s ca 5. Điu này cho phép chúng ta ng dng trong vòng lp, khi mun thc hin mt công vic nào đó cách khong n ln, ta ch cn kim tra phép chia dư n, nếu kết qu bng 0 thì thc hin công vic. Cách s dng này đã áp dng trong ví d minh ha s dng vòng lp for bên trên. Ví d sau minh ha s dng các phép toán chia trên các s nguyên, thc...

 

using System;

class Tester

{

public static void Main()

{

int i1, i2;

float f1, f2;

double d1, d2;

decimal dec1, dec2;

i1 = 17;

i2 = 4;

f1 = 17f;

f2 = 4f;

d1 = 17;

d2 = 4;

dec1 = 17;

dec2 = 4;

Console.WriteLine(“Integer:\t{0}”,i1/i2);

Console.WriteLine(“Float:\t{0}”,f1/f2);

Console.WriteLine(“Double:\t{0}”,d1/d2);

Console.WriteLine(“Decimal:\t{0}”,dec1/dec2);

Console.WriteLine(“\nModulus:\t{0}”, i1%i2);

}

}

-------------------------------------------------

Kết qu:

Integer: 4

float:                  4.25

double:                  4.25

decimal:                   4.25

Modulus: 1

-------------------------------------------------

Toán tử tăng và giảm

Khi s dng các biến s ta thưng có thao tác là cng mt giá tr vào biến, tr đi mt giá tr t biến đó, hay thc hin các tính toán thay đi giá tr ca biến sau đó gán giá tr mi va tính toán cho chính biến đó.

 

Tính toán và gán trở lại

Gi s chúng ta có mt biến tên Luong lưu giá tr lương ca mt ngưi, biến Luong này có giá tr hin thi là 1.500.000, sau đó đ tăng thêm 200.000 ta có th viết như sau:

Luong = Luong + 200.000;

 

Trong câu lnh trên phép cng đưc thc hin trưc, khi đó kết qu ca vế phi là 1.700.000 và kết qu này s đưc gán li cho biến Luong, cui cùng Luong có giá tr là 1.700.000. Chúng ta có th thc hin vic thay đi giá tr ri gán li cho biến vi bt k phép toán s hc nào:

 

Luong = Luong * 2;

Luong = Luong – 100.000;

...

 

Do vic tăng hay gim giá tr ca mt biến rt thưng xy ra trong khi tính toán nên C# cung cp các phép toán t gán (self- assignment). Bng sau lit kê các phép toán t gán.

Bảng 1.8. Mô tả các phép toán tự gán

Toán tử

Ý nghĩa

+=

Cộng thêm giá trị toán hạng bên phải vào giá trị toán hạng bên trái

-=

Toán hạng bên trái được trừ bớt đi một lượng bằng giá trị của toán hạng bên phải

*=

Toán hạng bên trái được nhân với một lượng bằng giá trị của toán hạng bên phải

/=

Toán hạng bên trái được chia với một lượng bằng giá trị của toán hạng bên phải

%=

Toán hạng bên trái được chia lấy dư với một lượng bằng giá trị của toán hạng bên phải

 

Da trên các phép toán t gán trong bng ta có th thay thế các lnh tăng gim lương như sau:

Luong += 200.000;

Luong *= 2;

Luong -= 100.000;

 

Kết qu ca lnh th nht là giá tr ca Luong s tăng thêm 200.000, lnh th hai s làm cho giá tr Luong nhân đôi tc là tăng gp 2 ln, và lnh cui cùng s tr bt 100.000 ca Luong. Do vic tăng hay gim 1 rt ph biến trong lp trình nên C# cung cp hai toán t đc bit là tăng mt (++) hay gim mt (--).

Khi đó mun tăng đi mt giá tr ca biến đếm trong vòng lp ta có th viết như sau:

bienDem++;

 

Toán tử tăng giảm tiền tố và tăng giảm hậu tố

 

Gi s mun kết hp các phép toán như gia tăng giá tr ca mt biến và gán giá tr ca biến cho biến th hai, ta viết như sau:

var1 = var2++;

 

Câu hi đưc đt ra là gán giá tr trưc khi cng hay gán giá tr sau khi đã cng. Hay nói cách khác giá tr ban đu ca biến var2 là 10, sau khi thc hin ta mun giá tr ca var1 là 10, var2 là 11, hay var1 là 11, var2 cũng 11?

 

Đ gii quyết yêu cu trên C# cung cp th t thc hin phép toán tăng/gim vi phép toán gán, th t này đưc gi là tin t (prefix) hay hu t (postfix). Do đó ta có th viết:

var1 = var2++; // Hu t

 

Khi lnh này đưc thc hin thì phép gán s đưc thc hin trưc tiên, sau đó mi đến phép toán tăng. Kết qu là var1 = 10 và var2 = 11. Còn đi vi trưng hp tin t:

var1 = ++var2;

 

Khi đó phép tăng s đưc thc hin trưc tc là giá tr ca biến var2 s là 11 và cui cùng phép gán đưc thc hin. Kết qu c hai biến var1 và var2 điu có giá tr là 11. Đ hiu rõ hơn v hai phép toán này chúng ta s xem ví d minh ha sau:

 

 

using System;

class Tester

{

static int Main()

{

int valueOne = 10;

int valueTwo;

valueTwo = valueOne++;

Console.WriteLine(“Thuc hien tang sau: {0}, {1}”, valueOne, valueTwo);

valueOne = 20;

valueTwo = ++valueOne;

Console.WriteLine(“Thuc hien tang truoc: {0}, {1}”, valueOne, valueTwo);

return 0;

}

}

-------------------------------------------------

Kết qu:

Thuc hien tang sau: 11, 10

Thuc hien tang truoc: 21, 21

-------------------------------------------------

 

Toán tử quan hệ

 

Nhng toán t quan h đưc dùng đ so sánh gia hai giá tr, và sau đó tr v kết qu là mt giá tr logic kiu bool (true hay false). Ví d toán t so sánh ln hơn (>) tr v giá tr là true nếu giá tr bên trái ca toán t ln hơn giá tr bên phi ca toán t. Do vy 5 > 2 tr v mt giá tr là true, trong khi 2 > 5 tr v giá tr false.

Các toán t quan h trong ngôn ng C# đưc trình bày bng 3.4 bên dưi. Các toán t trong bng đưc minh ha vi hai biến là value1 và value2, trong đó value1 có giá tr là 100 và value2 có giá tr là 50.

Bảng 1.9. Các toán tử so sánh (giả sử value1 = 100, và value2 = 50)

Tên toán tử

Kí hiệu

Biểu thức so sánh

Kết quả so sánh

So sánh bằng

==

value1 == 100

true

value1 == 50

false

Không bằng

!=

value2 != 100

false

value2 != 90

true

Lớn hơn

> 

value1 > value2

true

value2 > value1

false

Lớn hơn hay bằng

>=

value2 >= 50

true

Nhỏ hơn

< 

value1 < value2

false

value2 < value1

true

Nhỏ hơn hay bằng

<=

value1 <= value2

false

 

Như trong bng 1.9 trên ta lưu ý toán t so sánh bng (==), toán t này đưc ký hiu bi hai du bng (=) lin nhau và cùng trên mt hàng , không có bt k khong trng nào xut hin gia chúng. Trình biên dch C# xem hai du này như mt toán t.

 

Toán tử logic

Trong câu lnh if mà chúng ta đã tìm hiu trong phn trưc, thì khi điu kin là true thì biu thc bên trong if mi đưc thc hin. Đôi khi chúng ta mun kết hp nhiu điu kin vi nhau như: bt buc c hai hay nhiu điu kin phi đúng hoc ch cn mt trong các điu kin đúng là đ hoc không có điu kin nào đúng... C# cung cp mt tp hp các toán t logic đ phc v cho ngưi lp trình.

Bng 1.10 lit k ba phép toán logic, bng này cũng s dng hai biến minh ha là x, và y trong đó x có giá tr là 5 và y có giá tr là 7.

Bảng 1.10. Các toán tử logic (giả sử x = 5, y = 7)

Tên toán tử

Ký hiệu

Biểu thức logic

Giá trị

Logic

and

&&

(x == 3) && (y ==7)

false

Cả hai điều kiện phải đúng

or

||

(x == 3) || (y == 7)

true

Chỉ cần một điều kiện đúng

not

!

! (x == 3 )

true

Biểu thức trong ngoặc phải sai

 

Toán t and s kim tra c hai điu kin. Trong bng 1.10 trên có minh ha biu thc logic s dng toán t and:

(x == 3) && (y == 7)

 

Toàn b biu thc đưc xác đnh là sai vì có điu kin (x == 3) là sai.

Vi toán t or, thì mt hay c hai điu kin đúng thì đúng, biu thc s có giá tr là sai khi c hai điu kin sai. Do vy ta xem biu thc minh ha toán t or:

(x == 3) || (y == 7)

 

Biu thc này đưc xác đnh giá tr là đúng do có mt điu kin đúng là (y == 7) là đúng. Đi vi toán t not, biu thc s có giá tr đúng khi điu kin trong ngoc là sai, và ngưc li, do đó biu thc:

 

!( x == 3)

 

có giá tr là đúng vì điu kin trong ngoc tc là (x == 3) là sai.

Như chúng ta đã biết đi vi phép toán logic and thì ch cn mt điu kin trong biu thc sai là toàn b biu thc là sai, do vy tht là dư tha khi kim tra các điu kin còn li mt khi có mt điu kin đã sai. Gi s ta có đon chương trình sau:

 

int x = 8;

if ((x == 5) && (y == 10))

Khi đó biu thc if s đúng khi c hai biu thc con là (x == 5) và (y == 10) đúng. Tuy nhiên khi xét biu thc th nht do giá tr x là 8 nên biu thc (x == 5) là sai. Khi đó không cn thiết đ xác đnh giá tr ca biu thc còn li, tc là vi bt k giá tr nào ca biu thc (y==10) thì toàn b biu thc điu kin if vn sai.

Tương t vi biu thc logic or, khi xác đnh đưc mt biu thc con đúng thì không cn phi xác đnh các biu thc con còn li, vì toán t logic or ch cn mt điu kin đúng là đ:

int x =8;

if ( (x == 8) || (y == 10))

 

Khi kim tra biu thc (x == 8) có giá tr là đúng, thì không cn phi xác đnh giá tr ca biu thc (y == 10) na.

Ngôn ng lp trình C# s dng logic như chúng ta đã tho lun bên trên đ loi b các tính toán so sánh dư tha và cũng không logic na!

 

Độ ưu tiên toán tử

Trình biên dch phi xác đnh th t thc hin các toán t trong trưng hp mt biu thc có nhiu phép toán, gi s, có biu thc sau:

var1 = 5+7*3;

 

Biu thc trên có ba phép toán đ thc hin bao gm (=, +,*). Ta th xét các phép toán theo th t t trái sang phi, đu tiên là gán giá tr 5 cho biến var1, sau đó cng 7 vào 5 là 12 cui cùng là nhân vi 3, kết qu tr v là 36, điu này tht s có vn đ, không đúng vi mc đích yêu cu ca chúng ta. Do vy vic xây dng mt trình t x lý các toán t là hết sc cn thiết. Các lut v đ ưu tiên x lý s bo trình biên dch biết đưc toán t nào đưc thc hin trưc trong biu thc.Tương t như trong phép toán đi s thì phép nhân có đ ưu tiên thc hin trưc phép toán cng, do vy 5+7*3 cho kết qu là 26 đúng hơn kết qu 36. Và c hai phép toán cng và phép toán nhân điu có đ ưu tiên cao hơn phép gán. Như vy trình biên dch s thc hin các phép toán ri sau đó thc hin phép gán c cui cùng. Kết qu đúng ca câu lnh trên là biến var1 s nhn giá tr là 26.

 

Trong ngôn ng C#, du ngoc đưc s dng đ thay đi th t x lý, điu này cũng ging trong tính toán đi s. Khi đó mun kết qu 36 cho biến var1 có th viết:

var1 = (5+7) * 3;

 

Biu thc trong ngoc s đưc x lý trưc và sau khi có kết qu là 12 thì phép nhân đưc thc hin. Bng 1.11 Lit kê th t đ ưu tiên các phép toán.

Bảng 1.11. Thứ tự ưu tiên các toán tử

STT

Loại toán tử

Toán tử

Thứ tự

1

Phép toán cơ bản

(x)  x.y  f(x)  a[x]  x++  x-- new typeof sizeof checked unchecked

Trái

2

 

+ - ! ~ ++x --x (T)x

Trái

3

Phép nhân

* / %

Trái

4

Phép cộng

+ -

Trái

5

Dịch bit

<< >>

Trái

6

Quan hệ

< > <= >= is

Trái

7

So sánh bằng

== !=

Phải

8

Phép toán logic AND

&

Trái

9

Phép toán logic XOR

^

Trái

10

Phép toán logic OR

|

Trái

11

Điều kiện AND

&&

Trái

12

Điều kiện OR

||

Trái

13

Điều kiện

?:

Phải

14

Phép gán

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

Phải

Các phép toán đưc lit kê cùng loi s có th t theo mc th th ca bng: th t trái tc là đ ưu tiên ca các phép toán t bên trái sang, th t phi thì các phép toán có đ ưu tiên t bên phi qua trái. Các toán t khác loi thì có đ ưu tiên t trên xung dưi, do vy các toán t loi cơ bn s có đ ưu tiên cao nht và phép toán gán s có đ ưu tiên thp nht trong các toán t.

Toán tử ba ngôi

Hu hết các toán t đòi hi có mt toán hng như toán t (++, --) hay hai toán hng như (+,-,*,/,...). Tuy nhiên, C# còn cung cp thêm mt toán t có ba toán hng (?:). Toán t này có cú pháp s dng như sau:

 

<Biu thc điu kin > ? <Biu thc th 1> : <Biu thc th 2>

 

Toán t này s xác đnh giá tr ca mt biu thc điu kin, và biu thc điu kin này phi tr v mt giá tr kiu bool. Khi điu kin đúng thì <biu thc th 1> s đưc thc hin, còn ngưc li điu kin sai thì <biu thc th 2> s đưc thc hin. Có th din gii theo ngôn ng t nhiên thì toán t này có ý nghĩa : “Nếu điu kin đúng thì làm công vic th nht, còn ngưc li điu kin sai thì làm công vic th hai”. Cách s dng toán t ba ngôi này đưc minh ha trong ví d sau.

 

 

using System;

class Tester

{

public static int Main()

{

int value1;

int value2;

int maxValue;

value1 = 10;

value2 = 20;

maxValue = value1 > value2 ? value1 : value2; Console.WriteLine(“Gia tri thu nhat {0}, gia tri thu hai {1},

gia tri lon nhat {2}”, value1, value2, maxValue);

return 0;

}

}

-------------------------------------------------

Kết quả:

Gia tri thu nhat 10, gia tri thu hai 20, gia tri lon nhat 20

-------------------------------------------------

 

Trong ví d minh ha trên toán t ba ngôi đưc s dng đ kim tra xem giá tr ca value1 có ln hơn giá tr ca value2, nếu đúng thì tr v giá tr ca value1, tc là gán giá tr value1 cho biến maxValue, còn ngưc li thì gán giá tr value2 cho biến maxValue.