Доделување на вредност (=)

Една променлива може, во различни временски периоди, да се користи за чување на различни вредности. Во C++, вредности на променливите им се доделуваат со примена на операторот '='. На пример, со изразот "prom=1000;" и се доделува вредност 1000 на променливата prom. Запаметете, во C++, доделувањето на вредности се извршува од десно на лево (вредноста која се наоѓа од десна страна на операторот '=' и се доделува на променливата која се наоѓа од лева страна на операторот). Обратното не важи - вредноста на променливата која се наоѓа од левата страна на операторот не влијание, на никаков начин, на вредноста на изразот кој се наоѓа од десната страна на операторот. На пример, со изразот "a=b;" на променливата a и ја доделуваме вредноста која до тој момент се наоѓала во променливата b. Променливата b си ја задржува својата вредност.

Многу важно е да забележиме дека со операторот '=' се врши доделување на вредност, а не поврзување на изразите кои се наоѓаат од двете страни на операторот. На пример, по извршување на операцијата за доделување на вредност "a=b;", променливите a и b, на ниту еден начин, не се поврзани една со друга. Евентуалната промена на вредноста на променливата b подолу во програмата нема да предизвика и промена на вредноста на променливата a:

Пример 1
 
 
#include <iostream>
using namespace std;
 
int main()
{
int a, b, c;
a = 100; //a=100 b=* c=*
b = 50; //a=100 b=50 c=*
c = 20; //a=100 b=50 c=20
a = b; //a=50 b=50 c=20
b = 30; //a=50 b=30 c=20
c = b; //a=50 b=30 c=30
a = b+c; //a=60 b=30 c=30
cout << "a=" << a << endl; //pechati 'a=60'
cout << "b=" << b << endl; //pechati 'b=30'
cout << "c=" << c << endl; //pechati 'c=30'
return 0;
}

Едно интересно својство на операторот за доделување на вредност '=' е што неговото извршување резултира со враќање на вредноста која се наоѓа од десната страна на изразот. На пример, по извршување на наредбата "a=b=c=10;" сите три променливи (a, b и c) ќе ја содржат вредноста 10 (c=10 враќа резултат 10; потоа b=c=10 враќа резултат 10). Ова својство може да се искористи и во многу посложени пресметки. На пример, наредбата "a=b+(c=10+5);" е еквивалентна (има ист ефект) со извршувањето на двете наредби "c=10+5;" и "a=b+c;" - наведени последователно. По извршување на наредбата "a=3+(c=10+5);", променливата c ќе содржи вредност 15 (c=10+5), додека a ќе содржи вредност 18 (a=3+15).

Пример 2
 
 
#include <iostream>
using namespace std;
 
int main()
{
int a, b, c;
a = b = c = 10; //a=10 b=10 c=10
a = a+5; //a=15 b=10 c=10
c = b + (a=10); //a=10 b=10 c=20
a = b = c = 0; //a=0 b=0 c=0
a = b = c+5; //a=5 b=5 c=0
a = b = (c=10); //a=10 b=10 c=10
cout << (a+b+c) << endl; //pechati '30'
return 0;
}


Аритметички оператори

Аритметичките оператори се користат за изведување на математичките операции.

Oператор

Опис

 

Пример

+

Собирање

 

x + y

-

Одземање

 

x - y

*

Множење

 

x * y

/

Делење

 

x / y

%

Остаток при делење

 

x % y

++

Инкремент

Зголемување на вредноста на променливата за 1

x ++
++x

- -

Декремент

Намалување на вредноста на променливата за 1

x --
--
x

 

Операциите собирање, одземање и множење го имаат стандардното математичко значење. Доколку операциите (важи за сите аритметички операции) се извршуваат врз операнди од ист тип, резултатот е операнд од истиот тој тип (доколку, во изразот "a+b", а и b се променливи од тип int, и резултатот ќе биде од тип int). Доколку, барем една од променливите е од тип на податок кој овозможува чување на вредности кои се децимални (реални) броеви, тогаш и резултатот ќе биде од тип кој овозможува чување на децимални броеви (доколку, во изразот "a+b", а е променлива од тип int, а b е променлива од тип double, тогаш резултатот ќе биде од тип double). Ова не важи за операторот '%' - тој може да се извршува само врз податоци кои се цели броеви.

Доколку двата податока се цели броеви, тогаш резултатот од извршување на операцијата делење (a/b) ќе биде цел број. На пример, 5/2 ќе врати вредност 2 (иако 5/2 e 2.5). Доколку барем еден од податоците е реален (децимален) број, резултатот од извршувањето на операцијата делење ќе биде реален (децимален) број. На пример, 5.8/2 ќе врати вредност 2.9 (бидејќи операндот 5.8 е реален број). Делење со 0 (или 0.0) не е дозволено.

