C_Kurs_Lekt / C_I_семестр / 01_Основы языка
.pdfСи. Оосновы языка |
1 |
ОСНОВЫ ЯЗЫКА
Всоставе языка можно выделить
Алфавит языка, или его символы — это основные неделимые знаки, с помощью которых пишутся все тексты на языке.
Лексема, или элементарная конструкция, — минимальная единица языка, имеющая самостоятельный смысл.
Выражение задает правило вычисления некоторого значения
Оператор задает законченное описание некоторого действия.
Для описания сложного действия требуется последовательность операторов, которая может . объединятся в составной оператор, или блок ({…}). В этом случае операторы рассматриваются как один оператор. После каждого оператора ставится знак " ; ".
Операторы бывают исполняемые и неисполняемые. Исполняемые операторы задают действия над данными. Неисполняемые операторы служат для описания данных, поэтому их часто называют операторами описания или просто описаниями.
Каждый элемент языка определяется синтаксисом и семантикой. Синтаксические определения устанавливают правила построения элементов языка, а семантика определяет их смысл и правила использования.
Объединенная единым алгоритмом совокупность описаний и операторов образует программу на алгоритмическом языке
Для того чтобы выполнить программу, требуется перевести ее на язык, понятный процессору — в машинные ко-
ды.
Подготовка исполняемой программы
Этот процесс состоит из нескольких этапов.
Сначала программа передается препроцессору, который ищет в нем специальные директивы препроцессора, содержащиеся в ее тексте (например, директива #include <включаемый_файл> добавляет (или включает) в программу перед фазой компиляции содержимое файла <включаемый_файл>, в котором содержится описания используемых в программе элементов). Хорошим правилом считается - включение в заголовочные файлы объявлений функций (прототипов) без программного кода.
Получившийся полный текст программы поступает на вход компилятора, который выделяет лексемы, а затем на основе грамматики Directory (Рабочий каталог) языка распознает выражения и операторы, построенные из этих лексем. При этом компилятор выявляет синтаксические ошибки и в случае их отсутствия Устроит объектный модуль.
Компоновщик, или редактор связей (Linker), формирует исполняемый модуль программы, подключая к объектному модулю другие объектные модули и библиотечные функции, обращение к которым содержится в программе. Если программа состоит из нескольких исходных файлов, они компилируются по отдельности и объединяются на этапе компоновки. Исполняемый модуль имеет расширение . ехе и запускается на выполнение обычным образом.
Алфавит.
Алфавит языка состоит из следующих символов:
*.C |
Исходный текст |
|
программы |
||
|
||
|
|
|
|
Препроцессор |
|
|
|
|
*.C |
Полный текст |
|
программы |
||
|
||
|
|
|
|
Компилятор |
|
|
(Compiler) |
|
|
|
|
*.OBJ |
Объектный код |
|
программы |
||
|
||
|
|
|
|
Компоновщик |
|
|
(Linker) |
|
|
|
*.EXE Исполняемая программа
прописные и строчные латинские буквы A-Z, a-z и символ подчеркивания;
арабские цифры от 0 до 9;
специальные знаки: + - * / \ = . ; , : ? ! | ' < > [ ] { } ( ) # $ ~ % & ^ ;
пробельные символы: пробел, символы табуляции, символы перехода на новую строку.
Из символов алфавита формируются лексемы языка:
ключевые (зарезервированные) слова;
знаки операций;
идентификаторы;
константы;
строковые_литералы
разделители (скобки, точка, запятая, пробельные символы, знаки пунктуации).
name.c
Directory (Рабочий каталог)
Include directory
Включаемые *.H файлы
name.c
name.obj
Output directory
Library directory
Библиотечные файлы, Код загрузчика
name.exe
Output directory
Границы лексем определяются другими лексемами, такими, как разделители или знаки операций. На этапе компиляции, файл исходного кода подвергается лексическому анализу (т.е. разбиению на лексемы и разделители ( комментарии = разделителями ). При анализе выделяются лексемы максимальной длины. Например, слово external будет рассматриваться как отдельный идентификатор, а не как ключевое слово extern, за которым следует идентификатор al. Или i+++j = i++ +j.
Ключевые слова — это зарезервированные идентификаторы, которые имеют специальное значение для компиля-
тора. Их можно использовать только в том смысле, в котором они определены
Список ключевых слов C auto break case char const continue default do
Си. Оосновы языка |
|
|
2 |
Расширения Borland С/C++ по сравнению со стандаpтным Си: |
|||
cdecl |
far |
huge |
near |
pascal |
interrupt |
|
|
Знак операции — это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и тернарную по количеству участвующих в них операндов. Один и тот же знак может интерпретироваться по-разному в зависимости от контекста.
Таблица приоритетов рангов операций С
Ранг |
Операции |
|
Ассоциативность |
||
1 |
() [] . |
|
-> |
||
2 |
! ~ + - ++ -- & * (тип) sizeof тип() (функциональное преобразо- |
<- |
|||
|
вание типа) |
|
|
||
3 |
* / % (мультипликативные бинарные операции) |
-> |
|||
4 |
+ - (аддитивные бинарные операции) |
-> |
|||
5 |
<< |
>> |
|
|
-> |
6 |
< |
<= |
>= |
> |
-> |
7 |
== |
!= |
|
|
-> |
8 |
& |
|
|
|
-> |
9 |
^ |
|
|
|
-> |
10 |
| |
|
|
|
-> |
11 |
&& |
|
|
|
-> |
12 |
|| |
|
|
|
-> |
13 |
?: (условная операция) |
<- |
|||
14 |
= |
*= |
/= |
%= += -= &= ^= |= <<= >>= |
<- |
15 |
, (операция запятая) |
-> |
Унарные операции
&операция получения адреса операнда;
*операция обращения по адресу, т.е. раскрытия ссылки, иначе операция разыменования. Операндом должен
|
быть адрес; |
- |
унарный минус - изменяет знак арифметического операнда; |
+ |
унарный плюс (введен для симметрии с унарным минусом); |
~ |
поразрядное инвертирование внутреннего двоичного кода целочисленного аргумента (побитовое отрицание); |
! |
логическое отрицание (НЕ) значения операнда; применяется к скалярным операндам; целочисленный резуль- |
|
тат 0 (если операнд ненулевой, т.е. истинный) или 1 (если операнд нулевой, т.е. ложный). В качестве логиче- |
|
ских значений в языке Си++ используют целые числа: 0 - ложь и не нуль (!0) - истина.; |
++увеличение на единицу (инкремент или автоувеличение): префиксная операция - увеличение значения операнда на 1 до его использования; постфиксная операция - увеличение значения операнда на 1 после его ис-
пользования.;
--уменьшение на единицу (декремент или автоуменьшение);
sizeof операция вычисления размера (в байтах) для объекта того типа, который имеет операнд. Разрешены два формата операции: sizeof унарное_выражение и sizeof(тип).
Бинарные операции. Эти операции делятся на следующие группы:
• |
аддитивные; |
• |
мультипликативные; |
• |
сдвигов; |
• |
поразрядные; |
• |
операции отношений; |
• |
логические; |
• |
присваивания; |
• |
выбора компонента структурированного объекта; |
• |
операции с компонентами классов; |
• |
операция "запятая"; |
• |
скобки в качестве операций. |
|
Аддитивные операции: |
+ |
бинарный плюс (сложение арифметических операндов или сложение указателя с целочисленных операндом); |
- |
бинарный минус (вычитание арифметических операндов или сложение указателей); |
|
Мультипликативные операции: |
*умножение операндов арифметического типа;
/деление операндов арифметического типа. При целочисленных операндах абсолютное значение результата округляется до целого;
% получение остатка от деления целочисленных операндов (деление по модулю); Операции сдвига (определены только для целочисленных операндов):
<<сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, рав-
ное значению правого целочисленного операнда;
>>сдвиг вправо битового представления значения левого целочисленного операнда на количество разрядов, рав-
ное значению правого целочисленного операнда; Поразрядные операции:
&поразрядная конъюнкция (И) битовых представлений целочисленных операндов;
| |
поразрядная дизъюнкция (ИЛИ) битовых представлений целочисленных операндов; |
^ |
поразрядное исключающее ИЛИ битовых представлений целочисленных операндов; |
|
Операции отношения (сравнения): |
< |
меньше, чем; |
>больше, чем;
Си. Оосновы языка |
3 |
<= меньше или равно; >= больше или равно;
==равно;
!= |
не равно; |
|
Логические бинарные операции: |
&&конъюнкция (И) арифметических операндов или отношений. Целочисленный результат 0 (ложь) или 1 (истина);
||дизъюнкция (ИЛИ) арифметических операндов или отношений. Целочисленный результат 0 (ложь) или 1
(истина).
Операции присваивания.
В качестве левого операнда в операциях присваивания может использоваться только модифицируемое значение - ссылка на некоторую именованную область памяти, значение которой доступно изменениям.
=присвоить значение выражения-операнда из правой части операнду левой части;
*= |
присвоить операнду левой части произведение значений обоих операндов: р *= 2 эквивалентно Р = Р * 2; |
/= |
присвоить операнду левой части частное от деления значения левого операнда на значение правого: р /= |
|
2.2 – d эквивалентно Р = Р / (2.2 - d); |
%= |
присвоить операнду левой части остаток от деления целочисленного значения левого операнда на целочис- |
|
ленное значение правого операнда: N %=3 эквивалентно N = N % 3; |
+= |
присвоить операнду левой части сумму значений обоих операндов: А += B эквивалентно А = А + B; |
-= |
присвоить операнду левой части разность значений левого и правого операндов: х = 4.3 - z эквивалентно х = |
|
х - (4.3 - z); |
<<= |
присвоить целочисленному операнду левой части значение, полученное сдвигом влево его битового представ- |
|
ления на количество разрядов, равное значению правого целочисленного операнда: a <<= 4 эквивалентно а |
|
= а << 4; |
>>= |
присвоить целочисленному операнду левой части значение, полученное сдвигом вправо его битового пред- |
|
ставления на количество разрядов, равное значению правого целочисленного операнда: а >>= 4 эквивалент- |
|
но а = а >> 4; |
&= |
присвоить целочисленному операнду левой части значение, полученное поразрядной конъюнкцией (И) его |
|
битового представления с битовым представлением целочисленного операнда правой части: е &= 44 эквива- |
|
лентно e = e & 44; |
|= |
присвоить целочисленному операнду левой части значение, полученное поразрядной дизъюнкцией (ИЛИ) его |
|
битового представления с битовым представлением целочисленного операнда правой части: а | = b эквива- |
^= |
лентно а = а | b; |
присвоить целочисленному операнду левой части значение, полученное применением поразрядной операции |
|
|
исключающего ИЛИ к битовым представлениям значений обоих операндов: z ^= х + у эквивалентно z = z ^ |
|
(х + у). |
Для всех операций сокращенная форма присваивания El op= E2 эквивалентна El = El op (Е2),где ор-обозначение операции.
Операции выбора компонентов структурированного объекта:
. (точка) прямой выбир (выделение) компонента структурированного объекта, например объединения. Формат применения операции:
имя_структурированного_объекта.имя_компонента
-> косвенный выбор (выделение) компонента структурированного объекта, адресуемого указателем. При использовании операции требуется, чтобы с объектом был связан указатель. В этом случае формат применения операции имеет вид:
укаэатвль_на_структурированный_объект -> имя_компонента
Запятая в качестве операции:
,несколько выражений, разделенных запятыми, вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самого правого выражения.
Идентификаторы
Идентификатор — это имя программного объекта. В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются. Первым символом идентификатора может быть буква или знак подчеркивания. Пробелы внутри имен не допускаются.
Длина идентификатора по стандарту не ограничена, но Borland C++различат первые 32 символа.. При выборе идентификатора необходимо иметь в виду следующее:
идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка;
не рекомендуется начинать идентификаторы с символа подчеркивания, поскольку они могут совпасть с именами системных функций или переменных, и, кроме того, это снижает мобильность программы;
на идентификаторы, используемые для определения внешних переменных, налагаются ограничения компоновщика.
Константы
Константами называют неизменяемые величины(число, символ или строка символов). В языке Си различают четыре типа констант: целые константы, константы с плавающей точкой, константы-символы и строчные литералы.
Целая константаэто десятичное, восьмеричное или шестнадцатеричное число, которое представляет целую величину.
Константа с плавающей точкойэто действительное десятичное положительное число. Величина действительного числа включает целую, дробную части и экспоненту.
Если требуется отрицательные величины, то необходимо сформировать константное выражение из знака минус и следующей за ним константы. Знак минус рассматривается как арифметическая операция.
Си. Оосновы языка |
4 |
Константа |
Формат |
|
|
|
Примеры |
|
|
|
Целая |
Десятичный: последовательность десятичных цифр, на- |
8, 0, 199226 |
|
|
||||
|
|
чинающаяся не с нуля, если это не число нуль |
|
|
|
|
||
|
|
Восьмеричный: нуль, за которым следуют восьмеричные |
01, 020, 07155 |
|
|
|||
|
|
цифры (0,1,2,3,4,5,6,7) |
|
|
|
|
||
|
|
Щестнадцатеричный: 0х или 0Х, за которым |
следуют |
0хА, 0xlB8, 0X00FF |
||||
|
|
щестнадцатеричные цифры (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, |
|
|
|
|||
|
|
C, D, E, F) |
|
|
|
|
|
|
Вещественная |
Десятичный: [цифры]. [цифры] |
|
5.7, .001, 35. |
|
|
|||
|
|
Экспоненциальный: [циры][.][цифры]{Е]е}[+|-][цифры] |
0.2Е6, .11е-3, 5Е10 |
|
|
|||
Символьная |
Один или несколько символов, заключенных в апостро- |
'А', 'ю', '*', '\0', '\012', '\x07', '\X07' |
||||||
|
|
фы |
|
|
|
|
|
|
Строковая |
Последовательность символов, заключенная в кавычки |
"Здесь был Vasia", "Значение r -\0xF5\n" |
||||||
|
|
|
|
|
|
|
|
|
|
|
|
Диапазоны значений констант |
|
|
Тип данных |
|
|
|
Десятичные |
Восьмеричные |
|
Шестнадцатеричные |
|
|
||
|
от 0 |
|
от 0 |
|
от 0x0 |
|
int |
|
|
до 32767 |
|
до 077777 |
|
до 0x7FFF |
|
|
|
|
- |
|
от 0100000 |
|
от 0x8000 |
|
unsigned int |
|
|
|
|
до 0177777 |
|
до 0xFFFF |
|
|
|
|
от 32768 |
|
от 0200000 |
|
от 0x10000 |
long |
|
|
|
до 2147483647 |
до 017777777777 |
|
до 0x7FFFFFFF |
|
|
||
|
от 2147483648 |
от 020000000000 |
|
от 0x80000000 |
unsigned long |
|
||
|
до 4294967295 |
до 037777777777 |
|
до 0xFFFFFFFF |
|
|
||
|
> 4294967295 |
> 037777777777 |
|
> 0xFFFFFFFF |
ошибка |
|
Если за константой следует суффикс L (или l), то такая константа для целых будет представлена как длинная константа (типа long, например, 3L) или типа long double (для вещественных, например, 3.14L). Аналогичным образом, суффикс U (или u) делает константу беззнаковой (unsigned) для целых. Если численное значение константы превышает десятичное значение 65535 (независимо от используемого основания системы счисления), то такая константа будет иметь тип unsigned long. Суффиксы можно указывать для одной и той же константы в произвольном порядке и набирать в любом регистре: ul, lu, UL и т.д. Также, можно использовать суффикс F (или f) для задания вещественных типа float (например, 3.14А).
Символьные константы - это один или более символов, заключенные в одинарные кавычки Символьные константы в Си занимают два байта и имеют тип int. Величина константы-символа равна значению представляющего ее кода символа.
Символ обратной косой черты используется для представления:
кодов, не имеющих графического изображения (например, \а — звуковой сигнал);
символов апострофа ( ' ), обратной косой черты (\), знака вопроса (?) и кавычки ( " );
любого символа с помощью его шестнадцатеричного (\xhh или \Xhh) или восьмеричного (\ddd) кода, например,
\0xF5 или \073. Числовое значение должно находиться в диапазоне от 0 до 255.
Последовательности символов, начинающиеся с обратной косой черты, называют управляющими, или escapeпоследовательностями, которые позволяют получить визуальное представление некоторых не имеющих графического аналога символы.
Управляющие последовательности в языке C
Изображе- |
Шестнадцатеричный код |
Символ |
Наименование |
ние |
|
|
|
\а |
0x07 |
BEL |
Звуковой сигнал |
\b |
0x08 |
BS |
Возврат на шаг |
\f |
0x0C |
FF |
Перевод страницы (формата) |
\n |
0x07A |
LF |
Перевод строки |
\r |
0x0D |
CR |
Возврат каретки |
\t |
0x09 |
HT |
Горизонтальная табуляция |
\v |
0x0В |
VT |
Вертикальная табуляция |
\\ |
0x05С |
\ |
Обратная косая черта |
\' |
0x027 |
' |
Апостроф |
\" |
0x022 |
" |
Кавычка |
\? |
0x03F |
? |
Вопросительный знак |
\0ddd |
— |
Любые |
Восьмеричный код символа |
\0xddd |
Ddd |
Любые |
Шестнадцатеричный код символа |
Строковый литералэто последовательность букв, цифр и символов, заключенная в двойные кавычки. Строковый литерал рассматривается как массив символов, каждый элемент которого представляет отдельный символ. Хранится в памяти как заданная последовательность символов, плюс конечный пустой символ ('\0'). Нулевая строка хранится в виде одного символа '\0'.
Для расширения строковой константы за границы строки в качестве символа продолжения можно использовать обратную косую черту (\).
Типизированные константы бывают: целые, с плавающей запятой, символьные константы и символьные строки. Константы представляются в виде целого десятичного, восьмиричного или шестнадцатиричного числа. Описание констант начинается с ключевого слова const, далее тип и значение, например const int Nalog=2.
Си. Оосновы языка |
5 |
Комментарий- это последовательность символов, которая воспринимается компилятором как отдельный пробельный символ или, другими словами, игнорируется.
Комментарий имеет следующую форму представления: /*<characters>*/. Для совместимости лучше отделять пробелами.
Пример: |
При анализе даст |
а не |
Необходимо: |
int i = j//* деление на k*/k; |
int i = j ++m; |
int i = j/k; |
int i = j/ /* деление на k*/ k; |
++m; |
|
++m; |
++m; |
Переменные.
Переменная - это поименованная величина, значение которой может изменяться во время выполнения программы.
Переменная принадлежит к определенному типу. |
|
|
------------------------------------------------------------ |
||
Типы целых |
Типы плавающих |
Другие типы |
------------------------------------------------------------ |
||
char |
float |
void |
int |
double |
|
short |
long double |
|
long |
|
|
unsigned char |
|
|
unsigned int |
|
|
unsignet short int |
|
|
unsigned long int |
|
|
----------------------------------------------------------- |
Целые числа представляются целыми типами. Целый тип - это обобщенный тип, представление которого зависит от операционной системы и типа процессора.
Для хранения чисел с дробной частью используется вещественный тип.
Символьный тип - Char предназначен для хранения одного символа, поэтому его размер - один байт.
Основные типы данных
Тип данных |
Размер, бит |
Диапазон значений |
Примечание -назначение типа |
|||
unsigned char |
8 |
(1 байт) |
0. .. |
255 |
|
Небольшие целые числа и коды символов |
signed char |
8 |
(1 байт) |
-128 127. . . |
|
Очень малые целые числа и ASCII-коды |
|
unsigned int |
16 |
(2 байта) |
0... |
65535 |
|
Большие целые и счетчики циклов |
signed short int |
16 |
(2 байта) |
-32768.. .32767 |
|
Небольшие целые, управление циклами |
|
signed int |
16 |
(2 байта) |
-32768.,. 32767 |
Небольшие целые, управление циклами |
||
unsigned long int |
32 |
(4 байта) |
0... |
4294967295 |
Астрономические расстояния |
|
signed long int |
32 |
(4 байта) |
-2147483648... ... |
2147483647 |
Большие .числа, популяции |
|
float |
32 |
(4 байта) |
3.4Е-38 3.4Е+38. . . |
Научные расчеты (7 значащих цифр) |
||
double |
64 |
(8 байт) |
1.7Е-308 1.7Е+308... |
Научные расчеты (15 значащих цифр) |
||
long double |
80 |
(10 байт) |
3.4Е-4932... . . . |
1.1Е+4932 |
Финансовые расчеты (19 значащих цифр) |
-----------------------------------------------------------
Спецификатор типа Сокращение
-----------------------------------------------------------
signed char |
char |
signed int |
signed, int |
signed short int |
short, signed short |
signed long int |
long, signed long |
unsigned char |
- |
unsigned int |
unsigned |
unsigned short int |
unsignet short |
unsignet long int |
unsignet long |
float |
- |
long float |
double |
------------------------------------------------------------
Тип void
Кроме перечисленных, к основным типам языка относится тип void, но множество значений этого типа пусто. Он используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.
Структура программы
Исходная программа на С - это совокупность следующих объектов: директив препроцессора, указаний компилятору, объявлений и определений. Директивы задают действия препроцессора по преобразованию текста программы перед компиляцией. Указания компиляторуэто команды, выполняемые компилятором во время процесса компиляции. Объявления задают имена и атрибуты переменных, функций и типов, используемых в программе. Определенияэто объявления, определяющие переменные и функции.
Определение функции специфицирует ее структуру, которая представляет собой смесь из объявлений и операторов, которые образуют саму функцию. Определение функции также задает имя функции, ее формальные параметры и тип возвращаемой величины.
тип_возвращаемого_значения имя ([ параметры ]){ операторы, составляющие тело функции
}
Как правило, функция используется для вычисления какого-либо значения, поэтому перед именем функции указывается его тип. Если функция не должна возвращать значение, указывается тип void. Тело функции является блоком и, следовательно, заключается в фигурные скобки. Функции не могут быть вложенными.
Каждая программа содержит главную программную функцию. В Си главная программная функция должна быть поименована как main.
Си. Оосновы языка |
6 |
Функция main служит точкой старта при выполнении программы и обычно управляет выполнением программы, организуя вызовы других функций. Программа обычно завершает выполнение по окончанию функции main, хотя она может завершиться и в других точках, в зависимости от окружающей обстановки.
Все функции, включая функцию main, могут быть объявлены с параметрами. Вызываемые функции получают значения параметров из вызывающих функций. Значения параметров функции main могут быть переданы из внешнего окружения. Например, из командной строки.
Соглашение Си требует, чтобы первые два параметра функции main назывались argc и argv. Параметр argc определяет общее число аргументов, передаваемых функции main. Параметр argv объявляется как массив указателей, каждый элемент которого ссылается на строковое представление аргумента, передаваемого функции main. Третий параметр функции main (если он есть) задается с именем envp. Параметр envpэто указатель на массив указателей строковых величин, которые определяют окружение, в котором выполняется программа.
Примеры:
Структура программы, содержащей функции main, fl и f2: |
#include "stdio.h" |
|
директивы препроцессора |
#define MAX |
2450; |
описания |
int main ( int argc, char *argv[]) |
|
int main(){ |
/*int main ( int argc, char **argv) */ |
|
операторы главной функции |
{ |
|
return 0; |
int i; |
|
} |
for (i=0; i<argc; i++) |
|
int fl(){ |
printf("%s ", argv[i]); |
|
операторы функции fl |
printf("\n"); |
|
} |
/* ... |
*/ |
int f2(){ |
return 0; |
|
операторы функции f2 } |
} |
|
Несколько предварительных замечаний о вводе/выводе.
Основные функции ввода/вывода в стиле С:
int scanf (char *format, ... ) // ввод scanf ( строка_управления_форматом, другие_аргументы); int printf(char *format, ... ) // вывод printf ( строка_управления_форматом, другие_аргументы);
Они выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата format. Строка формата содержит символы, которые при выводе копируются в поток (на экран) или запрашиваются из потока (с клавиатуры) при вводе, и спецификации преобразования, начинающиеся со знака %, которые при вводе и выводе заменяются конкретными величинами.
Пример:
#include <stdio.h> int main(){
int i;
printf("Bведите целое число\n"); scanf("%d", &i);
printf("Bы ввели число %d спасибо!", i); return 0; }
Спецификации аргумента начинаются с символа процента (%) и одной буквой, обозначающей тип данных:
-d или i целое десятичное со знаком (для scanfа целое десятичное, шестнадцатеричное, восьмеричное); - u целое число без знака; (для целых спецификаторы l или h преобразуют целое в long и short);
-x или Х целое в шестнадцатеричном формате;. o целое в восьмеричном формате;
- f число с плавающей точкой; - e или E число с плавающей точкой в экспоненциальной форме; - g или G число с плавающей точкой в формате f или e без нулей (незначащих); Модификаторы l – double (lf, le, lg), а L - long double (Lf, Le, Lg);
-Флаги: - (выравнивание по левому краю), +(явный вывод знака), пробел (вывод пробела перед положительным значением при отсутствии спецификации +), 0 (дополнение поля до заданной ширины нулями слева); # (вывод префиксов 0х,0, для e,E,f,g,G – вынуждает печатать десятичную точку для чисел без дробной части; для g,G –отменяет подавление правых нулей);
-%c cимвол; - %s строка;
-%p значение указателя;
-%% - процент;
Ширина поля. %6d - поле общей шириной 6, Значение будет сдвинуто вправо (впереди пробелы). Для вещественных чисел можно указать дробную часть, например %8.4f - поле шириной 8, десятичная часть 4.
%n – сохраняет число символов уже выведенных текущим printf (ничего не выводит). Соответствующий элемент – указатель на целое. printf(“… …. %n”,&y); /* y – int */
В форматной строке можно поставить знаки:
\n перевод строки;. \f (перевод формата или очистка экрана); \t (табуляция); \b (забой <-) \xhhh (вставка символа c кодом ASCII hhh, где hhh содержит от 1 до 3 16-ричных цифр)
Для scanfа %[…] –набор сканирования; %[^…]- инвертированный набор сканирования; * - символ подавления присваивания значения указанного типа (*с или *d).
Переменные и выражения
В любой программе требуется производить вычисления. Для вычисления значений используются выражения, которые состоят из операндов, знаков операций и скобок. Операнды задают данные для вычислений. Операции задают действия, которые необходимо выполнить. Каждый операнд является, в свою очередь, выражением или одним из его частных случаев, например, константой или переменной. Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки.
Рассмотрим составные части выражений и правила их вычисления.
Переменные
Переменная — это именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения программы значение переменной можно изменять. Перед использованием любая переменная должна быть описана.
Си. Оосновы языка |
7 |
Пример описания целой переменной с именем а и вещественной переменной х: int a; float x;
Общий вид оператора описания переменных:
[класс памяти] [const] тип имя [инициализатор];
Рассмотрим правила задания составных частей этого оператора.
Необязательный класс памяти может принимать одно из значений auto, extern, static и register. О них рассказывается чуть ниже Модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют именованной константой, или просто константой. При описании можно присвоить переменной начальное значение, это называется инициализацией.
Инициализатор можно записывать в двух формах — со знаком равенства: = значение или в круглых скобках: ( значение )
Константа должна быть инициализирована при объявлении. В одном операторе можно описать несколько переменных одного типа, разделяя их запятыми.
Примеры: |
|
||
short int a = 1; |
//a целая переменнаяа |
||
const char |
С |
= 'C';: |
//символьная константа С |
char s, sf |
= |
'f'; |
// инициализация относится только к sf |
char t(54);
float с = 0.22, x(3), sum;
Если тип инициализирующего значения не совпадает с типом переменной, выполняются преобразования типа по определенным правилам.
Описание переменной, кроме типа и класса памяти, явно или по умолчанию задает ее область действия. Класс памяти и область действия зависят не только от собственно описания, но и от места его размещения в тексте программы.
Область действия идентификатора — это часть программы, в которой его можно использовать для доступа к связанной с ним области памяти. В зависимости от области действия переменная может быть локальной или глобальной.
Если переменная определена внутри блока (напомню, что блок ограничен фигурными скобками), она называется локальной, область ее действия — от точки описания до конца блока, включая все вложенные блоки. Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл, в котором она определена, от точки описания до его конца.
Класс памяти определяет время жизни и область видимости программного объекта (в частности, переменной). Если класс памяти не указан явным образом, он определяется компилятором исходя из контекста объявления,
Время жизни может быть постоянным (в течение выполнения программы) и временным (в течение выполнения блока).
Областью видимости (блок, функция, файл, прототип функции) идентификатора называется часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью памяти. Чаще всего область видимости совпадает с областью действия. Исключением является ситуация, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия.
Для задания класса памяти используются следующие спецификаторы;
auto — автоматическая переменная. Память под нее выделяется в стеке и при необходимости инициализируется каждый раз при выполнении оператора, содержащего ее определение. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни — с момента описания до конца блока. Для глобальных переменных этот спецификатор не используется, а для локальных он принимается по умолчанию, поэтому задавать его явным образом большого смысла не имеет.
extern — означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены.
static — статическая переменная. Время жизни — постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной. В зависимости от расположения оператора описания статические переменные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны..
register — аналогично auto, но память выделяется по возможности в регистрах процессора. Если такой возможно-
сти у компилятора нет, переменные обрабатываются как auto. |
|||
int а; // 1 глобальная переменная а |
|||
int main(){ |
|
// 2 |
локальная переменная b |
int b; |
|
||
extern int х; // |
3 переменная х определена в другом месте |
||
static int с; |
// 4 локальная статическая переменная с |
||
а = 1; |
|
// 5 |
присваивание глобальной переменной |
int а; |
|
// 6 |
локальная переменная а |
а = 2; |
|
// 7 |
присваивание локальной переменной |
return 0; |
|
|
|
} |
// 9 определение и инициализация х |
||
int х = 4: |
В этом примере глобальная переменная а определена вне всех блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия является вся программа. Область видимости — вся программа, кроме строк 6-8, так как в первой из них определяется локальная переменная с тем же именем, область действия которой начинается с точки ее описания и заканчивается при выходе из блока. Переменные b и с — локальные, область их видимости — блок, но время жизни различно: память под b выделяется в стеке при входе в блок и освобождается при выходе из него, а переменная с располагается в сегменте данных и существует все время, пока работает программа.
Если при определении начальное значение переменных явным образом не задается, компилятор присваивает глобальным и статическим переменным нулевое значение соответствующего типа. Автоматические переменные не инициализируются.
Имя переменной должно быть уникальным в своей области действия (например, в одном блоке не может быть двух переменных с одинаковыми именами).
Си. Оосновы языка |
8 |
Описание переменной может выполняться в форме объявления или определения. Объявление информирует компилятор о типе переменной и классе памяти, а определение содержит, кроме этого, указание компилятору выделить память в соответствии с типом переменной.
Переменная может быть объявлена многократно, но определена только в одном месте программы, поскольку объявление просто описывает свойства переменной, а определение связывает ее с конкретной областью памяти.
|
|
Математические функции - файл math. h |
|
|
|
|
|
|
|
Функ- |
|
Прототип и краткое описание действий |
|
|
ция |
|
|
|
|
abs |
int abs(int i); Возвращает абсолютное значение целого аргумента i. |
|
|
|
acos |
double acos (double х) ; Функция арккосинуса. Значение аргумента должно находиться в диапазоне от-1 до +1. |
|||
asin |
double a» in (double х) ; Функция арксинуса. Значение аргумента должно находиться в диапазоне от -1 до + 1 . |
|||
atan |
double atan (double х) ; Функция арктангенса. |
|
|
|
atan2 |
double atan2 (double у, |
double x) ; Функция арктангенса от значения у/х. |
|
|
cabs |
double cabs (struct complex tnum) ; Вычисляет абсолютное значение комплексного числа znum. Определение |
|||
|
структуры (типа) complex - в файле math . h. |
|
|
|
cos |
double cos (double x) ; Функция косинуса. Угол (аргумент) задается в радианах. |
|
|
|
cosh |
double cosh (double x) ; Возвращает значение гиперболического косинуса х. |
|
|
|
exp |
double exp (double x) ; Вычисляет значение еx (экспоненциальная функция). |
|
|
|
fabs |
double fabs (double x) ; Возвращает абсолютное значение вещественного аргумента х двойной точности. |
|||
floor |
double floor (double х) ; Находит наибольшее целое, не превышающее значения х. Возвращает его в форме |
|||
|
double. floor (9.2)=9; floor (-9.8)=-10; |
|
|
|
ceil |
double ceil (double x); округляет до ближайшего целого не меньшего х. ceil(9.2)=10; |
|
ceil(-9.8)=-9; |
|
fmod |
double fmod (double x, |
double y); Возвращает остаток от деления нацело х на у. fmod(13.657, 2.333)=1.982; |
||
hypot |
double hypot (double х, double у) ; Вычисляет гипотенузу z прямоугольного треугольника по значениям кате- |
|||
|
тов х, у (z2 = х2 + у2) |
|
|
|
labs |
long labs (long x) ; Возвращает абсолютное значение целого аргумента long x. |
|
|
|
ldexp |
double ldexp (double v, |
int e) ; Возвращает значение выражения v 2e. |
|
|
log |
double log (double x) ; Возвращает значение натурального логарифма (ln x). |
|
|
|
logl0 |
double logl0 (double x) ; Возвращает значение десятичного логарифма (log10 x). |
|
|
|
Poly |
double poly (double x, |
int n, double c[ ]); Вычисляет значение полинома: c[n]xn + c[n-1] xn + ... + c[l]x + |
||
|
c[0] |
|
|
|
pow |
double pow (double x, |
double y) ; Возвращает значение xy, т.е. x в степени у. |
|
|
powl0 |
double powl0 (int p) ; Возвращает значение 10Р. |
|
|
|
sin |
double sin (double x) ; Функция синуса. Угол (аргумент) задается в радианах. |
|
|
|
sinh |
double sinh (double x) ; Возвращает значение гиперболического синуса для х. |
|
|
|
sqrt |
|
|
|
. |
double sqrt (double x) ; Возвращает положительное значение квадратного корня |
x |
|||
tan |
double tan (double x) ; Функция тангенса. Угол (аргумент) задается в радианах. |
|
|
|
tanh |
double tanh (double x) ; Возвращает значение гиперболического тангенса для х. |
|
|
|
M_PI |
Число Пи |
|
|
|
M_E |
Число Е |
|
|
|