Время жизни и область видимости программных объектов. Инициализация глобальных и локальных переменных.
Типы данных
В Си/Си++ имеется четыре базовых арифметических (числовых) типа данных. Из них два целочисленных — char, int — и два плавающих (вещественных) — float и double. Кроме того, в программах можно использовать некоторые модификации этих типов, описываемых с помощью служебных слов — модификаторов. Существуют два модификатора размера — short (короткий) и long (длинный) — и два модификатора знаков — signed (знаковый) и unsigned (беззнаковый). Знаковые модификаторы применяются только к целым типам.
Анализируя данные таблицы, можно сделать следующие выводы:
• если не указан базовый тип, то по умолчанию подразумевается int;
• если не указан модификатор знаков, то по умолчанию подразумевается signed;
• с базовым типом float модификаторы не употребляются;
• модификатор short применим только к базовому типу int.
В качестве логических величин в Си/Си++ выступают целые числа. Интерпретация их значений в логические величины происходит по правилу: равно нулю — ложь (в Паскале — false), не равно нулю – истина (в Паскале — true).
Тип данных | Размер (байт) | Диапазон значений |
char | -128...+127 | |
int | -65536…+65535 | |
unsigned char | 0...255 | |
unsigned int | 0…131070 | |
short int | -32768…32767 | |
unsigned short int | 0...65535 | |
long int | -2147483648 ...2147483647 | |
unsigned long int | 0...4294967295 | |
float | ±(3.4Е-38...3.4Е+38) | |
double | ±(1.7Е-308...1.7Е+308) | |
long double | +(3.4Е-4932...1.1Е+4932) |
3) Описание переменных в С++. Описание констант в С++. Пример.
Описание переменных в программах на Си/Си++ имеет вид:
имя_типа список_переменных;
Примеры описаний:
charsymbol,ее;
unsigned charcode;
intnumber,row;
unsigned longlong_number;
float x,X,cc3;
doublee,b4;
long doublemax_num;
Одновременно с описанием можно задать начальные значения переменных. Такое действие называется инициализацией переменных. Описание с инициализацией производится по следующей схеме:
тип имя_переменной = начальное_значение
Например:
floatpi=3.14159,с=1.23; unsigned intyear=2000;
Константы. Запись целых констант. Целые десятичные числа, начинающиеся не с нуля, например: 4, 356, —128.
Целые восьмеричные числа, запись которых начинается с нуля, например: 016, 077.
Целые шестнадцатеричные числа, запись которых начинается с символов Ох, например: OxlA, 0x253, OxFFFF.
Тип константы компилятор определяет по следующим правилам: если значение константы лежит в диапазоне типа int то она получает тип int; в противном случае проверяется, лежит ли константа в диапазоне типа unsigned int, в случае положительного ответа она получает этот тип; если не подходит и он, то пробуется тип long и, наконец, unsigned long: Если значение числа не укладывается в диапазон типа unsigned long, то возникает ошибка компиляции.
Диапазон шестнадцатеричных констант | Диапазон восьмеричных констант | Тип |
0x0-0x7FFF | 0-077777 | Int |
0X8000-0XFFFF | 0100000-0177777 | Unsigned int |
0X10000-0X7FFFFFFF | 0200000-017777777777 | Long |
0X80000000-0XFFFFFFFF | 020000000000-037777777777 | Unsigned long |
Запись вещественных констант. Если в записи числовой константы присутствует десятичная точка (2.5) или экспоненциальное расширение (1Е-8), то компилятор рассматривает ее как вещественное число и ставит ей в соответствие тип double. Примеры вещественных констант: 44. 3.14159 44Е0 1.5Е-4.
использование суффиксов. Программист может явно задать тип константы, используя для этого суффиксы. Существуют три вида суффиксов: F (f) - float; U(u) —unsigned; L(l) — long (для целых и вещественных констант). Кроме того, допускается совместное использование суффиксов l и L в вариантах UL или LU
Примеры:
3.14159F — константа типа float, под которую выделяется 4 байта памяти;
3.14L — константа типа long double, занимает 10 байт;
50000U — константа типа unsigned int, занимает 2 байта памяти (вместо четырех без суффикса);
0LU — константа типа unsigned long, занимает 4 байта;
24242424UL — константа типа unsigned long, занимает 4 байта.
Запись символьных и строковых констант. Символьные константы заключаются в апострофы. Например:'А','а','5',' + '. Строковые константы, представляющие собой символьные последовательности, заключаются в двойные кавычки. Например: "result", "введите исходные данные".
Особую разновидность символьных констант представляют так называемые управляющие символы. Их назначение — управление выводом на экран. Как известно, такие символы расположены в начальной части кодовой таблицы ASCII (коды от 0 до 31) и не имеют графического представления. В программе на Си они изображаются парой символов, первый из которых ' \ '. Вот некоторые из управляющих символов:
' \n' — переход на новую строку;
' \t' — горизонтальная табуляция;
' \а' — подача звукового сигнала;
' \b' – возврат на шаг (на один символ назад)
' \v' – вертикальная табуляция
' \r' – возврат курсора к началу новой строки
' \f' – перевод (прогон) страницы
' \ddd' – символ набора кодов ПВЭМ в восьмеричном представлении
' \xddd' – символ набора кодов ПВЭМ в шестнадцатеричном представлении
Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления:' \ddd'. Здесь ddd - восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления:' \xhh' (или ' \Xhh'), где h — шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглавной латинской букве А, может быть представлена тремя способами
'А', ' \101 ', '\х41' .
Именованные константы (константные переменные). Как и в Паскале, в программе на Си/Си++ могут использоваться именованные константы. Употребляемое для их определения служебное слово const принято называть квалификатором доступа. Квалификатор const указывает на то, что данная величина не может изменяться в течение всего времени работы программы. В частности, она не может располагаться в левой части оператора присваивания. Примеры описания константных переменных:
const float pi=3.14159; const int iMIN=l, iMAX=1000;
Определение констант на стадии препроцессорной обработки программы. Еще одной возможностью ввести именованную константу является использование препроцессорной директивы #defineв следующем формате:
#define <имя константы> <значение константы> Например:
#define iMIN I #define iMAX 1000
Тип констант явно не указывается и определяется по форме записи. В конце директивы не ставится точка с запятой.
На стадии препроцессорной обработки указанные имена заменяются на соответствующие значения. Например, если в программе присутствует оператор
X=iMAX-iMIN; то в результате препроцессорной обработки он примет вид:
Х=1000-1;
При этом идентификаторы iMAX иiMIN не требуют описания внутри программы.
Константы перечисляемого типа. Данное средство языка позволяет определять последовательность целочисленных именованных констант. Описание перечисляемого типа начинается со служебного слова enum,а последующий список констант заключается в фигурные скобки. Например:
enum {A,B,C,D};
В результате имени А будет сопоставлена константа 0, имени В — константа 1,С — 2, D — 3. По умолчанию значение первой константы равно нулю.
Для любой константы можно явно указать значение. Например:
enum {A=10,B,C,D};
к результате будут установлены следующие соответствия: А=10, В=11, C=12, D=13.
Возможен и такой вариант определения перечисления:
enum {A=10,B=20,C=35,D=100};если перечисляемому типу дать имя, то его можно использовать при писании переменных. Например:
enummetal {Fe,Co,Na,Cu,Zn};
metal Metl,Met2; Здесь идентификатор metal становится именем типа (определенным пользователем). После такого описания в программе возможны следующие операторы:Metl=Na; Met2=Zn;
4) Управляющие символы в С++. Запись символьных и строковых констант. Пример.
Особую разновидность символьных констант представляют так называемые управляющие символы. Их назначение — управление выводом на экран. Как известно, такие символы расположены в начальной части кодовой таблицы ASCII (коды от 0 до 31) и не имеют графического представления. В программе на Си они изображаются парой символов, первый из которых ' \ '. Вот некоторые из управляющих символов:
' \n' — переход на новую строку;
' \t' — горизонтальная табуляция;
' \а' — подача звукового сигнала;
' \b' – возврат на шаг (на один символ назад)
' \v' – вертикальная табуляция
' \r' – возврат курсора к началу новой строки
' \f' – перевод (прогон) страницы
' \ddd' – символ набора кодов ПВЭМ в восьмеричном представлении
' \xddd' – символ набора кодов ПВЭМ в шестнадцатеричном представлении
Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления:' \ddd'. Здесь ddd - восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления:' \xhh' (или ' \Xhh'), где h — шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглавной латинской букве А, может быть представлена тремя способами
'А', ' \101 ', '\х41' .
Запись символьных и строковых констант. Символьные константы заключаются в апострофы. Например:'А','а','5',' + '. Строковые константы, представляющие собой символьные последовательности, заключаются в двойные кавычки. Например: "result", "введите исходные данные".
5) Операции в С++. Приоритеты операций и порядок вычислений в С++. Пример.
+ сложение, - вычитание, * умножение, / деление (аналог div), % деление по модулю (аналог mod), ++ -увеличение на единицу(инкремент), -- уменьшение на единицу(декремент), == равно, != не равно, ! не , && логическое умножение(И конъюнкция), & поразрядная конъюнкция, || логическое сложение (ИЛИ дизъюнкция), | поразрядная дизъюнкция, ~ поразрядное отрицание НЕ, ^ поразрядное исключающее ИЛИ
Рассмотрим особенности выполнения операции деления. А делимое и делитель — целые числа, то и результат — целое число в этом случае операция / действует аналогично Div в Паскале, например, значение выражения 5/3 будет равно 2, а при вычислении 1/5 получится 0.
Если хотя бы один из операндов имеет вещественный тип, то и результат будет вещественным. Например, операции 5./3, 5./3., 5/3. дадут вещественный результат 1.6666.
Операции инкремента и декремента могут применяться только к переменным и не могут — к константам и выражениям. Оба знака операции мол, записываться как перед операндом (префиксная форма), таи после операнда (постфиксная форма), например: ++Х или Х++. Три следующих оператора дают один и тот же результат:
х=х+1; х++; ++х.
Различие проявляется при использовании префиксной и постфиксной форм в выражениях. Проиллюстрируем это на примерах. Первый пример:
а=3; b=2;
с=а++*b++;
В результате выполнения переменные получат следующие значения: а =4, b=3, с= 6. Второй пример:
а=3; b=2;
с=++а*++b;
Результаты будут такими: а = 4, b = 3, с = 12.
Операции отношения.>, <, >=, <= Как уже говорилось раньше, в стандарте Си нет логического типа данных. Поэтому результатом операции отношения является целое число: если отношение истинно — то 1, если ложно — то 0. Примеры отношений:
а<0, 101>=105, 'а'=='А, 'а'! = 'А'
Результатом второго и третьего отношений будет 0 — ложь; результат четвертого отношения равен 1 — истина; результат первого отношения зависит от значения переменной а.
Логические операции. Логическое выражение, соответствующее системе неравенств 0 < х < 1 в программе на Си запишется в виде следующего логического выражения:
х>0 && х<1
Операция присваивания. может несколько раз входить в выражение. например:
а=b=с=х+у;
В языке Си имеются дополнительные операции присваивания, совмещающие присваивание с выполнением других операций. Среди них: +=, -=, /=, *=, %=. Приоритет у них такой же, как и у простого присваивания. Примеры использования этих операций: I
а+=2 эквивалентно а=а+2,
х-=а+b эквивалентно х=х-(а+Ь),
р /=10 эквивалентно р=р /10,
m*=n эквивалентно m=m*n,
г%=5 эквивалентно г=г%5.
Заметим, что вместо выражения а=а+2 предпочтительнее писать в программе а+=2, поскольку второе выражение будет вычисляться быстрее.
Операция явного преобразования типа (операция «тип»). Применение этой операции имеет следующий формат:
(имя_типа) операнд
Операндом могут быть константа, переменная, выражение в результате значение операнда преобразуется к указанному типу Примеры использования преобразования типа:
(long)8, (float)1, (int)x%2
Например:
float с;
int a=l, b=2;
с=(float)a/b;
В результате переменная с получит значение 0,5. Без преобразования типа ее значение стало бы равно 0.
Операция sizeof. Эта операция имеет две формы записи:
sizeof(выражение) sizeof(тип)
Результатом операции является целое число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Последняя определяется также по типу результата выражения.
Пример:
sizeof(int) результат — 2
sizeof(1) результат — 2
sizeof (0.1) результат — 8
sizeof(1L) результат — 4
sizeof(char) результат — 1
sizeof('a') результат — 2
Операция «запятая». Эта необычная операция используется для связывания нескольких выражений в одно. Несколько выражений, Разделенных запятыми, вычисляются последовательно слева направо. В качестве результата такого совмещенного выражения принимается значение самого правого выражения. Например, если беременная х имеет тип int, то значение выражения (Х=3, 5*х) Будет равно 15, а переменная х примет значение 3.
Операция «условие ?:». Это единственная операция, которая имеет три операнда. Формат операции:
выражение1 ? выражение2 : выражениеЗ
Данная операция реализует алгоритмическую структуру ветвления. Алгоритм её выполнения следующий: первым вычисляется значение выражения 1, которое обычно представляет собой некоторое условие. Если оно истинно, т. е. не равно 0, то вычисляете выражение 2 и полученный результат становится результатом операции. В противном случае в качестве результата берется значение выражения 3.
Пример 1.Вычисление абсолютной величины переменной Я можно организовать с помощью одной операции:
Х<0 ? -X : X;
Пример 2.Выбор большего значения из двух переменных а и b
max=(a<=b)?b:a;
Пример 3.Заменить большее значение из двух переменных а и b на единицу:
(a>b)?a:b=l;
Операции( ) и [ ].В языке Си круглые и квадратные скобки рассматриваются как операции, причем эти операции имеют наивысший приоритет. Их смысл будет раскрыт позже.
6) Операция преобразования типа. Операция sizeof. Пример.
Операция явного преобразования типа (операция «тип»). Применение этой операции имеет следующий формат:
(имя_типа) операнд
Операндом могут быть константа, переменная, выражение в результате значение операнда преобразуется к указанному типу Примеры использования преобразования типа:
(long)8, (float)1, (int)x%2
Например:
float с;
int a=l, b=2;
с=(float)a/b;
В результате переменная с получит значение 0,5. Без преобразования типа ее значение стало бы равно 0.
Операция sizeof. Эта операция имеет две формы записи:
sizeof(выражение) sizeof(тип)
Результатом операции является целое число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Последняя определяется также по типу результата выражения.
Пример:
sizeof(int) результат — 2
sizeof(1) результат — 2
sizeof (0.1) результат — 8
sizeof(1L) результат — 4
sizeof(char) результат — 1
sizeof('a') результат — 2
7) Операнды в С++. Операции отрицания и дополнения. Пример.
Операнд — это сущность, с которой оператор выполняет какие-либо действия.
Операция арифметического отрицания (-) вырабатывает отрицание своего операнда. Операнд должен быть целой или плавающей величиной. При выполнении осуществляются обычные арифметические преобразования.
Пример:
double u = 5; u = -u; /* переменной u присваивается ее отрицание, т.е. u принимает значение -5 */
Операция логического отрицания "НЕ" (!) вырабатывает значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю (0). Результат имеет тип int. Операнд должен быть целого или плавающего типа или типа указатель.
Операция двоичного дополнения (~) вырабатывает двоичное дополнение своего операнда. Операнд должен быть целого типа. Осуществляется обычное арифметическое преобразование, результат имеет тип операнда после преобразования.
Пример:
char b = '9'; unsigned char f; b = ~f;
Шестнадцатеричное значение символа '9' равно 39. В результате операции ~f будет получено шестнадцатеричное значение С6, что соответствует символу 'ц'.
8) Операции разадресации и адреса в С++. Пример.
Операция разадресации (*) осуществляет косвенный доступ к адресуемой величине через указатель. Операнд должен быть указателем. Результатом операции является величина, на которую указывает операнд. Типом результата является тип величины, адресуемой указателем. Результат не определен, если указатель содержит недопустимый адрес.
Рассмотрим типичные ситуации, когда указатель содержит недопустимый адрес:
· указатель является нулевым;
· указатель определяет адрес такого объекта, который не является активным в момент ссылки;
· указатель определяет адрес, который не выровнен до типа объекта, на который он указывает;
· указатель определяет адрес, не используемый выполняющейся программой.
Операция адрес (&) дает адрес своего операнда. Операндом может быть любое именуемое выражение. Имя функции или массива также может быть операндом операции «адрес», хотя в этом случае знак операции является лишним, так как имена массивов и функций являются адресами. Результатом операции адрес является указатель на операнд. Тип, адресуемый указателем, является типом операнда.
Примеры:
int t, f=0, * adress; adress = &t /* переменной adress, объявляемой как указатель, присваивается адрес переменной t */ * adress =f; /* переменной находящейся по адресу, содержащемуся в переменной adress, присваивается значение переменной f, т.е. 0 , что эквивалентно t=f; т.е. t=0; */ |
9) Мультипликативные операции в С++. Пример
Мультипликативные операции *, / и % группируют слева направо. Выполняются обычные арифметические преобразования.
мультипликативное_выражение: выражение * выражение выражение / выражение выражение % выражение
Бинарная операция * определяет умножение. Операция * ассоциативна и выражения с несколькими умножениями на одном уровне могут быть реорганизованы компилятором. Бинарная операция / определяет деление. При делении положительных целых округление осуществляется в сторону 0, но если какой-либо из операндов отрицателен, то форма округления является машинной зависимой. На всех машинах, охватываемых данным руководством, остаток имеет тот же знак, что и делимое. Всегда истинно, что (a/b)*b + a%b равно a (если b не 0).
Бинарная операция % дает остаток от деления первого выражения на второе. Выполняются обычные арифметические преобразования. Операнды не должны быть числами с плавающей точкой.
10) Операции сдвига. Логические операции в С++. Пример.
Операции сдвига осуществляют смещение операнда влево (<<) или вправо (>>) на число битов, задаваемое вторым операндом. Оба операнда должны быть целыми величинами. Выполняются обычные арифметические преобразования. При сдвиге влево правые освобождающиеся биты устанавливаются в нуль. При сдвиге вправо метод заполнения освобождающихся левых битов зависит от типа первого операнда. Если тип unsigned, то свободные левые биты устанавливаются в нуль. В противном случае они заполняются копией знакового бита. Результат операции сдвига не определен, если второй операнд отрицательный.
Преобразования, выполненные операциями сдвига, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат операции сдвига не может быть представлен типом первого операнда, после преобразования.
Отметим, что сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду.
Примеры:
int i=0x1234, j, k ; k = i<<4 ; /* k="0x0234" */ j="i<<8" ; /* j="0x3400" */ i="j">>8 ; /* i = 0x0034 */ |
Операция присваивания. может несколько раз входить в выражение. например: а=b=с=х+у;
В языке Си имеются дополнительные операции присваивания, совмещающие присваивание с выполнением других операций. Среди них: +=, -=, /=, *=, %=. Приоритет у них такой же, как и у простого присваивания. Примеры использования этих операций: I
а+=2 эквивалентно а=а+2,
х-=а+b эквивалентно х=х-(а+Ь),
р /=10 эквивалентно р=р /10,
m*=n эквивалентно m=m*n,
г%=5 эквивалентно г=г%5.
Заметим, что вместо выражения а=а+2 предпочтительнее писать в программе а+=2, поскольку второе выражение будет вычисляться быстрее.
int i=0x1234, j, k ;
k = i<<4 ; /* k = 0x0234 */
j = i<<8 ; /* j = 0x3400 */
i = j>>8 ; /* i = 0x0034 */
Логические операции.
К логическим операциям относятся операция логического И (&&) и операция логического ИЛИ (||). Операнды логических операций могут быть целого типа, плавающего типа или типа указателя, при этом в каждой операции могут участвовать операнды различных типов.
Операнды логических выражений вычисляются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, то второй операнд не вычисляется.
Логические операции не вызывают стандартных арифметических преобразований. Они оценивают каждый операнд с точки зрения его эквивалентности нулю. Результатом логической операции является 0 или 1, тип результата int.
Операция логического И (&&) вырабатывает значение 1, если оба операнда имеют нулевые значения. Если один из операндов равен 0, то результат также равен 0. Если значение первого операнда равно 0, то второй операнд не вычисляется.
Операция логического ИЛИ (||) выполняет над операндами операцию включающего ИЛИ. Она вырабатывает значение 0, если оба операнда имеют значение 0, если какой-либо из операндов имеет ненулевое значение, то результат операции равен 1. Если первый операнд имеет ненулевое значение, то второй операнд не вычисляется.
К логическим операциям относятся операция логического И (&&) и операция логического ИЛИ (||).
Логическое выражение, соответствующее системе неравенств 0 < х < 1 в программе на Си запишется в виде следующего логического выражения:
х>0 && х<1
11) Простое присваивание. Составное присваивание в С++. Пример.
Операция простого присваивания используется для замены значения левого операнда, значением правого операнда. При присваивании производится преобразование типа правого операнда к типу левого операнда по правилам, упомянутым раньше. Левый операнд должен быть модифицируемым.
Пример:
int t;
char f;
long z;
t=f+z;
Значение переменной f преобразуется к типу long, вычисляется f+z ,результат преобразуется к типу int и затем присваивается переменной t.
Кроме простого присваивания, имеется целая группа операций присваивания, которые объединяют простое присваивание с одной из бинарных операций. Такие операции называются составными операциями присваивания и имеют вид:
(операнд-1) (бинарная операция) = (операнд-2) .
Составное присваивание по результату эквивалентно следующему простому присваиванию:
(операнд-1) = (операнд-1) (бинарное операция) (операнд-2) .
Отметим, что выражение составного присваивания с точки зрения реализации не эквивалентно простому присваиванию, так как в последнем операнд-1 вычисляется дважды.
Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операцией. Левым операндом операций (+=) (-=) может быть указатель, в то время как правый операнд должен быть целым числом.
Примеры:
double arr[4]={ 2.0, 3.3, 5.2, 7.5 } ; double b=3.0; b+=arr[2]; /* эквивалентно b=b+arr[2] */ arr[3]/=b+1; /* эквивалентно arr[3]=arr[3]/(b+1) */
Заметим, что при втором присваивании использование составного присваивания дает более заметный выигрыш во времени выполнения, так как левый операнд является индексным выражением.
Исходные файлы и объявление переменных.
Обычная СИ-программа представляет собой определение функции main, которая для выполнения необходимых действий вызывает другие функции. Приведенные выше примеры программ представляли собой один исходный файл, содержащий все необходимые для выполнения программы функции. Связь между функциями осуществлялась по данным посредством передачи параметров и возврата значений функций. Но компилятор языка СИ позволяет также разбить программу на несколько отдельных частей (исходных файлов), оттранслировать каждую часть отдельно, и затем объединить все части в один выполняемый файл при помощи редактора связей.
При такой структуре исходной программы функции, находящиеся в разных исходных файлах могут использовать глобальные внешние переменные. Все функции в языке Си по определению внешние и всегда доступны из любых файлов.
Для того, чтобы определяемая функция могла выполнять какие либо действия, она должна использовать переменные. В языке СИ все переменные должны быть объявлены до их использования. Объявления устанавливают соответствие имени и атрибутов переменной, функции или типа. Определение переменной вызывает выделение памяти для хранения ее значения. Класс выделяемой памяти определяется спецификатором класса памяти, и определяет время жизни и область видимости переменной, связанные с понятием блока программы.
Комментарии в языке Си
В языке Си для комментариев используются символы
/* - начало комментария;
*/ - конец комментария.
Вся последовательность, заключенная между этими символами, является комментарием.
Это удобно для написания многострочных комментариев:
int a; /* целая
переменная */
Многострочные комментарии также удобно использовать при отладке для сокрытия от выполнения части кода.
В дополнение к этому, для написания коротких комментариев могут использоваться символы //. При этом комментарием является все, что расположено после символов // и до конца строки:
float b; // вещественная переменная
Директивы препроцессора, такие как #define и #ifdef, обычно используются для того, чтобы облегчить изменение исходного кода программ и их компиляцию в разных средах выполнения. Директивы в файле исходного кода позволяют препроцессору выполнять определенные действия. Например, препроцессор может заменять токены в тексте, вставлять содержимое других файлов в файл исходного кода или отключать компиляцию части файла путем удаления разделов текста. Строки препроцессора распознаются и выполняются до расширения макросов. Поэтому если макрос разворачивается в нечто, похожее на команду препроцессора, эта команда не распознается препроцессором.
Препроцессор распознает следующие директивы:
#define | #error | #import | #undef |
#elif | #if | #include | #using |
#else | #ifdef | #line | #endif |
#ifndef | #pragma |
Функции всегда определяются глобально. Они могут быть объявлены с классом памяти static или extern. Объявления функций на локальном и глобальном уровнях имеют одинаковый смысл.
Правила определения области видимости для функций отличаются от правил видимости для переменных и состоят в следующем.
1. Функция, объявленная как static, видима в пределах того файла, в котором она определена. Каждая функция может вызвать другуюфункцию с классом памяти static из своего исходного файла, но не может вызвать функцию определенную с классом static в другом исходном файле. Разные функции с классом памяти static имеющие одинаковые имена могут быть определены в разных исходных файлах, и это не ведет к конфликту.
2. Функция, объявленная с классом памяти extern, видима в пределах всех исходных файлов программы. Любаяфункция может вызывать функции с классом памяти extern.
3. Если в объявлении функции отсутствует спецификатор класса памяти, то по умолчанию принимается класс extern.
15) Линейные алгоритмы в С++. Спецификатор формата. Пример.
Линейными называются алгоритмы, процесс пошагового выполнения которых можно изобразить прямой линией – сверху вниз.
Пример. Дано двухзначное целое число b. Найти сумму его цифр.
Текстуальная форма алгоритма задачи:
1) Ввести число b с клавиатуры в ЭВМ;
2) Для выделения первой цифры воспользуемся известным в математике способом деления числа b на 10, и возьмем целое число от этого деления;
3) Для выделения второй цифры разделим число b на 10, и возьмем дробную часть от этого деления;
4) Найдем сумму найденных цифр;
5) Полученный результат выдать на экран дисплея.
Графическая форма представления алгоритма дана в виде схемы (рис. 2), использующей блоки для обозначения каждого действия и приведен текст программы.
Перед спецификаторами формата ввода ставится знак %, и они сообщают функции scanf() о типе далее читаемых данных. Эти спецификаторы перечислены в таблице. Спецификаторы формата рассматриваются слева направо, и в таком же порядке с ним сопоставляются аргументы из списка аргументов.
Код | Значение |
%c %d %i %е %f %g %о %s %x %р %n %u %[] | Читает одиночные символы Читает десятичное число Читает десятичное число Читает число с плавающей запятой Читает число с плавающей запятой Читает число с плавающей запятой Читает восьмеричное число Читает строку Читает шестнадцатиричное число Читает указатель Получает целочисленное значение, равное числу прочитанных символов Читает беззнаковое целое Сканирует множество символов |
16) Форматированный ввод и вывод на экран в С++. Потоковый ввод и вывод на экран в С++.
Для организации форматированного потокового ввода-вывода в Си++ существуют два средства:
• применение функций-членов класса ios для управления флагами форматирования;
• применение функций-манипуляторов.
Управление флагами форматирования. Флаги форматирования — двоичные коды, управляющие форматом выводимых значений. В заголовочном файле iostream.h определено следующее перечисление, задающее флаги форматирования:
В языке С++ был разработан другой способ ввода/вывода с использованием так называемых потоков ввода и вывода.
Для того чтобы использовать стандартные потоки для ввода и вывода, необходимо включить заголовочный файл <iostream>. Для ввода используется операция >>, для вывода – операция <<. Компилятор определяет тип вводимой/выводимой переменной и соответствующим образом форматирует её.
#include <iostream> using namespace std; | |
cin >> x; | // Ввод значения в переменную x из стандартного потока cin |
cout << x; | // Вывод значения переменной x в стандартный поток cout |
cin >> x >> y; | // Ввод двух переменных |
cout << "x = " << x << "\ny = " << y << endl; | // Функция endl осуществляет перевод строки |
Если при вводе или выводе произошла ошибка, в переменной состояния потока устанавливается соответствующий флаг. Проверить его значение можно с помощью функции fail.
cin >> x; if (cin.fail()) cout << "Произошла ошибка при вводе\n"; |
17) Принятие решений. Условные операторы в С++. Пример.
Условный оператор.Формат условного оператора следующий:
if (выражение) оператор1; else оператор2;
Это полная форма оператора, программирующая структуру полного ветвления. Обычно выражение — это некоторое условие, содержащее операции отношения и логические операции. Значение выражения приводится к целому и интерпретируется в соответствии с правилом: равно нулю — ложь, не равно нулю — истина. Если выражение истинно, выполняется оператор1, если ложно — оператор2.
Необходимо обратить внимание на следующие особенности синтаксиса условного оператора:
* выражение записывается в круглых скобках;
точка с запятой после оператора 1 ставится обязательно.
Условный оператор if может использоваться в форме полной или неполной развилки.
В С++ есть условная операция, очень похожая на условный оператор выбора if else. Условная операция «? :» называется тернарной операцией (то есть трёхместная (имеет три операнда), единственная в C++).
Форма записи тернарной операции в C++
"условие" ? "выражение 1" : "выражение 2";
Если условие истинно, то выполняется выражение 1, иначе (условие ложно) выполняется выражение 2.
Пример:
a > b ? cout << a : cout << b; // если а > b, то выполняется cout << a, иначе выполняется cout << b |
Таким образом, если, а > b напечатать а, иначе напечатать b. То есть, программа печатает большее из чисел. Использование условной операции может в некоторых случаях упрощать код, тогда как воспользоваться оператором if else таким же образом не возможно. Вернёмся к старой задаче из раздела Оператор выбора if else, напомню условие данной задачи.
18) Разветвляющиеся алгоритмы в С++. Пример.
Разветвляющимся является алгоритм, если последовательность выполнения шагов решения задачи изменяется в зависимости от некоторых условий. Условие – это логическое выражение, принимающее одно из двух значений: «Да» – если условие верно и «Нет» – если условие неверно, – и которое может содержать логические операции и знаки отношений.
Рис. 1 иллюстрирует структурные схемы разветвляющихся алгоритмов укороченной (а) и полной (б) формы.
Рисунок 1. Схемы разветвляющихся алгоритмов
Разветвляющиеся алгоритмы оформляются операторами полной или укороченной формы (табл. 1). В условном операторе выполняется всегда одна из веток («Да» при истинном условии или «Нет», если оно ложно), и никогда не выполняются обе вместе.
Таблица 1. Формы записи операторов условного перехода
Форма записи | Структура оператора |
краткая | if (условие) { операторы-Да } |
полная | if (условие) { операторы-Да; } else { операторы-Нет} |
К условным операторам относится оператор выбора или оператор переключатель (табл. 2), который замечателен тем, что может заменить вложенные операторы условия.
Таблица 2. Оператор выбора (или оператор-переключатель)