Операторот '%' може да се примени само врз целобројни податоци. Резултатот од извршувањето на операцијата a%b е остатокот од делењето на бројот a со b. На пример, 10%3 е еднакво на 1 (10/3 e 3, со остатокот 1 - бидејќи 10=3*3 + 1), 25%7 е еднакво на 4 (25/7 е 3, со остаток 4 - бидејќи 25=7*3+4). Операторот '%' најчесто се користи при проверка на тоа дали еден цел број е делив со друг - во тој случај изразот a%b треба да е еднаков на 0 (бидејќи доколку b го дели а, нема да се појави остаток при нивното делење).

Следната програма го демонстрира ефектот на секој од аритметичките оператори споменати погоре:

Пример 3
 
 
#include <iostream>
using namespace std;
 
int main()
{
int a=1, b=2, c=3; //a=1 b=2 c=3
a=b+c; //a=5 b=2 c=3
a=c-b; //a=1 b=2 c=3
a=b*c; //a=6 b=2 c=3
b=10; //a=6 b=10 c=3
c=5; //a=6 b=10 c=5
a = b/c; //a=2 b=10 c=5
a = b%c; //a=0 b=10 c=5
b=8; //a=0 b=8 c=5
a = b/c; //a=1 b=8 c=5
a = b%c; //a=3 b=8 c=5
cout << a << endl; //pechati '3'
return 0;
}

 

Скратување на изрази (+=, -=, *=, /=, %=, ++, --)

Многу често, се појавува потреба од промена на вредноста на една променлива преку вршење на математичка операција врз истата таа променлива (a=a+5). C++ подржува 5 оператори (по еден оператор за секоја аритметичка операција) кои овозможуваат скратено пишување на горенаведениот тип на операции. На пример, наместо да пишуваме "а=а+5;" сега можеме да напишеме "a+=5;", наместо "a=a*5;" може да напишеме "a*=5;", наместо "a=a/b;" може да напишеме "a/=b;", итн. Следнава табела ги содржи сите потребни информации за овие оператори:

операција израз еквивалентно со
додади b на а a+=b; a = a+b;
одземи b од a a-=b; a = a-b;
помножи го a со b a*=b; a = a*b;
подели го a со b a/=b; a = a/b;
смести го остатокот од a/b во a a%=b; a = a%b;

Зголемувањето на вредност за 1 и намалувањето на вредност за 1 се, исто така, операции кои се извршуваат многу често. И овие операции, во C++, си имаат свој оператор преку кои се дефинирани (++ и --, соодветно). Всушност, постојат две верзии (prefix и postfix) за секој од овие два оператори (++ и --) - зависно од тоа дали операторот се наоѓа пред променливата (++x) или по променливата (x++):

операција израз значење
зголемување на вредност за 1 - postfix верзија x++ врати ја вредноста која се содржи во променливата x, па зголеми го x за 1
зголемување на вредност за 1 - prefix верзија ++x зголеми го x за 1, па врати ја вредноста која се содржи во променливата x
намалување на вредност за 1 - postfix верзија x-- врати ја вредноста која се содржи во променливата x, па намали го x за 1
намалување на вредност за 1 - prefix верзија --x намали го x за 1, па врати ја вредноста која се содржи во променливата x

За едноставни изрази како "x++;" двете верзии (prefix и postfix) ќе резултираат со зголемување/намалување (за 1) на вредноста која се чува во променливата x. Разликата се забележува во случаи кога резултатот од изразот се користи во некоја поголема наредба (како "y=x++;" и "y=++x;"). Во овој случај, двете верзии на операторите се однесуваат на различен начин: prefix верзијата ("y=++x;") прво ја зголемува вредноста на променливата (во случајов x) па го предава резултатот (зголемената вредност), додека postfix верзијата ("y=x++;") создава копија од вредноста на променливата x, ја предава привремената вредност, па дури потоа ја зголемува вредноста на x. На пример, доколку x=5 и ја извршиме наредбата "y=++x;", по извршување на наредбата вредноста на x ќе биде 6 и вредноста на y ќе биде 6 - прво се зголемува x, па потоа се испраќа нејзината "зголемена" вредност. Од друга страна, доколку x=5 и ја извршиме наредбата "y=x++;", вредноста на x ќе биде 6, но вредноста на y ќе биде 5 - најпрвин се прави привремена копија од вредноста на x и таа вредност се доделува на y, па дури потоа се зголемува x. Следнава програма го демонстрира ефектот на неколку оператори споменати во овој дел:

Пример 4
 
 
#include <iostream>
using namespace std;
 
