Помогни ни да направим Uroci.net по - богат! Добави урок

C++ част.3 (Изрази и оператори)

C++ » C++
fix3d   трудност:    видян: 62810



3.3. Операции за равенство и отношение, логически операции

В следствие на изпълнението на тези операции се получава стойност истина или лъжа. Условието, което има стойност истина, връща 1, а това с лъжа - 0.

Логическата операция AND (“&&”) връща стойност истина само ако и двата й операнда се остойностяват като истина. Логическата операция OR (“||”) връща стойност истина когато един от двата й операнда имат стойност истина. Операндите се изчисляват от ляво на дясно. Изчислението се прекратява когато стойността на израза може да бъде определена. В изразите:

expr1 && expr2

expr1 || expr2

expr2 не се изчислява съответно:

при логическата операция AND, ако expr1 има стойност лъжа; при логическата операция OR, ако expr1 има стойност истина.

операция
функция
използуване

!
логическо не
!expr1

<
по-малко
expr1 < expr2

<=
по-малко или равно
expr1 <= expr2

>
по-голямо
expr1 > expr2

>=
по-голямо или равно
expr1 >= expr2

==
равенство
expr1 == expr2

!=
различно
expr1 != expr2

&&
логическо и
expr1 && expr2

||
логическо или
expr1 || expr2


Таблица 3.2. Операции за равенство и отношение, логически операции

Ползата от такова изчисление на операцията AND се вижда, когато expr1 задава такова условие в израза, което ако има стойност лъжа, може да направи пресмятането на expr2 опасно. Например,

while ( ptr != 0 && ptr ->
value < upperBound && notFound( ia[ ptr -> value ] ))

Указател със стойност 0 не адресира никакъв обект. Прилагането на оператора за избор на елемент към указател със стойност 0 причинява винаги неприятности. Първият операнд на израза с AND предотвратява тази възможност. Излизането на индекса извън границите на масива е също така неприятно. Вторият операнд е предвиден да предотвратява тази възможност. Когато първите два операнда върнат стойност истина третият операнд може спокойно да бъде изчислен.

Логическият оператор NOT ("!") получава стойност истина когато неговият операнд има стойност 0; иначе има стойност лъжа. Например:

int found = 0;
while ( !found ) {
found = lookup( *ptr++ );
if ( ptr == endptr ) // at end
return 0; }

Изразът ( !found ) има стойност истина докато found има стойност 0.

Използуването на оператора NOT се свързва с въпроса за стила на програмиране. Например, значението на израза ( !found ) е ясно: не е намерен. Така ясно ли е, обаче, какво означава следното условие?

!strcmp( string1, string2 )

strcmp() е една вградена функция в С-библиотека, която сравнява два аргумента от тип низ за равенство. Ако върнатата стойност е 0, то двата низа са равни. Тогава изразът

!strcmp( string1, string2 )

означава следното: ако string1 не е равен на string2. В този случай използуването на оператора NOT би могло да доведе до неясноста на условието.


3.4. Оператор за присвояване

Левият операнд на оператора за присвояване (“=”) трябва да бъде стойност за запис (lvalue). Резултатът от изпълнението на този оператор е записването на нова стойност в паметта, отделена на операнда. Например, нека са дадени следните три дефиниции:

int i;
int *ip;
int ia[ 4 ]; за които са валидни следните оператори:
ip * &i;
i = ia[ 0 ] + 1;
ia[ *ip ] = 1024;
*ip = i * 2 + ia[ i ];

Резултатът на оператора за присвояване е стойността на израза от дясната му страна. Типът на резултата е типа на левия операнд.

Предвидено е операторите за присвояване да могат да бъдат обединявани като всеки от операндите да бъде присвояван на същия тип данни. Например,

main() {
int i, j;
i = j = 0; // ok: each assigned 0
// ... }

на i и j се дава стойност 0. Редът за пресмятане е от ляво на дясно.

Обединяването на операторите за присвояване позволява един по-компактен запис, като е при написания отново конструктор на IntArray, например ( вж. Раздел 2.8 за неговата оригинална реализация):

IntArray::IntArray( int sz ) {
ia = new int[ size = sz ];
// ... }

Използуването на този запис зависи от стила на програмиста. Бъдете внимателни, обаче, защото тази компактност би могла да доведе до известна неяснота.

Смесеният оператор за присвояване също предлага един начин за компактно записване. Например,

int arraySum( int ia[], int sz ) {
int sum = 0;
for ( int i = 0; i < sz; ++i )
usm += ia[ i ];
return sum; }

Обобщената синтактична форма на смесения оператор за присвояване има вида:

a op = b;

където op може да бъде един от следните десет оператора:

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

Всеки смесен оператор е еквивалентен на следното:

a = a op b;

Дългият запис на оператора за събиране, например, има вида:

sum = sum + ia[ i ];

Упражнение 3-1. Следният запис е правилен. Защо? Как бихте могли да го промените?

main()

{ int i = j = k = 0; }

Упражнение 3-2. Следният запис също е правилен. Защо? Как бихте могли да го промените?

main() {
int i, j;
int *ip;
i = j = 0; }


Страници: «1 2 3 4 5 »

Сподели урока:



Коментари (1)

Zemoch на 18.01 2011 в 17:30ч.
Мнооого дълъг урок ! По полезно щеше да е да се направят 10тина теми от това вместо една наблъскана догоре.... Иначе полезно ама много хубаво( на едно място :) ) не е на хубаво !

Регистрирайте се, за да добавите коментар


Калдейта Ком ЕООД - © 2003-. Всички права запазени.
Препоръчваме: IT Новини