Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C_Kurs_Lekt / C_I_семестр / 01_Основы языка

.pdf
Скачиваний:
10
Добавлен:
13.02.2016
Размер:
296.8 Кб
Скачать
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void while volatile

Си. Оосновы языка

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

Число Е