Логические операции. Примеры. Операции автоувеличения и автоуменьшения
Бинарные операции:
&&(и), || (или) || Напомнить: левый операнд раньше!!!
Унарная операция: ! (не)
Примеры
Если 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; просмотров: 1243;