- •Лекция 4 Операции и выражения
- •Понятие выражения и операции
- •Классификация операций
- •Приоритеты (ранги) операций
- •Арифметические операции
- •Примеры использования арифметических операций Выделение цифр в целом числе
- •Выделение цифр в вещественном числе
- •Арифметические операции над переменными символьного типа
- •Операции инкремента и декремента
- •Особенности выполнения операций инкремента и декремента
- •Операции присваивания
- •Примеры использования
- •Операции отношения
- •Логические операции
- •Особенности выполнения логических операций
- •Примеры использования логических операций
- •Логические выражения и примеры их записи
- •Поразрядные логические операции
- •Примеры выполнения поразрядных логических операций:
- •Операции поразрядного сдвига
- •Дополнительные операции Операции доступа к компонентам структурированного объекта
- •Операции доступа к адресуемым компонентам классов
- •Определение размера sizeof
- •Вызов функции ( )
- •Индексация [ ]
- •Операция запятая ,
- •Операция расширения области видимости ::
- •Преобразование типа
- •Правила преобразования типов
- •Примеры преобразования типов
- •2. Особенности преобразования типов int и double:
- •7. Проанализируйте преобразование типов в операторах присваивания:
- •8. Приведение типа в случае использования указателей:
- •9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •10. С помощью приведения типа можно получить дробную часть числа:
- •Программирование вычисления алгебраических выражений
- •Определение первого символа вводимого значения
- •Контроль правильности ввода значения переменной
- •Основные встроенные (стандартные) функции
- •Пример вычисления по формуле
- •Замечания по программированию алгебраических выражений
- •Особенности представления чисел по двоичному основанию*
- •Особенности выполнения арифметических операций над вещественными числами*
- •Операции умножения и деления
- •Операции сложения и вычитания
- •Особые ситуации Ошибки округления
- •Ошибки переполнения
- •Потеря (исчезновение) порядка
- •Катастрофическая потеря порядка
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Обратить внимание
- •Правила работы с данными вещественных типов
Определение размера sizeof
Результат представляет целую константу, выражающую объем в байтах области памяти, занимаемой операндом (например, массивом),
или объём переменной определённого типа.
Синтаксис: sizeof унарное_выражение или
sizeof (имя типа) или
sizeof (тип_класса).
Например, выражение:
n=sizeof(arname)/sizeof(int);
позволяет вычислить количество элементов в массиве arname типа int.
Вызов функции ( )
Круглые скобки играют роль бинарной операции при вызове функции. Они как операция обязательны в обращении к функции:
имя_функции (список_аргументов);
Здесь операндами служат имя_функции и список_аргументов. Результат вызова вычисляется в теле функции, структуру которого задает ее определение.
Существуют два способа вызова функции:
имя_функции (e1, e2, …, en);
(*указатель_на_функцию) (e1, e2, …, en);
Указатель на функцию – это переменная, содержащая адрес функции. Значение самого выражения вызова функции, если оно имеется, определяется оператором возврата в определении функции.
Индексация [ ]
Квадратные скобки также играют роль бинарной операции при индексировании элементов массива. В выражении имя_массива [индекс] операндами служат имя_массива и индекс. Индекс определяет не номер элемента, а его смещение относительно начала массива.
Операция запятая ,
Операция запятая – задание последовательности – бинарный оператор. Синтаксис Е1, Е2, …, Еn. Выражение дает в результате вычисляемые слева направо Еi, а значение и тип Еn определяет результат всего выражения в целом. Скобки, как обычно, помогают устанавливать и «противостоять стандартному» приоритету операций.
Например:
i = 1, 2; //в переменной i значение 1, т.к. у присваивания выше приоритет
i = (1, 2); //в переменной i значение 2.
i = (1, 2, -3); //в переменной i значение -3.
Такой необычный оператор позволяет вместо требуемого по синтаксису одного выражения использовать несколько:
int func (int); //прототип функции
int i, j;
func( ((i=1), (j=2), i*j )); //вызов функции с одним аргументом, равным i*j
// переменные i и j получили новые значения и только после этого //было вычислено значение аргумента i*j func(i), g(), h(); //последовательный вызов всех функций
double d[3]={1,2,3};
cout << d[0,1]<< endl; //2 объяснить!!!
Операция расширения области видимости ::
Операция имеет две формы: унарную и бинарную. Соответственно, синтаксис: ::имя или имя_класса::функция. Первая форма (унарная) операции расширения области видимости позволяет осуществлять доступ к глобальному (или с продолжительностью файла) имени даже в том случае, когда это имя скрыто локальным «переобъявлением». Вторая форма (бинарная) использует имя класса с модификатором области действия, обозначающим, что функция, хотя и определена вне класса, в действительности является методом этого класса и существует в области действия класса.
Преобразование типа
Преобразование типов бывает:
-
автоматическое (неявное)
-
явное
Преобразование типа – операция времени выполнения. Компилятор выполняет преобразование типа во время выполнения операции и значение преобразуемой переменной в памяти не изменяется. В то же время при преобразовании типов нужно различать преобразования, изменяющие внутреннее представление данных, и преобразования, изменяющие только интерпретацию внутреннего представления. Например, при переводе данных типа unsigned int в int, их внутреннее представление не меняется, изменяется только интерпретация. При преобразовании типа float в int недостаточно изменить только интерпретацию, необходимо изменить длину участка памяти для внутреннего представления и кодировку. При таком преобразовании из float в int возможен выход за диапазон допустимых значений типа int, и реакция на эту ситуацию существенно зависит от конкретной реализации. Именно поэтому для сохранения мобильности программ в них рекомендуется с осторожностью применять преобразование типов.
Наиболее часто компилятор выполняет автоматическое (неявное) преобразование типов. Неявное преобразование типов проводится: при смешивании в одном выражении операндов разных типов:
-
при выполнении операций в выражениях (при смешивании в одном выражении операндов разных типов);
-
перед выполнением операции присваивания результат приводится к типу переменной слева от знака операции;
-
в случае, если одна и та же область памяти попеременно содержит данные то одного, то другого типа (совмещение в памяти данных разных типов); это происходит, например, при использовании объединений.
При этом:
-
операнды разных типов приводятся к «старшему», т.е. более длинному типу (типы в порядке возрастания их старшинства: битовое_поле, char, int, unsigned, long, unsigned long, float, double, long double);
-
при выполнении операции присваивания может возникнуть ситуация преобразования старшего типа к младшему;