
- •Представление чисел Целые числа
- •Вычитание
- •Умножение
- •Деление
- •Беззнаковые целые
- •Простые типы данных
- •Тип данных char
- •Int a[10], b[20]; // 2 массива на 10 и 20 целых чисел
- •Int a[n]; // размер массива задан через константу
- •Int Sum ( int a[], int n ) // a[] – параметр-массив
- •Int a[20], b[30], s;// здесь надо ввести массивы a и b
- •Выражения
- •Операция присваивания
- •Арифметические операции
- •Операции сравнения
- •Порядок вычисления выражений
- •Выражения и операторы.
- •Цикл for
- •Цикл while
- •Цикл do-while
- •Оператор return
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Очередь
- •Циклическая очередь в массиве
- •Рекуррентные соотношения
- •Внешняя и внутренняя форма представления числа
- •Классификация сортировок
- •Трудоемкость алгоритмов сортировки и поиска Сортировки выбором и вставками
- •Циклическое слияние группами по s элеметов
- •Исторический анализ
- •Логический анализ: cтандартные программные контексты
- •От общего к частному
- •Одно из трех
- •Особенности функции как модуля
- •Интерфейс передачи параметров в функцию
- •Примеры модульного проектирования
- •Сущность трансляции. Компиляция и интерпретация
- •Трансляция и ее фазы
- •Модульное программирование, компоновка
- •Понятие связывания. Статическое и динамическое связывание
- •Модульное проектирование на «классическом» Си Препроцессор
- •Области видимости и время жизни переменных
- •Все эти библиотеки условно разделены по категориям: Стандартные заголовочные файлы языка Си:
Порядок вычисления выражений
У каждой операции имеется приоритет. Если в выражении несколько операций, то первой будет выполнена операция с более высоким приоритетом. Если же операции одного и того же приоритета, они выполняются слева направо.
Например, в выражении
2 + 3 * 6
сначала будет выполнено умножение, а затем сложение;соответственно, значение этого выражения — число 20.
В выражении
2 * 3 + 4 * 5
сначала будет выполнено умножение, а затем сложение. В каком порядке будет производиться умножение – сначала 2 * 3, а затем 4 * 5 или наоборот, не определено. Т.е. для операции сложения порядок вычисления ее операндов не задан.
В выражении
x = y + 3
вначале выполняется сложение, а затем присваивание, поскольку приоритет операции присваивания ниже, чем приоритет операции сложения.
Для данного правила существует исключение: если в выражении несколько операций присваивания, то они выполняются справа налево. Например, в выражении
x = y = 2
сначала будет выполнена операция присваивания значения 2 переменной y. Затем результат этой операции – значение 2 – присваивается переменной x.
Ниже приведен список всех операций в порядке понижения приоритета. Операции с одинаковым приоритетом выполняются слева направо (за исключением нескольких операций присваивания).
:: (разрешение области видимости имен)
. (обращение к элементу класса), -> (обращение к элементу класса по указателю), [] (индексирование), вызов функции, ++ (постфиксное увеличение на единицу), -- (постфиксное уменьшение на единицу), typeid (нахождение типа), dynamic_cast static_cast reinterpret_cast const_cast (преобразования типа)
sizeof (определение размера), ++ (префиксное увеличение на единицу), -- (префиксное уменьшение на единицу), ~ (битовое НЕ), ! (логическое НЕ), – (изменение знака), + (плюс), & (взятие адреса), * (обращение по адресу), new (создание объекта),delete (удаление объекта), (type) (преобразование типа)
.*, ->* (обращение по указателю на элемент класса)
* (умножение), / (деление), % (остаток)
+ (сложение), – (вычитание)
<< , >> (сдвиг)
< <= > >= (сравнения на больше или меньше)
== != (равно, неравно)
& (поразрядное И)
^ (поразрядное исключающее ИЛИ)
| (поразрядное ИЛИ)
&& (логическое И)
|| (логическое ИЛИ)
= (присваивание), *= /= %= += -= <<= >>= &= |= ^= (выполнить операцию и присвоить)
?: (условная операция)
throw
, (последовательность)
Для того чтобы изменить последовательность вычисления выражений, можно воспользоваться круглыми скобками. Часть выражения, заключенная в скобки, вычисляется в первую очередь. Значением
(2 + 3) * 6
будет 30.
Скобки могут быть вложенными, соответственно, самые внутренние выполняются первыми:
(2 + (3 * (4 + 5) ) – 2)
В языке С не существовало логического типа. Логические значения представлялись данными целого типа, при этом значение 0 соответствовало логическому значениюложь, а все остальные целые значения соответствовали логическому значению истина. В языке С++ сохранена данная логика. По определению, true имеет значение 1 при преобразовании к целому типу, а false – значение 0. И наоборот, целые можно неявно преобразовать в логические значения: при этом ненулевые целые преобразуются в true, а ноль – в false. В любом месте, где требуется логическое значение, может стоять целочисленное выражение. В арифметических и логических выражениях логические значения преобразуются в целые, операции выполняются над преобразованными величинами.
Указатель можно неявно преобразовать в логическое значение, при этом ненулевой указатель принимает значение true, нулевой – false.
Такой подход позволяет вместо логической и целочисленной переменных объявлять только целочисленную, при этом значение переменной, равное 0, говорит об отсутствии некоторого признака у объекта, а остальные значения говорят о его наличии, и при этом несут какую-либо дополнительную информацию.
При выполнении бинарных операций производятся преобразования по умолчанию для приведения операндов к одному и тому же типу, который потом используется как тип результата:
если один из операндов имеет тип long double, другой тоже преобразуется в long double;
иначе, если один операнд имеет тип double, то второй операнд преобразуется к типу double;
иначе, если один операнд имеет тип float, то второй операнд преобразуется к типу float;
иначе над обоими операндами производится интегральное продвижение, а именно: значения типов char, signed char, unsigned char, short int и unsigned short intпреобразуются в int, если int может представить все значения исходных типов, в противном случае они преобразуются в unsigned int; bool преобразуется в int.
затем если один операнд имеет тип unsigned long, то второй операнд преобразуется к типу unsigned long;
иначе, если один из операндов относится к типу long int, а другой к типу unsigned int, то если long int может представить все значений типа unsigned int, unsigned intпреобразуется в long int, иначе оба операнда преобразуются в unsigned long int;
иначе, если один операнд имеет тип long int, то второй операнд преобразуется к типу long int;
иначе, если один операнд имеет тип unsigned int, то второй операнд преобразуется к типу unsigned int;
иначе оба операнда имеют тип int.
В C++ различают явное и неявное преобразование типов данных. Неявное преобразование типов данных выполняет компилятор С++, ну а явное преобразование данных выполняет сам программист. О преобразовании типов данных скажу следующее: «Результат любого вычисления будет преобразовываться к наиболее точному типу данных, из тех типов данных, которые участвуют в вычислении». Для наглядного примера представлю таблицу с преобразованиями типов данных. В таблице рассмотрим операцию деления. В качестве целочисленного типа данных возьмем int, ну и вещественный тип данных у нас будет float.
Таблица — Явное и неявное преобразование типов данных в С++ |
|||
x |
y |
Результат деления |
Пример |
делимое |
делитель |
частное |
x = 15 y = 2 |
int |
int |
int |
15/2=7 |
int |
float |
float |
15/2=7.5 |
float |
int |
float |
15/2=7.5 |
Из таблицы видно, что меняя переменные различных типов данных местами, результат остается тот же (в нашем случае это делимое и делитель). О неявном преобразовании типов данных все. Что же касается явного преобразования, то оно необходимо для того чтобы выполнять некоторые манипуляции, тем самым меняя результат вычисления. Самый простой способ явного преобразования типов данных, пример: допустим нам необходимо разделить такие числа 15 и 2, делим! 15/2=7. Результат тот же, что и в таблице. Но если сделать незначительные преобразования, например: 15.0/2=7.5 при таком делении число 15 является вещественным, значит и результат будет вещественный. Само число 15 с точки зрения математики не изменилось, ведь 15=15.0. Этот же прием можно было применить к двойке, результат был бы тем же, а можно было сразу к двум числам, но зачем ,если хватает одного из двух.