Արտահայտություններ

!!! Այս գլուխը վերանվանել «Գործողություններ» ?? !!!

Նախորդ գլուխներում արդեն տեսանք, որ C++ լեզուն թույլ է տալիս գործողությունների օգնությամբ իրար կապել փոփոխականները, հաստատունները և ֆունկցիաների կանչերը՝ կազմելով մի որևէ արժեքի հաշվարկման շղթա։ Այդպիսի շղթային անվանում են արտահայտություն։ Օրինակ, երկրաչափությունից հիշենք կոսինուսների բանաձևը․ եթե տրված են եռանկյան և կողերը և նրանցով կազմված անկյունը, ապա եռանկյան երրորդ կողմը կարող ենք որոշել հետևյալ բանաձևով․

C++ լեզվով այս բանաձևը գրառվում է համարյա նույնությամբ, որտեղ օգտագործված են բազմապատկման *, գումարման +, հանման - գործողությունները, ինչպես նաև ստանդարտ գրադարանի cmath ֆայլում հայտարարված sqrt (քառակուսի արմատ) և cos ֆունկցիաները․

auto dist = sqrt(a * a + b * b - 2 * a * b * cos(phi));

Թվաբանական արտահայտություններ կազմելու համար C++ լեզվում, բացի վերը նշվածներից, կան նաև բաժանման /, մնացորդի որոշման % երկտեղանի (բինար) գործողությունները։ Իսկ ամբողջաթիվ փոփոխականի արժեքը մեկով ավելացնելու կամ պակասեցնելու համար առկա են համապատասխանաբար ++ և -- մեկտեղանի (ունար) գործողությունները։ Սրանք կարող են կիրառվել ինչպես նախածանցային (prefix), այնպես էլ ետածանցային (postfix) գրառումներով։ Օրինակ․ !!! Արժե՞ կենտրոնանալ սրանց վրա։ !!

int x = 12;
++x;
std::cout << x;  // կարտածվի 13
x--;
std::cout << x;  // կարտածվի 13

Նախածանցային և ետածանցային կիրառությունների տարբերությունը նրանումն է, որ դրանցից առաջինը վերադարձնում է փոփոխականի արդեն փոփոխված արժեքը, իսկ երկրորդը՝ նախկին արժեքը։ Օրինակ, հետևյալ կոդի կատարումից հետո k֊ն կդառնա 7 և e֊ն կստանա այդ նոր արժեքը․

int k = 6;
int e = ++k;  // k = 7, e = 7

Մյուս դեպքում, թեև k֊ն նորից ստանում է 7 արժեքը, բայց ++ գործողությունը վերադարձնում է նրա հին՝ 6 արժեքը։

int k = 6;
int e = k++;  // k = 7, e = 6

Համեմատման արտահայտություններ կազմելու համար C++ լեզվում առկա են բոլոր վեց գործողությունները․ հավասար է՝ ==, հավասար չէ՝ !=, մեծ է՝ >, մեծ է կամ հավասար՝ >=, փոքր է՝ < և փոքր է կամ հավասար՝ <=։ Սրանք բոլորն էլ վերադարձնում են բուլյան (bool) արժեք։ Օրինակ, հետևյալ վերագրման աջ կողմի արտահայտությունը հաշվարկվում է true արժեքի, եթե կետը գտնվում է երկրորդ կոորդինատական քառորդում։

bool c0 = x0 < 0 && y0 >= 0;

Այստեղ օգտագործված && գործողությունը կոնյունկցիան է՝ տրամաբանական ԵՎ֊ը։ Տրամաբանական արժեքների հետ թույլատրելի են նաև դիզյունկցիայի՝ ԿԱՄ և ժխտման՝ ՈՉ գործողությունները, որոնք գրառվում են համապատասխանաբար || և ! սիմվոլներով։ Ենթադրենք, օրինակ, տրված են a, b և c իրական թվերը և պահանջվում է պարզել, թե արդյո՞ք դրանք կարող են լինել ուղղանկյուն եռանկյան կողմեր։ Այլ կերպ ասած, պետք է ստուգել Պյութագորասի թեորեմի երեք հնարավոր դեպքերը․

bool pythagorean_triple( double a, double b, double c )
{
  bool c0 = a * a == b * b + c * c;
  bool c1 = b * b == a * a + c * c;
  bool c2 = c * c == b * b + a * a;

  return c0 || c1 || c2;
}

Այս իրականացումը թեև ընթեռնելի է, սակայն դիզյունկցիայի օգտագործման տեսակետից այնքան էլ գրագետ չէ։ Բանն այն է, որ || օպերատորն իր աջ արգումենտը հաշվում է միայն այն ժամանակ, երբ ձախ արգումենտի հաշվարկման արդյունքում ստացել է false արժեք։ Այսինքն, եթե , , ..., արտահայտություններն իրար են կապված || օպերատորով, ապա ոչ թե հաշվվում են բոլոր արտահայտությունները և հետո հաշվվում է դրանց դիզյունկցիան, այլ հաշվարկը կանգ է առնում այն առաջին ֊ի վրա, որի արդյունքը true է։

!! խմբագրել այս երկու պարբերությունները !!

Նման մոտեցում է ցուցաբերվում նաև կոնյունկցիայի && գործողության համար։ Որպեսզի արտահայտությունը հաշվարկվի true արժեքի, անհրաժեշտ է, որ նրանում մասնակցող բոլոր ֊երը հաշվարկվեն true արժեքի։ Այսինքն, եթե մի որևէ հաշվարկվել է false արժեքի, ապա շղթայի մյուս արտահայտությունները հաշվարկն անիմաստ է։

Բացի թվաբանական, համեմատման ու տրամաբանական գործողություններից C++ լեզուն առաջարկում է նաև բիթային գործողություններ․ &ԵՎ, |ԿԱՄ, ^Բացառող ԿԱՄ, և ~Լրացում։ Բոլոր այս գործողություններն աշխատում են իրենց արգումենտների առանձին բիթերի հետ։ Օրինակ, գիտենք, որ կենտ թվի երկուական ներկայացման վերջին բիթը միշտ 1 է։ Դա հաշվի առնելով կարող ենք գրել տրված ամբողջ թվի կենտ լինելը ստուգող isOdd ֆունկցիան։

bool isOdd( unsigned int num )
{
  return 1 == (num & 1);
}

Ինչպես նաև բիթերի տեղաշարժերի <<Ձախ տեղաշարժ և >>Աջ տեղաշարժ գործողությունները։

results matching ""

    No results matching ""