КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Арифметические действия с указателями
Арифметические действия с указателями отличаются от арифметических действий с обычными целыми значениями, и определяются следующим образом. Предположим, что i является целым выражением, а указатели p и q указывают на элементы типа Т. Сложение значения i и p эквивалентно сложению числа ячеек памяти в байтах, занятых i элементами типа Т. Аналогично определяется операция вычитания. Результат вычитания двух указателей типа *Т является не разностью значений двух указателей, а числом элементов типа Т, размещенных между ячейками, ссылки на которые обеспечиваются указателями. Никакие другие арифметические действия с указателями не допускаются. Вычитание указателей имеет смысл только для указателей, ссылающихся на элементы одного и того же массива, поскольку только в этом случае разность адресов элементов массива всегда равна произведению целого значения на величину элемента. Использование: ae1-ae2 Разность значений ae1 и ae2. Пример 1: i=j-100; Использование: pe-ie Адрес переменной типа pe, меньше на ie адреса, заданного указателем pe. Пример 2: first=last-arsize+1; Использование: pe1-pe2 Число переменных типа pe в диапазоне от pe2 до pe1. Пример 3: arsize=last-first;
Операции, уровень приоритета которых равен 5
Уровень приоритета операций сдвига равен 5. Порядок выполнения операций - слева направо.
Операция сдвига влево: << Тип операнда - интегральный. Тип результата - такой же, как у левого операнда. Правый операнд преобразуется к типу int. Левый операнд сдвигается на число разрядов, равное значению правого операнда. Освобождающие разряды заполняются нулями. Использование: ie1<<ie2 Двоичное представление ie1 сдвигается влево на ie2 разрядов, освобождающие разряды заполняются нулями. Пример: four=x<<2;
Операция сдвига вправо: >> Тип операнда - интегральный. Тип результата - такой же, как у левого операнда. Правый операнд преобразуется к типу int. Левый операнд сдвигается на число разрядов, равное значению правого операнда. Сдвиг будет логическим сдвигом, если левый операнд имеет тип unsigned. Использование: ie1>>ie2 Двоичное представление ie1 сдвигается вправо на ie2 разрядов. Сдвиг вправо может быть арифметическим (т. е. освобождающиеся слева разряды заполняются значениями знакового разряда) или логическим в зависимости от реализации, однако гарантируется, что сдвиг вправо целых чисел без знака будет логическим, и освобождающиеся слева разряды будут заполняться нулями. Пример: x=x>>3;
Операции, уровень приоритета которых равно 6
Уровень приоритета операций отношения равен 6. Выполняются эти операции слева направо.
Операция меньше: < Тип операндов - арифметический или указатель. Тип результата - int. Использование: ae1<ae2 Истина, если ae1 меньше, чем ae2. Пример: if(x<0) printf("negative");
Операция больше: > Тип операндов - арифметический или указатель. Тип результата - int. Использование: ae1>ae2 Истина, если ae1 больше, чем ae2. Пример: if(x>0) printf("positive");
Операция меньше или равно: <= Тип операндов - арифметический или указатель. Тип результата - int. Использование: ae1<=ae2 Истина, если ae1 меньше или равно ae2.
Операция больше или равно: >= Тип операндов - арифметический или указатель. Тип результата - int. Использование: ae1>=ae Истина, если ae1 больше или равно ae2.
Операции, уровень приоритета которых равен 7
Уровень приоритетов операций равенства/неравенства равен 7, выполняются они слева направо.
Операция равенство: == Тип операндов - арифметический или указатель. Тип результата - int. Использование: ie1==ie2 Истина, если ie1 равно ie2, иначе - ложь.
Операция неравенство:!= Тип операндов - арифметический или указатель. Тип результата - int. Единственным целым значением, с которым можно сравнивать указатели, является нулевое значение! Использование: ie1!=ie2 Истина, если ie1 не равно ie2. Пример: while (i!=0) i=func;
Операция, уровень приоритета которой равен 8
Уровень приоритета операции поразрядное И равен 8. Выполняются такие операции слева направо.
Операция поразрядное И: & Тип операндов - интегральный. Тип результата: int, long, unsigned. Использование: ie1 & ie2 Побитовая операция И двоичных представлений ie1 и ie2. Значение выражения содержит 1 во всех разрядах, в которых и ie1 и ie2 содержат 1, и 0 во всех остальных разрядах. Пример: flag=((x&mask)!=0);
Операция, уровень приоритета которой равен 9
Уровень приоритета операции поразрядное исключающее ИЛИ равен 9. Порядок выполнения таких операций слева направо.
Операция поразрядное исключающее или: ^ Тип операндов - интегральный. Тип результата: int, long, unsigned. Использование: ie1^ie2 Побитовая операция исключающее ИЛИ двоичных представлений ie1 и ie2. Значение выражения содержит 1 в тех разрядах, в которых и ie1 и ie2 имеют разные двоичные значения, и 0 во всех остальных разрядах. Пример: diffbits=x^y;
Операция, уровень приоритета которой равен 10
Уровень приоритета операции поразрядное включающее ИЛИ равен 10, порядок выполнения таких операторов - слева направо.
Операция поразрядное включающее ИЛИ: | Тип операндов - интегральный. Тип результата: int, long, unsigned. Использование: ie1 | ie2 Побитовая операция ИЛИ двоичных представлений ie1 и ie2. Значение выражения содержит 1 во всех разрядах, в которых ie1 или ie2 содержат 1, и 0 во всех остальных разрядах. Пример: attrsum=attr1 | attr2;
Операция, уровень приоритета которой равен 11
Уровень приоритета логической (условной) операции И равен 11. Выполняется операция слева направо.
Операция логическое И: && Тип операндов - арифметический или указатель. Тип результата - int. Если первый операнд равен 0, то результат равен 0. В противном случае результат будет равен 1, если второй операнд не равен 0, и равен 0, если второй операнд равен 0 (если первый операнд равен 0, то второй операнд не вычисляется). Использование: e1&&e2 Логическая операция И значений e1 и e2. Вначале проверяется значение e1; значение e2 проверяется только в том случае, если значение e1 -Истина. Значением выражения является Истина, если значения e1 и e2 - Истина. Пример: if(p!=NULL&&*p>7) n++; Если p - не нулевой указатель и значение переменной, на которую указывает p, больше, чем 7, то в этом случае n увеличивается на 1. Обратите внимание, что если значение указателя p равно NULL(0), то выражение *p не имеет смысла.
Операция, уровень приоритета которой равен 12
Уровень приоритета операции равен 12, выполняются такие операции слева направо.
Операция логическое ИЛИ: || Тип операндов - арифметический или указатель. Тип результата int. Если хотя бы один операнд не равен 0, результат равен 1; иначе результат будет равен 0. Использование: e1 || e2 Логическая операция ИЛИ значений e1 и e2. Вначале проверяется значение e1; значение e2 проверяется только в том случае, если значение e1 - ложь. Значением выражения является Истина, если истинно любое значение e1 или e2. Пример 1: if(x<A || x>B) printf("out of range");
Операция, уровень приоритета которой равен 13
Уровень приоритета операции равен 13, выполняются такие операции слева направо.
Операция условный оператор:? Тип операндов - арифметические; второй и третий операнды могут быть указателями, структурами, объединениями. Тип результата: int, long, unsigned, double, указатель, структура или объединение. Второй и третий операнды преобразуются к одному и тому же типу. Условный оператор является единственным оператором, для которого необходимы три операнда; используется он следующим образом: a?b:c где a, b, c - выражения. Если a не равно 0, то результат выражения a? b: c равен b; иначе результат равен c. Из двух последних операндов вычисляется только один. Использование: ae?e1:e2 или pe?e1:e2 (где pe - указатель) Если истинно ae или pe, то выполняется e1; иначе выполняется e2. Значением этого выражения является значение выражения e1 или e2. Пример: abs=(i<=0)?-i:i;
Операция, уровень приоритета которой равен 14
Уровень приоритета операции равен 14, выполняются такие операции справа налево.
Операция простое присваивание: = Тип операндов: арифметические, указатели, объединения или структуры. Тип результата: если оба операнда имеют арифметический тип, то значение правого операнда преобразуется к типу левого операнда. Использование: v=e Присваивание значения e переменной v. Пример: x=y;
Операция сложное присваивание: = Обозначим <знак> один из знаков: +, -, *, /, %, >>, <<, &, ^, |. В результате выполнения операции присваивания v=e где v - переменная, а e - выражение, значение выражения становится новым значением переменной v. Операция присваивания v <знак>= e приблизительно эквивалентна оператору присваивания v = v<знак> e Пример 1: y+=2; /* Увеличение переменной y на 2 */ p+=n; x-=3; ptr-=2; timesx*=x; x/=2; x%=10; x>>=4; x<<=1; remitems&=mask; control^=seton; additems |=mask; Типы операндов и результата сложного оператора присваивания можно определить на основании этой эквивалентности. Однако приведенный эквивалент для сложного оператора присваивания не совсем точен. В выражении v <знак>= e операнд v вычисляется только один раз, в то время как в выражении v = v <знак> e этот операнд вычисляется дважды. Это различие проявляется в побочных эффектах, связанных с вычислением операнда v, например, при изменении значения какой-либо переменной. Рассмотрим это на примерах: a[i++]* = n; При выполнении вычисление левого операнда дает побочный эффект - увеличение значения переменной i. Следовательно, это присваивание не эквивалентно присваиванию a[i++] = a[i++]*n;. Эквивалентом первой операции присваивания может служить последовательность операций a[i]=a[i]*n; i=i+1; а эквивалентом второй - последовательность операций a[i]=a[i+1]*n; i=i+2; или последовательность операций a[i+1]=a[i]*n; i=i+2; в зависимости от того, какая часть операции присваивания вычисляется раньше - левая или правая. Порядок таких вычислений не определен.
Операция, уровень приоритета которой равен 15
Уровень приоритета операции равен 15, выполняются такие операции слева направо.
Операция запятая:, Тип результата совпадает с типом правого операнда. Операция объединяет два выражения в одно выражение, значением которого является значение правого операнда; значение левого операнда вычисляется только для получения побочных эффектов. Использование: el,e2 Сначала выполняется выражение e1, потом выражение е2. Значением всего выражения является значение выражения е2. Пример: for(i=A,j=B;i<j;i++,j--) /* организация циклического повторения. Оператор со счетчиком */ p[i]=p[j];
Примеры простых задач
/* Задача № 1 (пример на использование операции *)
Дата добавления: 2014-01-05; Просмотров: 831; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |