• Изрази в С++ . Приоритет на действията в изразите
Изразите в С++ могат да съдържат операнди: /стойности, константи, променливи, обръщане към функция/ , знаци за действия и скоби / кръгли и квадратни/.
Начинът на изчисляването на израза зависи от приоритета на действията и от т. нар. асоциативни правила. Разгледаните до момента действия се характеризират със следния строго определен приоритет:
Таблица 3.
приоритет
действия
асоциативно правило
най-висок най-нисък
( ) [ ]
! - ++ -- * & (тип)операнд / унарни/
* / %
+ -
<< >>
< > <= >=
= = !=
&&
||
? :
= += -+ *= /= %=
,
отляво надясно
отдясно наляво
отляво надясно
отляво надясно
отляво надясно
отляво надясно
отляво надясно
отляво надясно
отляво надясно
отляво надясно
отдясно наляво
отляво надясно
Действията, разположени на един ред, са с еднакъв приоритет. Те се изпълняват в изразите според съответното асоциативно правило.
Някои знаци се използват за означаване на различни действия. Така знакът * може да означава бинарното действие умножение или унарно действие за извличане на стойност чрез указател. Знакът - /минус/ може да означава бинарно или унарно действие. Знаците << и >> означават бинарните действията за побитово изместване. В езика С++ тези действията са предефинирани за извършване на входни / >> / и изходни / << / операции.
Всеки израз се изчислява като се започне с действието с най-висок приоритет. Както в математиката, с най-висок приоритет са скобите. С тях може да се зададе желан приоритет на изчисление.
Унарните действията * и & се използват с указатели. Те ще бъдат разгледани по-късно.
Функциите /стандартни или потребителски дефинирани/ могат да бъдат операнди в изразите. Някои често срещани математически функции, изчисляващи sin, cos, ex , |x|, ln x, и др., са дефинирани във файла < math.h >. Те са показани в Таблица 4.
Таблица 4.
тип на резултата
име на функцията и тип на параметъра
предназначение
double
double
double
double
double
double
double
double
double
double
int
double
double
sqrt(double x)
pow(double x, double n)
fabs(double x)
sin(double x)
cos(double x)
tan(double x)
atan(double x)
exp(double x)
log(double x)
log10(double x)
abs(int x )
ceil(double x)
floor(double x)
x1/2 , x >=0
xn
| x |
sin x
cos x
tg x
arctg x
ex
ln x
lg x
| x|
най-малкото цяло, по-голямо от x
най-голямото цяло, по-мaлко от x
При използването на стандартните функции трябва да се отчита името и предназначението на функцията, типовете на входните данни и типа на изчислявания резултат. Например, функциите fabs и abs изчисляват абсолютна стойност от аргумента x. Те се различават по типовете на аргумента x и на резултата. Ако се изпълнят с реален аргумент, резултататът ще бъде различен:
cout << fabs(-5.6); // извежда 5.6
cout << abs(-5.6); // извежда 5
Част от функциите, свързани с тип char, са дадени в Таблица 5. Те са дефинрани във файла ctype.h.
Таблица 5.
тип на резултата
Име на функцията и тип на параметъра
предназначение
int
int
int
int
isalpha( char x)
isdigit( char x)
isupper( char x)
islower( char x)
Ако x не е буква, връща 0, иначе - цяло число
Aко x не е цифра, връща 0, иначе - цяло число
Aко x не е главна буква, връща 0, иначе - цяло число
Aко x не е малка буква, връща 0, иначе - цяло число
• Неявно преобразуване на типовете в изразите
В един израз могат да участват операнди от различни типове. При изчисляването се извършва автоматично преобразуване на типовете на операндите от тип, заемащ по-малко памет към тип, заемащ по-голям обем памет. В следващия пример ch се преобразува в int, f – в double, и крайният резултат на израза отдясно на действието присвояване ще бъде от тип double. Този тип ще се преобразува принудително към типа на x, т.е. към int:
char ch ;
int x, i;
float f;
double d;
........
x = (ch * i) + ( f - d) - (f *i);