Аддитивные операторы выполняют сложение (+) и вычитание (-). Операндами могут быть целые значения или значения с плавающей точкой. Некоторые аддитивные операции могут быть выполнены и над значениями указателей, как это подчеркивается при рассмотрении каждого оператора.
Аддитивные операторы выполняют обычные арифметические преобразования интегральных операндов и операндов с плавающей точкой. Тип результата совпадает с типом операндов после их преобразования. Выполняемые аддитивными операторами преобразования не делают какой-либо проверки на переполнение, поэтому может произойти потеря информации, если результат аддитивной операции не может быть предствален типом операнда после преобразования.
Оператор сложения вызывает суммирование двух его операндов. Оба операнда могут быть интегральноги типа или типа с плавающей точкой, либо либо один операнд может быть указателем, а другой целой величиной.
Когда к указателю добавляется целая величина (i) она преобразуется путем ее умножения на размер величины, на которую указывает указатель. После преобразования это целое значение представляет собой i-ую позицию памяти, а каждая позиция имеет длину, задаваемую типом указателя. При добавлении целого значения к значению указателя результатом будет новый указатель, значение котрого соответствует адресу i-ой позиции от первоначального адреса. Значение нового указателя есть адрес величины того же самого типа, на который указывал первоначальный указатель.
Чтение и запись математических выражений
- Оба операнда являются целыми значениями или величинами с плавающей точкой.
- Оба операнда являются указателями на один и тот же тип.
- Первый операнд это указатель, а второй — целая величина.
Когда из указателя вычитается целая величина (i) она преобразуется путем ее умножения на размер величины, на которую указывает указатель. После преобразования это целое значение представляет собой i-ую позицию памяти, а каждая позиция имеет длину, задаваемую типом указателя. При вычитании целого значения из значения указателя результатом будет новый указатель, значение котрого соответствует адресу i-ой позиции до первоначального адреса. Значение нового указателя есть адрес величины того же самого типа, на который указывал первоначальный указатель.
Аддитивные операции с указателем и целой велиной дают осмысленные результаты только в том случае, когда операнд-указатель задает адрес компоненты массива и целое значение задает сдвиг в пределах границ этого же массива. Когда целая величина преобразуется в сдвиг адреса, компилятор предполагает, что между первоначальным адресом и результирующим адресом расположены позиции памяти только одинакового размера.
Это предположение справедливо для компонент массива. По своему определению массив это совокупность значений одного типа. Его компоненты располагаются неприрывно в заданной области памяти. Однако, нет гарантии, что элементы любого отличного от массива типа располагаются в памяти непрерывно.
Информатика. 6 класс. Правила записи арифметических выражений /02.02.2021/
Т.е. между позициями памяти могут появляться пропуски, даже если каздая из позиций имеет одинаковый тип. Т.о. результаты добавления или уменьшения адресов любых величин, кроме элементов массива, не определены.
Аналогично, при вычитании величин двух указателей , преобразование предполагает, что величины имеют один тип, между ними нет пропусков.
Для ЭВМ сегментированной архитектуры (например, 8086/8088), аддитивные операции с указателем и целой величиной в некоторых случаях могут быть некорректными. Например, операция может дать в результате адрес, который находится вне границ массива. Дополнительная информация о моделях памяти содержится в Вашем Руководстве по компилятору.
Данные объявления используются в двух последующих примерах:
int = 4, j; float x[10]; float *px;
В данном примере значение i умножается на длину типа float и добавляется к x[4] + i; /* эквивалентно px = */
В данном примере адрес третьего элемента x (задаваемый x[i-2]) вычитается из адреса пятого элемента x (задаваемого x[i]). Разность делится на длину float и результатом будет целое значение 2.
Сдвиг
Операторы сдвига сдвигают свой первый операнд влево (<<) или вправо (>>) на число позиций, задаваемое вторым операндом. Оба операнда должны быть целыми значениями. Эти операторы выполняют обычные арифметические преобразования. Тип результата совпадает с типом левого операнда после преобразования.
Сдвиг влево обращает правые биты в 0. При сдвиге вправо свободные левые биты заполняются в соответствии с типом первого операнда после преобразования. Если этот тип unsigned, то они устанавливаются в 0. В противном случае они заполняются копиями бита знака.
Если второй операнд есть отрицательная величина, то результат операции сдвига не определен.
Выполняемые операторами сдвига преобразования не делают какой-либо проверки на переполнение, поэтому может произойти потеря информации, если результат операции сдвига не может быть представлен типом первого операнда после преобразования.
unsigned int x, y, z; x = 0x00aa; y = 0x5500; z = (x > 8);
В данном примере x сдвигается влево на восемь позиций, а y сдвигается вправо на восемь позиций. Сдвинутые значения складываются и результат, 0xaa55, присваивается z.
Отношения
Бинарные операторы отношений сравнивают первый операнд со вторым и проверяют истинность заданного соотношения. Результат проверяемого выражения отношения равен 1, если оно «истина», и равен 0, если оно «ложь». Результат имеет тип int.
Имеются следующие операторы отношений:
< первый операнд меньше второго >первый операнд больше второго = первый операнд больше или равен второму == первый операнд равен второму != первый операнд не равен второму
- Оба операнда любого оператора отношений могут быть указателями на один и тот же тип. Для операторов равенства (==) и неравенства (!=) результат сравнения показывает, задают ли эти два указателя один и тот же адрес места в памяти. Для других операторов отношений (, =) результат сравнения показывает относительную позицию двух адресов памяти. Адрес заданному значению выделяется случайно, поэтому сравнение адресов двух не связанных величин обычно не имеет смысла. Однако, может быть полезным сравнение адресов различных элементов одного и того же массива, т.к. гарантируется, что элементы массива хранятся в упорядоченной последовательности один за другим, от первого до последнего. Адрес первого элемента массива «меньше» адреса его последнего элемента.
- Значение указателя можно сравнить на совпадение (==) или на несовпадение (!=) с постоянной величиной 0. Пойнтер со значением 0 называется «пустым» указателем, и он не указывает ни на какую область памяти.
Значения x и y равны, поэтому результатом выражения будет 0.
int x = 0, y = 0; x < y
Фрагмент данного примера инициализирует каждый элемент массива array пустой символьной константой.
char array[10]; char *p; for (p=array; p
В данном примере объявляется перечислимая переменная с именем col и признаком color. В любой момент времени переменная может содержать целое значение 0, 1 или 2, которое соответствует одному из элементов перечислимого набора color: red, white или green, соответственно. Если col содержит 0, то выполняется оператор if и все операторы, выполнение которых связано с результатами выполнения if.
enum color col; . . . if (col == red) . . .
Побитовая обработка
Операторы побитовой обработки выполняют операции побитового-И ( Оператор побитового-И сравнивает каждый бит своего первого операнда с соответствующим битом его второго операнда. Если оба бита равны 1, то и результирующий бит устанавливается в 1. В противном случае результирующий бит устанавливается в 0. | Оператор побитового включающего-ИЛИ сравнивает каждый бит своего первого операнда с соответствующим битом его второго операнда.
Если хотя бы один бит равен 1, то и результирующий бит устанавливается в 1. В противном случае результирующий бит устанавливается в 0. ^ Оператор побитового исключающего-ИЛИ сравнивает каждый бит своего первого операнда с соответствующим битом его второго операнда. Если один бит равен 1, а второй бит равен 0, то и результирующий бит устанавливается в 1. В противном случае результирующий бит устанавливается в 0.
В последующих примерах использованы следующие объявления:
short i = 0xab00; short j = 0xabcd; short n;
Результат, присвоенный n, совпадает с i (шестнадцатеричное 0xab00).
n = i
Побитовое включающее-ИЛИ дает в результате 0xabcd (шестнадцатеричное).
Источник: www.opennet.ru
Выражения (C++)
В этом разделе описываются выражения С++. Выражения — это последовательности операторов и операндов, используемые в следующих целях.
- Вычисление значения из операндов.
- Назначение объектов или функций.
- Создание «побочных эффектов». (Побочные эффекты — это любые действия, отличные от вычисления выражения, например изменение значения объекта.)
В C++ операторы могут перегружаться, и их значения могут определяться пользователем. Однако их приоритет и число принимаемых операндов изменить невозможно. В этом разделе описывается синтаксис и семантика не перегруженных операторов в том состоянии, в котором они предоставляются языком. Помимо типов выражений и семантики выражений, рассматриваются следующие темы:
- Первичные выражения
- Оператор разрешения области
- Постфиксные выражения
- Выражения с унарными операторами
- Выражения с бинарными операторами
- Условный оператор
- Константные выражения
- Операторы приведения
- Сведения о типе времени выполнения
Разделы об операторах в других разделах:
Источник: learn.microsoft.com
1.9. Правила записи выражений
Во избежание ошибок выражения в языке С++ должны записываться по определенным правилам. Приведем их.
1. Запись выражений ведется на одном уровне, в одну строчку, для этого используется знак операции деления / (косая черта) и система круглых скобок. Другими словами, многоэтажная система записи выражений, принятая в математике, при записи выражений в С++ недопустима. Например, математическое выражение должно быть записано как (x+y+z)/(a+b+c).
2. Не должно быть никаких надстрочных и подстрочных индексов. Это обеспечивается за счет соответствующего выбора идентификаторов. По- этому, если требуется ввести в программу переменные, которые в обычной математической записи обозначаются, например, так:
то они могут быть идентифицированы в С++, следующим образом: hx, xn, y0, zmn, fstrich, x1.
3. В отличие от обычной математической записи, в которой многие знаки операций предполагаются по умолчанию, в выражениях языка C++ необходимо проставлять все знаки операций, в частности знак умножения. Например, выражение (А + В) (X + У) бессмысленно: оно должно быть записано в виде (А + В)* (X + Y). Если вместо А*В написать АВ, то транслятор воспримет это выражение не как произведение переменных А и В, а как новую переменную (идентификатор) АВ, состоящую из двух символов.
4. Два символа операций не должны стоять рядом. Поэтому А*-В является бессмысленным, но А*(-В) допустимо. Выражение вида X + 3*- 7+4 необходимо представить в виде X + 3*(-7) + 4.
Замечание: для операций инкремента и присваивания в С++ есть исключения из этого правила.
5. При записи выражений разрешается использовать только круглые скобки. Поэтому, если в исходном математическом выражении имеются квадратные или фигурные скобки, то их следует заменить на круглые. Например, математическое выражение вида следует записать как
6. Количество круглых скобок при записи неограниченно, но необходимо следить, чтобы количество левых (открывающих) и правых (закрывающих) круглых скобок было одинаковым.
7. Скобки используются для указания желаемой очередности выполнение операций так же, как и в обычной математической записи. Поэтому оба выражения А — В + С и А — (В + С) допустимы, но означают не одно и то же.
8. В сомнительных случаях порядок выполнения операций в выражениях следует доопределять с помощью скобок. Так, выражение должно быть записано в виде А/(В* С), а не в виде А/В*С, соответствующем выражению
9. Рекомендуется в выражениях по возможности не смешивать различные типы операндов, хотя это и допускается. Это связано с тем, что при смешивании типов операндов происходит их преобразование к одному типу, а это ведет к замедлению выполнения программы, и в ряде случаев к потере точности и даже потере результата вообще.
10. Если выражение не помещается на одной строке бланка для записи программы, то его продолжают на следующих строках бланка, при этом никаких дополнительных знаков переноса не ставится. Например, такое простое выражение, как А + В; формально может быть записано на двух строках в виде
Из приведенных записей видно, что знак + ставится только один раз (в одной из строк), а не дважды, как это принято в математике.
Перенос выражений лучше осуществлять на месте знаков операций или круглых скобок. Но не следует разрывать при переносе идентификаторы, константы, указатели функций, ключевые слова и составные знаки операций.
Признаком конца выражения служит знак точка с запятой «;».
11. При записи выражения в программе между идентификаторами, знаками операций и круглыми скобками разрешается ставить пробелы (хотя это обычно не делается). При изображении составных символов операций (например, ||, , >> , =,
12. Фактические параметры (аргументы) встроенных и других функций всегда должны быть заключены в круглые скобки.
13. Запятая, отделяющая целую и дробную части числа в математике, при записи констант на языке С++ заменяется точкой.
Приведенные правила важны по многим причинам. Во-первых, необходимо точно составить программу, чтобы она произвела именно те вычисления, которые требуются. Во-вторых, некоторые вычисления могут оказаться просто невозможными из-за способа работы вычислительной машины и транслятора. В-третьих, неправильный порядок выполнения операций может привести к потере точности результата или даже к полной потере результата.
Приведем примеры записи ряда арифметических выражений на языке С++:
Математическая запись
Запись на языке С++
Источник: studfile.net