Loading...

Арифметикалык операторлор

    Java тилиндеги операциялардын көбү башка С сыяктуу тилдерде колдонулган операцияларга окшош. Унардык операциялар (бир операнд боюнча аткарылат), эки операнд боюнча экилик жана үч операнд боюнча үчтүк операциялар бар. Операнд – бул операцияга катышкан өзгөрмө же маани (мисалы, сан). Операциялардын бардык түрлөрүн карап көрөлү.

 

Сандар арифметикалык операцияларга катышат. Javaда бинардык арифметикалык амалдар (эки операндда аткарылат) жана унардык арифметикалык амалдар (бир операндда аткарылат). Бинардык операцияларга төмөнкүлөр кирет:

+ эки санды кошуу операциясы:

int a = 10;

int b = 7;

int c = a + b;  // 17

int d = 4 + b;  // 11

- эки санды кемитүү операциясы:

int a = 10;

int b = 7;

int c = a - b;  // 3

int d = 4 - a;  // -6

* эки санды көбөйтүү операциясы:

int a = 10;

int b = 7;

int c = a * b;  // 70

int d = b * 5;  // 35

/ эки санды бөлүү операциясы:

int a = 20;

int b = 5;

int c = a / b;  // 4

double d = 22.5 / 4.5;  // 5.0

Бөлүүдө, эгер операцияга эки бүтүн сан катышса, анда бөлүүнүн натыйжасы бүтүн санга чейин тегеректелерин эстен чыгарбоо керек, ал тургай, натыйжа float же double тибиндеги өзгөрмөгө дайындалса да:

double k = 10.0 / 4;     // 2.5

System.out.println(k);

эки санды бөлгөндөн кийин калдыкты алуу:

int a = 33;

int b = 5;

int c = a % b;  // 3

int d = 22 % 4; // 2 (22 - 4*5 = 2)

Ошондой эле бир санда аткарылуучу эки унардык арифметикалык амал бар: ++ (инкремент) жана -- (декремент). Ар бир операциянын эки түрү бар: префикс жана постфикс:

++ (префиксный инкремент)

Өзгөрмө бир көбөйөт деп болжолдойт, мисалы, z=++y (адегенде y өзгөрмөнүн мааниси 1ге көбөйөт, андан кийин анын мааниси z өзгөрмөсүнө дайындалат)

int a = 8;

int b = ++a;

System.out.println(a);  // 9

System.out.println(b);  // 9

 

++ (постфиксный инкремент)

Ошондой эле өзгөрмөнүн бирге көбөйүшүн билдирет, мисалы, z=y++ (адегенде y мааниси zге дайындалат, андан кийин y мааниси 1ге көбөйөт)

int a = 8;

int b = a++;

System.out.println(a);  // 9

System.out.println(b);  // 8

 

-- (префиксный декремент)

өзгөрмөнү бирге азайтуу, мисалы, z=--y (адегенде y өзгөрмөнүн мааниси 1ге азайтылат, андан кийин анын мааниси z өзгөрмөсүнө ыйгарылат)

int a = 8;

int b = --a;

System.out.println(a);  // 7

System.out.println(b);  // 7

 

-- (постфиксный декремент)

z=y-- (адегенде y zге дайындалат, андан кийин y 1ге азайтылат)

int a = 8;

int b = a--;

System.out.println(a);  // 7

System.out.println(b);  // 8

 

Арифметикалык амалдардын приоритети

Кээ бир операциялар башкаларга караганда жогорураак артыкчылыкка ээ жана ошондуктан биринчи аткарылат. Артыкчылыктын азаюу тартибинде операциялар:

 

++ (постфикстик инкремент), -- (постфикс декремент)

 

++ (префикстин инкремент), -- (префикстин декремент)

 

* (көбөйтүү), / (бөлүү), % (бөлүүнүн калдыгы)

 

+ (кошуу), - (кемитүү)

 

Арифметикалык туюнтмалардын жыйындысын аткарууда операциялардын артыкчылыктуулугун эске алуу керек:

int a = 8;

int b = 7;

int c = a + 5 * ++b;     

System.out.println(c);  // 48

Адегенде жогорураак артыкчылыкка ээ ++b көбөйтүү операциясы аткарылат - ал b өзгөрмөнүн маанисин жогорулатат жана аны натыйжа катары кайтарат. Андан кийин 5 * ++b көбөйтүлөт жана акыркы кошуу гана аткарылат a + 5 * ++b

 

кашаалар баалоо тартибин кайра аныктоого мүмкүндүк берет:

int a = 8;

int b = 7;

int c = (a + 5) * ++b;   

System.out.println(c);  // 104

Кошумча операциянын артыкчылыктуулугу төмөн болгонуна карабастан, бул кошуу операциясы кашаанын ичинде алынгандыктан, көбөйтүү эмес, биринчи аткарылат.

 

 

Операциялардын ассоциациясы

Артыкчылыктан тышкары, операциялар ассоциация сыяктуу түшүнүк менен айырмаланат. Операциялар бирдей артыкчылыкка ээ болгондо, баалоо тартиби операторлордун ассоциациясы менен аныкталат. Ассоциативдүүлүккө жараша операторлордун эки түрү бар:

 

Солдон оңго аткарылуучу сол ассоциативдик операторлор

 

Оңдон солго аткарган оң ассоциациялык операторлор

 

Мисалы, көбөйтүү жана бөлүү сыяктуу кээ бир операциялардын артыкчылыктары бирдей. Анда сөздүн натыйжасы кандай болот:

int x = 10 / 5 * 2;

Бул туюнтманы (10/5) * 2 же 10 / (5 * 2) деп чечмелешибиз керекпи? Анткени, чечмелөөгө жараша ар кандай жыйынтыктарды алабыз.

 

Бардык арифметикалык операторлор (префикстик инкремет жана декременттен башкасы) солдон ассоциативдик болуп саналат, башкача айтканда, алар солдон оңго аткарылат. Демек, 10/5 * 2 туюнтмасын (10/5) * 2 деп чечмелеш керек, башкача айтканда, натыйжа 4 болот.

 

Бүтүн эмес сандар менен операциялар

Белгилей кетчү нерсе, бүтүн эмес сандар каржылык жана башка эсептөөлөр үчүн ылайыктуу эмес, мында тегеректөө каталары олуттуу болушу мүмкүн. Мисалы:

double d = 2.0 - 1.1;

System.out.println(d);

Бул учурда, d өзгөрмөсү башында болжолдонгондой 0,9 эмес, 0,8999999999999999 болот. Бул тактык каталары бүтүн эмес сандар бинардык системада төмөн деңгээлде берилгендиктен пайда болот, бирок 0,1 үчүн, ошондой эле башка бөлчөк маанилер үчүн экилик көрсөтүү жок. Ошондуктан, мындай учурларда, адатта, BigDecimal классы колдонулат, бул мындай кырдаалдарды айланып өтүүгө мүмкүндүк берет.