
- •Битовые операции
- •Битовые логические операции
- •Битовые операции сдвига
- •Логические операции
- •Битовые операции
- •Логические операции
- •Символьный тип
- •Целочисленный тип
- •Вещественный тип
- •Логический тип
- •Преобразование типов данных
- •Оператор цикла while
- •Оператор цикла for
- •Оператор цикла do while
- •Программирование вложенных циклов
- •Переприсваивание
- •Объединение строк
- •Escape-знаки
- •Точные строки: символ @
- •Преобразование строк в другие типы
- •Объединения
- •Основные понятия
- •7.2. Определение функции
- •Вызов функции
- •Передача данных по значению
- •Передача данных по адресу
- •Передача данных по ссылке
- •Передача одномерного массива в функцию
- •Вызовы с переменным числом аргументов
- •Определение значений по умолчанию
- •Организация работы с файлами средствами c
- •Файловый ввод-вывод с использованием потоков
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Массивы указателей
- •Предварительная инициализация параметров функции
- •Динамические массивы ограниченного размера и их объём[]
- •Макроопределение - директива #define
- •Структура библиотеки
- •Бщее описание[править | править исходный текст]
- •Неструктурная обработка исключений[
- •Структурная обработка исключений[
1Правила написания программ на языке С++ Структура простейшей программы.
Сама по себе программа на языке С++ представляет собой текстовый файл, в котором представлены конструкции и операторы данного языка в заданном программистом порядке
/* Пример простой программы*/
#include <stdio.h> int main()
{
printf("Hello World!"); return 0;
}
Следующий шаг - это компиляция исходного кода. Под компиляцией понимают процесс, при котором содержимое текстового файла преобразуется в исполняемый машинный код, понимаемый процессором компьютера. Однако компилятор создает не готовую к исполнению программу, а только объектный код (файл с расширением *.obj). Этот код является промежуточным этапом при создании готовой программы. Дело в том, что создаваемая программа может содержать функции стандартных библиотек языка С++, реализации которых описаны в объектных файлах библиотек. Например, в приведенной программе используется функция printf() стандартной библиотеки «stdio.h». Это означает, что объектный файл exl.obj будет содержать лишь инструкции по вызову данной функции, но код самой функции в нем будет отсутствовать.
Для того чтобы итоговая исполняемая программа содержала все необходимые реализации функций, используется компоновщик объектных кодов. Компоновщик - это программа, которая объединяет в единый исполняемый файл объектные коды создаваемой программы, объектные коды реализаций библиотечных функций и стандартный код запуска для заданной операционной системы. В итоге и объектный файл, и исполняемый файл состоят из инструкций машинного кода. Однако объектный файл содержит только результат перевода на машинный язык текста программы, созданной программистом, а исполняемый файл - также и машинный код для используемых стандартных библиотечных подпрограмм и для кода запуска.
Графически описанные этапы создания программы представлены на рис. 1.1. Здесь исполняемый файл имеет расширение *.ехе и может быть запущен обычным образом из соответствующей операционной системы: МБ- БОБ или ’^пёо’№8.
Состав языка Си:, идентификаторы, знаки операций, константы, комментарии. Лексемы.
Любой язык программирования подобен языку человека. Как и в нашем с вами языке (русском, английском и так далее), в языке программирования можно выделить алфавит, слова и предложения. Но язык программирования в отличии от языка человека гораздо проще и подчиняется жестким правилам. Это обусловлено примитивностью вычислительной техники: компьютер — не человек, домыслить ничего не может и обрабатывает только такой набор команд, который трактуется однозначно.
Итак, разберем базовые понятия языка С# и начнем с основы основ в любом языке — его алфавита.
Алфавит языка — это тот набор символов (знаков), который допустим в данном языке. В алфавит языка C# входят:
прописные и строчные буквы (латинские и национальных шрифтов) и символ подчеркивания (_);
цифры;
специальные знаки: ' " , { } | [ ] ( ) + - / \ % ? ! . ; : < = > & * ~ ^
неотображаемые символы («обобщенные пробельные символы»), они используются для отделения лексем друг от друга (это пробелы, табуляция, переход на новую строку).
Из отдельных символов алфавита языка строятся более крупные блоки программы: лексемы, директивы препроцессора и комментарии.
Лексема — это последовательность из одного или несколько символов, представляющая определенный смысл. Лексемам в языке человека соответствует понятие слово. В литературе, посвященной трансляции с языков программирования, часто используется термин токен, имеющий тот же смысл. Существует несколько видов лексем:
идентификаторы (имена объектов);
ключевые (зарезервированные, служебные) слова;
знаки операций;
разделители;
литералы.
Идентификатор — это последовательность букв, цифр и символов подчеркивания. Идентификаторы используются для обозначения имен объектов, используемых в программе. Всё, что применяется в программе, имеет имя. Имена (названия) имеют константы, переменные, методы, классы и т. д. Имя не может начинаться с цифры. Длина имени произвольная. Ограничения накладываются только на внешние имена, например, на имена библиотек, но это ограничения не языка C#, а операционной системы. В идентификаторах допускается применять национальные шрифты, например, русские буквы, но это нежелательно.
Замечание. В традиционных языках программирования (C, Паскаль и другие) символы национальных шрифтов можно применять только в качестве символов-констант (например, 'Я'), в символьных строках ("Это строка") и комментариях. В C# символы национальных шрифтов допустимы и для обозначения имен (идентификаторов). Это повышает читаемость программы, но создает дополнительные проблемы. Ведь служебные слова по-прежнему состоят только из латинских букв. Попробуйте сами набирать текст программы, где в каждом предложении необходимо многократно переключаться с русского языка на английский!
Ключевые слова — это служебные слова, которые зарезервированы в языке, их можно использовать только по прямому назначению (например, for — это заголовок оператора цикла и ничего более), т. е. зарезервированные слова нельзя использовать в качестве имен переменных пользователя. Ключевые слова, определенные в стандарте языка C# версии 2.0, приведены в таблице ниже: Комментарии — это фрагменты программы, которые не обрабатываются компиляторов, а используются для пояснения текста программы. В языке C# имеются те же виды комментариев, что и в C++, а так же появился новый вид. Перечислим их.
1)Однострочный комментарий — начинается с двух символов «косая черта», например:
// это комментарий в одну строку
2)Многострочный комментарий — начинается с пары символов /* и заканчивается парой */. Пример:
/* Большой
комментарий
*/
3)Комментарии для автоматической генерации документации в XML-формате. Они начинаются с трёх символов «косая черта». Например,
///<summary>
///This is Alfa class
///</summary>
Знаки операций — это один или несколько символов, определяющих действие над операндами. Внутри знака операции не может быть пробелов (пробел — это всегда разделитель). Например, в выражении x+y знак +означает операцию сложения, а x и y являются операндами. Операции и знаки, их означающие, мы будем изучать по мере необходимости.
Операнд — это константа, переменная или вызов метода (функции). Операнды, связанные знаками операций, образуют выражения. Понятие «выражение» в языке программирования соответствует понятию «словосочетание» в языке человека. Тип выражения определяется типом операндов.
Разделитель используются для разделения или для группировки элементов. Примеры разделителей: пробелы, скобки, точка, запятая.
3Арифметические операции, Стандартные библиотеки языка C
В языке С++ довольно просто реализуются элементарные математические операции: сложения, вычитания, умножения и деления. Допустим, что в программе заданы две переменные
int a, b; с начальными значениями
a=4;
тогда операции сложения, вычитания, умножения и деления будут выглядеть следующим образом:
int c;
c
=
a+b;
с
=
a-b; c = a*b; c = a/b;
Представленные операции можно выполнять не только с переменными, но и с конкретными числами, например
с = 10+5; с = 8*4; float d; d = 7/2;
Результатом первых двух арифметических операций будут числа 15 и 32
соответственно, но при выполнении операции деления в переменную d будет
записано число 3, а не 3,5. Это связано с тем, что число 7 в языке С++ будет
интерпретироваться как целочисленная величина, которая не может содержать
дробной части. Поэтому полученная дробная часть 0,5 будет отброшена. Для
реализации корректного деления одного числа на другое следует использовать
такую запись: d = 7.0/2;
или
d = (float )7/2;
В первом случае вещественное число делится на два и результат (вещественный) присваивается вещественной переменной d. Во втором варианте выполняется приведение типов: целое число 7 приводится к вещественному типу float, а затем делится на 2. Второй вариант удобен, когда выполняется деление одной целочисленной переменной на другую:
int a,b; a = 7; b = 2; d = a/b;
В результате значение d будет равно 3, но если записать
d = (float ) a/b;
то получим значение 3,5. Здесь следует также отметить, что если переменная d является целочисленной, то результат деления всегда будет записан с отброшенной дробной частью. Аналогичные правила справедливы для всех арифметических операций.
В заключении рассмотрения работы с арифметическими операциями отметим, что приоритет операций умножения и деления выше приоритета операций сложения и вычитания. Это означает, что сначала выполняются операции умножения и деления и только затем операции сложения и вычитания. Следующий пример демонстрирует приоритет арифметических операций:
double n=2, SCALE = 1.2;
double arg = 25.0 + 60.0*n/SCALE;
В приведенном примере сначала будет выполнена операция умножения, затем деления и, наконец, сложения. То есть порядок вычисления соответствует математическим правилам. Для того чтобы изменить порядок вычисления (поменять приоритеты) используются круглые скобки как показано ниже
double arg = (25.0 + 60.0)*n/SCALE;
Здесь сначала выполняется операция сложения и только затем операции умножения и деления.
Кроме рассмотренных арифметических операций в С++ имеется полезная операция деления по модулю. Ее результатом является остаток от деления одного целого числа на другое. Так выражение
int a = 13 % 5;
означает, что число 13 делится по модулю 5. Учитывая, что число 5 дважды входит в число 13, то остаток получается равный 3. Эту операцию можно реализовать и на основе стандартных арифметических операций следующим образом:
int a = 13 - 13/5*5;
Следует отметить, что операция целочисленного деления % может быть реализована только для целых чисел и целочисленных переменных и не применима к другим типам данных.
4Операция присваивания, ее различные формы (инкремент, декремент).. Блок оператора и пустой оператор.
Операция присвоения присваивает левому операнду значение правого операнда. Базовой операцией присвоения является "равно" (=), которая присваивает левому операнду значение правого операнда. То есть, x = y присваивает значение у переменной х.
Другие операции присвоения являются аббревиатурами стандартных операций, как видно из таблицы.
Таблица 3.1 Операции присвоения
Аббревиатура |
Значение |
x += y |
x = x + y |
x -= y |
x = x - y |
x *= y |
x = x * y |
x /= y |
x = x / y |
x %= y |
x = x % y |
x <<= y |
x = x << y |
x >>= y |
x = x >> y |
x >>>= y |
x = x >>> y |
x &= y |
x = x & y |
x ^= y |
x = x ^ y |
x |= y |
x = x | y |
Битовые операции
Битовые операции рассматривают свои операнды как 32-битные целые значения (последовательность 0 и 1), а не как 10-ричные, 16-ричные или 8-ричные числа. Например, десятеричное 9 имеет бинарное представление 1001. Битовые операции выполняются над такими двоичными представлениями, но возвращают стандартные числовые значения JavaScript.
В таблице приведены битовые операции JavaScript.
Таблица 3.4 Битовые операции
Операция |
Использование |
Описание |
И |
a & b |
Возвращает 1 в позиции каждого бита, где соответствующий бит обоих операндов равен 1. |
ИЛИ |
a | b |
Возвращает 1 в позиции каждого бита, где соответствующий бит одного или обоих операндов равен 1. |
Исключающее ИЛИ/XOR |
a ^ b |
Возвращает 1 в позиции каждого бита, где соответствующий бит одного, но не обоих, операндов равен 1. |
НЕ |
~ a |
Инвертирует биты операнда. |
Сдвиг влево |
a << b |
Сдвигает операнд a в бинарном представлении на b битов влево, заполняя справа нулями . |
Сдвиг вправо с сохранением знака |
a >> b |
Сдвигает операнд a в бинарном представлении на b битов вправо, отбрасывая смещённые биты. |
Сдвиг вправо с заполнением нулями |
a >>> b |
Сдвигает операнд a в бинарном представлении на b битов вправо, отбрасывая смещённые биты и заполняя слева нулями. |
Битовые логические операции
Концептуально битовые логические операции работают так:
Операнды конвертируются в 32-битные целые и выражаются серией битов (нулей и единиц).
Каждый бит первого операнда образует пару с соответствующим битом второго операнда: первый бит с первым, второй со вторым и т.д.
Операция применяется к каждой паре битов, и результат конструируется побитно.
Например, цифра 9 имеет двоичное/бинарное представление 1001, а цифра 15 - 1111. Поэтому результаты применения битовых операций к этим значениям будут такими:
15 & 9 даст 9 (1111 & 1001 = 1001)
15 | 9 даст 15 (1111 | 1001 = 1111)
15 ^ 9 даст 6 (1111 ^ 1001 = 0110)
Битовые операции сдвига
Операции битового сдвига принимают два операнда: первый это сдвигаемое число, а второй специфицирует количество битовых позиций, на которое сдвигается первый операнд. Направление сдвига контролируется самой операцией.
Операции сдвига конвертируют свои операнды в 32-битные целые числа и возвращают результат того же типа, что и у левого операнда.
Операции сдвига перечислены в следующей таблице.
Таблица 3.5 Операции битового сдвига
Операция |
Описание |
Пример |
<< (Сдвиг влево) |
Эта операция сдвигает влево первый операнд на специфицированное вторым операндом количество битов. Излишние биты, сдвинутые влево, отбрасываются. Справа идёт заполнение нулями. |
9<<2 даёт 36, поскольку 1001, сдвинутое на 2 бита влево, становится 100100, что равно 36. |
>> (Сдвиг вправо с сохранением знака) |
Эта операция сдвигает вправо первый операнд на специфицированное вторым операндом количество битов. Излишние биты, сдвинутые вправо, отбрасываются. Копии левых битов вставляются слева. |
9>>2 даёт 2, поскольку 1001, сдвинутое на 2 бита вправо, становится 10, что равно 2. Аналогично -9>>2 даёт -3, поскольку знак сохраняется. |
>>> (Сдвиг вправо с заполнением нулями) |
Эта операция сдвигает вправо первый операнд на специфицированное вторым операндом количество битов. Излишние биты, сдвинутые вправо, отбрасываются. Слева идёт заполнение нулями. |
19>>>2 даёт 4, поскольку 10011, сдвинутое на 2 бита вправо, становится 100, то есть 4. Для неотрицательных чисел сдвиг вправо с заполнением нулями и сдвиг вправо с сохранением знака дают одинаковые результаты. |