Логические операции. Примеры. Операции автоувеличения и автоуменьшения


Бинарные операции:

&&(и), || (или) || Напомнить: левый операнд раньше!!!

Унарная операция: ! (не)

Примеры

Если x

x<A||x>B (вычисляется (x<A) или (x>B))

p!=NULL&&*p>7 (Вычисляется:

1) p!=NULL – не нулевой указатель;

2) *p>7 – значение переменной, на которую ссылается p

больше 7;

3) && - и ).

Если p!=NULL равно 0, то вычисления заканчиваются. Т.е. вначале левый операнд для || и &&.

Унарная операция “!” (“НЕ”) преобразует ненулевой операнд в 0, а 0 в 1

Пример.

if (!bool) эквивалентно if (bool==0) ,

NB! но не эквивалентно if (bool !=1)

Т.к. bool может быть не равно 1, но быть ненулеым(“истинным”)

Операции автоувеличения и автоуменьшения

(инкремент и декремент)

Эти операции характерны для языков низкого уровня - машинно-зависимых (ассемблеров):

++ - добавление 1 к операнду,

-- - вычитание 1 из операнда.

Следует иметь в виду, однако, что префиксная запись приводит к изменению значения операнда до использования в основном выражении, а постфиксная – после.

Пример.
int a,b,c;

a=b=1;

c=++a+b; /*c станет равным 3 */

c=a+b--; /*a станет равным 2 */

/*c станет равным 3 */

/*b станет равным 0 */

 

 

Пример.

В ранее представленной функции getline ( ) оператор

if (c==’\n’){

s[i]=c;

++i;

}

можно заменить более компактным:

if (c==’\n’)s[i++]=c ;

заменяя на s[++i]=c изменит смысл программы, т.е. это будет неверно.

Задача.

Пусть i =j=20. Какие значения индекса используются в выражении оператора while для проверки

while ((s[i++])=t[j++]!=’\0’); и что выполняется в этом операторе?

Правила приведения типов в выражениях

В большинстве случаев преобразование типов в арифметических выражениях выполняется автоматически. Имеется и операция, задающая явное преобразование: «(тип) преобразуемое_выражение».

Пример

а=sqrt((double)n);

Если n целого типа, то его значение преобразовывается к типу double. Если тип float, то такое преобразование выполняется автоматически без указания (double) перед n, то есть можно было бы указать :

a = sqrt(n);

Символьные константы в Си имеют тип int. Поэтому ‘0’, например, это код, который свободно исполняется в выражениях, например, с-‘0’.

При преобразовании значений символьных переменных к целым значениям, а это выполняется в арифметических выражениях всегда, используется распространение знака, то есть если старшем разряде 1, то эта 1 заполняет весь старший байт. В Турбо-Си, однако, можно объявлять: unsigned char, и тогда распространение знака не производится.

Пример

unsigned char c;

Неявное преобразование типов в арифметических выражениях выполняется в следующей последовательности:

1. Операнды типов преобраз. в тип

{signed,unsigned}оpt char

short int

enum

float double

unsigned short unsigned int

2. Теперь все операнды могут быть следующих типов: {long} оpt double, либо {unsigned} оpt {long} оpt int. Для этих оставшихся, преобразования выполняются следующим образом в порядке приоритетов:

· если один из операндов типа long double, то - к этому типу,

· если один из операндов типа double, то - к этому типу и так далее.

Все это можно представить иерархией типов, которая учитывает диапазон данных:

long double Следует учесть, что в Турбо-Си эти типы

эквивалентны

double

unsigned long

long

unsigned int

3. Если правила не сработали, то тип int и тип результата тоже int.

 

Пример

unsigned int a;

double b;

…………….

a=a+b; /*тип результата а+в –double, но изменится при присваивании к типу*/

/*unsigned int*/

Преобразование выполняется к типу переменной слева от символа присваивания

a=b=z+d;

z + d преобразуется к типу в

b преобразуется к типу а

При присваивании преобразование из float в int приведет к отбрасыванию дробной части, а double к float преобразуется путем округления. Из целых преобразование в короткие short или char выполняется отбрасыванием старших разрядов. Следует учитывать, что, так как операции выполняются справа налево, то многократное присваивание может привести к потере точности.



Дата добавления: 2016-05-26; просмотров: 1161;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.