int main()
{
int a=10, b=15, c=20; //a=10 b=15 c=20
a+=b; //a=25 b=15 c=20
a+=b; //a=40 b=15 c=20
a+=b; //a=55 b=15 c=20
a-=c; //a=35 b=15 c=20
b*=c; //a=35 b=300 c=20
a+=(b+c); //a=355 b=300 c=20
b+=b; //a=355 b=600 c=20
c++; //a=355 b=600 c=21
c--; //a=355 b=600 c=20
a = c++; //a=20 b=600 c=21
a = c--; //a=21 b=600 c=20
a = ++c; //a=21 b=600 c=21
cout << a << " " << b << " " << c << endl; //pechati '21 600 21'
//pred izvrshuvanje a=21 b=600 c=21
cout << a++ << " " << b-- << " " << c++ << endl; //pechati '21 600 21'
//po izvrshuvanje a=22 b=599 c=22
//pred izvrshuvanje a=22 b=599 c=22
cout << ++a << " " << --b << " " << ++c << endl; //pechati '23 598 23'
//po izvrshuvanje a=23 b=598 c=23
return 0;
}

Споредбени (релациони) оператори

Споредбените оператори се користат за споредба на две вредности.

 

Оператор

 Опис

Пример

= =

Еднакво

x == y

!=

Различно

x != y

> 

Поголемо

x > y

< 

Помало

x < y

>=

Поголемо еднакво

x >= y

<=

Помало еднакво

x <= y

 


Забелешка: Резултатот на споредбените искази е  bool вредност true (вистина – 1)  или false (лага  - 0).
Во следниот пример е искористен операторот поголемо (
>) за да најде дека 5 е поголемо од 3:

int x = 5;
int y = 3;
cout << (x > y);
// враќа 1 (true) зошто 5 е поголемо од  3

Забележете ја разликата помеѓу операторите '=' и '==': операторот '=' служи за доделување на вредност на променлива, додека операторот '==' служи за споредување на два изрази (изразот кој се наоѓа од неговата лева страна и изразот кој се наоѓа од неговата десна страна). Следнава програма го илустрира начинот на користење на релациските оператори:

Пример 5
 
 
#include <iostream>
using namespace std;
 
int main()
{
bool result;
int a = 5, b = 8;
result = (a == b); //result = false
result = (a != b); //result = true
result = (a < b); //result = true
result = (a <= b); //result = true
result = (a > b); //result = false
result = (a >= b); //result = false
//VNIMAVAJTE: '=' NASPROTI '=='
result = ((a=8) == b); //result = true
cout << a << " " << b << endl; //pechati '8 8'
return 0;
}


Логички оператори

Oператор

Опис

Пример

&&

Логичко and / и

Дава резултат вистина ако двата искази се вистина

x < 5 &&  x < 10

||

Логичко or / или

Дава резултат вистина ако еден од исказите е вистина

x < 5 || x < 4

!

Логичко not / не

Негација, дава false ако е true и обратно

!(x < 5 && x < 10)

 

 Постојат 3 логички оператори во C++: операторот за негација '!', операторот за логичко И (AND) '&&' и операторот за логичко ИЛИ (OR) '||'. Операторот за негација служи за негирање на bool вредност: доколку x=true, тогаш !x ќе врати false и обратно, доколку x=false тогаш !x ќе врати true. Операторот '&&' (логичко И) враќа true ако и само ако двата операнди (a и b) над кои се извршува операцијата (a&&b) имаат вредност true, во спротивно резултатот е false. Операторот '||' (логичко ИЛИ) враќа true ако кој било од двата операнди (a и b) над кои се извршува операцијата (a||b) има вредност true. Логичките оператори И и ИЛИ ('&&' и '||') се слични како операторите '&' и '|', но се извршуваат врз bool вредности (не врз сите битови од една целобројна променлива).

Важно е да се наведе дека C++ ги врши само споредбите кои се задолжителни (т.н. short-circuit пресметување): доколку имаме израз од типот "a && b && c", и a има вредност false, каква и да е вредноста на b и c, изразот повторно ќе има вредност false (бидејќи, кај логичко И, изразот е true само ако сите операнди се true). Кај логичко ИЛИ важи обратното - ако еден од операндите е true, тогаш целиот израз е true (нема потреба да се проверува остатокот од изразот). Следнава програма го прикажува ефектот на логичките оператори:

Пример 6
 
 
#include <iostream>
using namespace std;
 
int main()
{
bool result;
bool b1 = true, b2 = false;
result = !b1; //result = false
result = !b2; //result = true
result = !(b1); //result = false
result = !(!b1); //result = true
result = b1 && b2; //result = false
result = b1 || b2; //result = true
result = (5 > 3); //result = true
result = !(5 > 3); //result = false
result = (5>3) && (7>=7); //result = true
result = (2>3) || (1>2) || (4>=5); //result = false
int z = 0;
result = (1>2) && (++z == 1);
cout << "z=" << z << endl; //pechati 'z=0'
result = (1>2) || (++z == 1);
cout << "z=" << z << endl; //pechati 'z=1'
return 0;
}