В этом разделе приводится обзор программ на языке C и описание их выполнения. Также здесь приводятся термины и функции, важные для понимания программ и компонентов на языке C. В разделе рассматриваются следующие темы.
- Файлы с исходным кодом и исходные программы
- Функция main и выполнение программ
- Анализ аргументов командной строки
- Время существования, область, видимость и компоновка
- Пространства имен
Поскольку в этом разделе приводятся общие сведения, в указанных выше темах представлен лишь вводный материал. Для получения дополнительных сведений см. соответствующие перекрестные ссылки.
Источник: learn.microsoft.com
СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ СИ
Рассмотрим внешнюю (текстовую) и внутреннюю (.exe файл) структуру.
Программа на языке Си определяется как совокупность одного или нескольких модулей. Модуль – это самостоятельно компилируемый файл. Модуль содержит одну или несколько функций. Одна из главных функций всегда имеет имя main (). Функция состоит из операторов языка Си, с помощью которых описываются действия, выполняемые функцией.
2. Структура программы на языке С++
См. рис.1.
Рис.1 Структура программы на языке Си.
Внутренняя структура программы
Исполняемая программа на Си состоит из 4 частей: область команд, область статических данных, область динамических данных, область стека. см. Рис.2.
1. Область команд содержит машинные команды; инструкции, которые должен выполнить микропроцессор.
2. Область статических данных для хранения переменных, с которыми работает программа;
3. Область динамических данных для размещения дополнительных данных, которые появляются в процессе работы программы (например, временных переменных).
4. Стек используется для временного хранения данных и адресов возврата из функций.
Рис.2. Внутренняя структура программы на Си.
При записи данных стек растет в сторону уменьшения адресов, а область динамических данных – в сторону увеличения адресов.
Пример программы на СИ
заголовок void main (void)
тело функции /*тело функции*/
1-я строка – директива, подключающая заголовочный файл стандартного ввода-вывода. Операторов в Си мало, но есть библиотека функций. Чтобы их использовать надо их подключить, что и делает директива – 1-я строка программы. Символ # указывает, что строка должна быть обработана препроцессором языка Си.
2-я строка – имя главной функции main (), эта функция не возвращает никаких параметров (об этом буду говорить немного позже). Программа Си всегда имеет функцию main(). С нее начинается выполнение программы.
3-я строка – начало тела функции. <> определяют тело функции (в Паскале — это begin и end)
4-я строка – комментарий, он не компилируется, а только поясняет что делается.
5-я строка – библиотечная функция – печатать на экране, выражение в скобках на этой строке – параметр функции, он всегда берётся в кавычки.
[C++ Урок 1] Структура программы
; — это признак оператора Си, это часть оператора, а не разделитель операторов, как в Паскале.
Советы, как сделать программу читаемой:
1) Выбирать осмысленные имена
2) Использовать комментарии
3) Использовать пустые строки для того, чтобы отделить одну часть функции от другой
4) Помещать каждый оператор в другой строке.
БАЗОВЫЕ ЭЛЕМЕНТЫ ЯЗЫКА СИ
Рассмотрим обязательные элементы, с помощью которых должна оформляться программа на Си:
1. Комментарии – используются для документирования программы. Любая программа должна содержать комментарии: какой алгоритм применяется, что делает программа…
Ø 1 способ: /* Текст */ — в любом месте программы.
Как только компилятор встречает /**/, он их пропускает. Компилятор игнорирует /* */, так как он не в состоянии интерпретировать язык, отличающийся от языка Си. То есть, если вы хотите исключить из компиляции какую-то строку, то заключите её в /**/.
Ø 2 способ: если комментарий большой, то используем такой тип
/* Строка 1 — для комментария любой длины
Ø 3 способ: // — текст до конца строки.
2. Идентификатор — это имя, которое присваивается какому-либо объекту (переменной). Используются строчные и прописные буквы, цифры и знак подчёркивания. Строчные и прописные буквы различаются. (В Бейсике не различаются). Если назвать переменную name, Name или NAME, то это будут разные переменные.
Начинаются идентификаторы с буквы или знака подчеркивания. Например, _name. Но не рекомендуется начинать с _, так как этот знак используется для глобальных имен сомого языка Си.
В современном программировании часто используется для создания идентификаторов Венгерская нотация, где используются определенные символы, характеризующие идентификатор, например:
b – байт; ch – однобайтовый символ;
w – слово; f – флаг;
l – длинное слово; fn – функция;
u – беззнаковое; p – указатель;
с – счетчик; d – разность двух пре-х
cz – строка; и т.д.
3. Служебные слова – это слова, с которыми в языке жестко сопоставлены определённые смысловые значения и которые не могут быть использованы для других целей. Это имена операторов, библиотечных функций, команды препроцессора и так далее. Этим слова нельзя использовать для создания имен своих функций, переменных…
ДАННЫЕ В ПРОГРАММЕ НА СИ
Каждая программа оперирует с данными. Они присутствуют в программе в виде переменных и констант.
Данные, которые могут изменяться или которым может присваиваться значения во время выполнения программы, называются переменными.
Данные, которым устанавливаются определенные значения и они сохраняют свои значения на всем протяжении работы программы, называются константами.
Константы
Константы — это фиксированные значения. Значение, будучи установлено, больше не меняется. Константы бывают различных типов. Типы отличаются по принципу размещения в памяти ЭВМ, а для человека по виду записи. В Си существует 7 ключевых слов, используемых для указания на различные типы данных: int, long, short, unsigned, char, float, double.
Типы констант:
a) Целые и длинные целые. Записываются в десятичной, восьмеричной и шестнадцатеричной системе счисления. Они могут быть знаковые и беззнаковые.
Десятичная система: целые константы занимают 16 бит памяти, и принимают диапазон значений: — 32768 до +32767 (2 15 ). Если константа беззнаковая, то диапазон удваивается: 0 до 65535 (за счет того, что 15-й разряд – знаковый используется под число). Для обозначения беззнакового числа используют суффикс u (unsigned), например 123u.
Если число больше 40000, то компилятор автоматически преобразует его в отрицательное число, поэтому суффикс u обязателен:40000u. В примере 123u компилятору все равно – есть суффикс или его нет, так как это число входит в диапазон 32767.
Длинное целое занимает 32 бита, диапазон значений
± 2147483648 (знаковое длинное – long). Если вы поставили суффикс l, то, несмотря на число, будет занято 32 бита. Например: -5326 l
0 – 4294967295 беззнаковое длинное — (unsigned long). Диапазон увеличивается за счет 31-го бита. Используются суффиксы ul, например, 32659ul.
Если число начинается с цифры 0, оно интерпретируется как восьмиричное число
16 битов 0 ¸ 077777
32 бита 0200000 ¸ 01777777777l
Если число начинается с символа 0х, то оно интерпретируется как шестнадцатиричное
16 битов 0x0000 ¸ 0x7FFF
32 бита 0x10000 ¸ 0x7FFFFFFFl
b) Вещественные константы. Это числа с плавающей точкой. Значение имеет дробную часть. По умолчанию все вещественные константы имеют тип двойной точности double. Занимают в памяти 8 байт (даже если 0,0). Диапазон значений ±1*10 ± 307 , можно записать и в научной форме, например: 0,5е+15 или
1,2е-3=1,2*10 -8 =0,0012.
Принудительно можно задать формат одинарной точности float. Число будет занимать 4 байта, используется суффикс f (5.7 f). Соответсвенно диапазон сужается ±1*10 ± 37
А также расширенной точности – long double – 10 байт. (3.14L)
Знак + можно не писать. Разрешается опускать либо десятичную точку, либо экспоненциальную часть, но не одновременно (.2; 4е16). Можно не писать дробную либо целую часть, но не одновременно (100.;.8е-5)
c) Символьные константы. Это набор символов, используемых в ЭВМ.
Делятся на 2 группы: печатные и не печатные (управляющие коды). Символьная константа включает в себя только 1 символ, который необходимо заключить в апострофы и занимает 1 байт памяти.
Любой символ имеет своё двойное представление в таблице ASCII. В программе символьные константы вводятся в одинарных кавычках, при компиляции в программу подставляется числовое значение символа из ASCII. Один символ занимает 1 байт.
Его код 65 97 32 10
Как целый тип данных ‘A’=01018, 010000012, 4116, 6510. Коды запоминать не надо.
Управляющие коды начинаются с символа и тоже заключаются в апострофы. Наиболее распространенные управляющие коды:
n – переход на новую строку
t – табуляция (сдвиг курсора на некоторое фиксированное значение)
b – шаг назад (сдвиг на одну позицию назад)
r – возврат каретки (возврат к началу строки)
f – подача бланка (протяжка бумаги на 1 страницу)
Последние три знака могут выступать символьными константами, а также применяться в функции printf(), поэтому применение их в качестве символов может привести к ошибке. Например, если мы хотим вывести строку «Символ называется слеш», то оператор должен выглядеть так:
рrintf(«Символ \ называется слеш»);
a) Строковые константы — содержат последовательность из 1 и более символов, заключённых в » «. Расходуется по 1 байту на любой символ + 1байт на так называемый ноль-символ — признак конца строки. Ноль-символ – не цифра ноль, он означает, что количество символов в строке (N) должно быть на 1 байт больше (N+1), чтобы обозначать конец строки (компилятор его прибавляет сам автоматически). Например: «строка текста» занимает (13+1) байт;
Источник: zdamsam.ru
Структура программы на языке Си
#include <системные .h файлы>// директива препроцессора вставляет текст
// внешнего файла
#include “пользовательские .h файлы” // директива препроцессора
#define аргумент1 аргумент2 // директива выполнения макроописаний
#include
// требуется для setlocale
Необязательный раздел описания вспомогательных функций (прототипы
функций)
Раздел описания глобальных данных
int main()
// заголовок основной функции
< setlocale(LC_ALL,»Russian»); // русификация вывода информации на экран
Раздел описания локальных данных
операторы языка Си
вызовы вспомогательных функций (если они есть)
return 0;
>
2. Типы данных языка Си
3.
Данные целого типа
название типа
числ
о
байт
диапазон значений
char
1
-128. 127
signed char
1
-128. 127
unsigned char
1
0. 255
int
2,4
-32 768. 32 767
signed int
2,4
-32 768. 32 767
unsigned int
2,4
0. 65 535
signed short int
2
-32 768. 32 767
unsigned short int
2
0. 65 535
long int
4
-147483648 …
2147483647
signed long int
4
-“-
unsigned long int
4
-“-
Данные вещественного типа
название типа
число
байт
диапазон
значений
float
4
1.17E-38 …
3.37E+38
double
8
2.23E-308 …
1.67E+308
long double
10
3.37E-4932 …
1.2E+4932
4. Перечисляемый тип (enum)
Ключевое слово enum используется для объявления перечисляемого типа. Он
предназначен для описания констант (типа int) из некоторого заданного множества,
например:
enum number ;
enum number m;
Переменная m может принимать любое значение из списка констант перечисленных в
фигурных скобках. Каждому значению из списка соответствует целое десятичное число,
начиная с нуля. Каждая следующая имеет значение на единицу больше, чем предыдущая:
one=1, two=2, four=3 и так далее.
Определение переменных можно выполнить и при объявлении типа, например:
enum number i1=one, i2=four;
Перечисление может быть описано и без задания имени типа. Имена в различных
перечислениях должны отличаться друг от друга. Значения внутри одного перечисления
могут совпадать:
enum number i1=one, i2=two;
В этом случае переменные i1 и i2 будут равны обе нулю и ассоциироваться с
константой one. Константы four и six будут равны четырем .
В перечислении константам можно задавать значения не по порядку, при этом если не
все значения констант явно специфицированы, то они продолжают прогрессию, начиная от
последнего специфициро-ванного значения:
enum number i1=two, i2= four;
В этом случае значения именованных констант будут следующими:
one= 2, two=3, four= 4, six= 6.
5. Операции языка Си
Арифметические операции
+
*
/
%
сложение
вычитание
изменение знака
умножение
деление
остат. от деления
a=
a=
a=
a=
a=
a=
b + c;
b — c;
— b;
b * c;
b / c;
b % c;
если b=6, c=4, то a=10
если b=3, c=8, то a= -5
если b=132, то a= -132
если b=2, c=4, то a= 8
если b=7.0, c=2.0, то a= 3.5
если b=10, c=3, то a= 1
+=, -=, *=, /=, %= — составная операция присваивания
++ Унарный инкремент a++ (++a) значение a увеличивается на
единицу
— Унарный декремент a— (—a) значение a уменьшается на
единицу
6.
Логические операции
||
!
Логическое “И” (конъюнкция)
a= b c;
если b и c не равны нулю, то a=1, иначе a=0
Логическое “ИЛИ” (дизъюнкция) a= b || c;
если b и c равны нулю, то a=0, иначе a=1
Логическое отрицание (инверсия) a= ! b;
если b равно 0, то a=1, если b не равно 0, то a=0
Пример:
if( a>b cc) ……
if(! a) …….
7.
Поразрядные операции
c;
если оба сравниваемых бита единицы, то бит результата
равен 1, в противном случае – 0.
Если b=1010, c=0110, то a=0010
|
Поразрядная дизъюнкция
a= b | c;
если любой (или оба) из сравниваемых битов равен 1, то бит
результа-та устанавливается в 1, в противном случае — в нуль.
Если b=1010, c=0110, то a=1110
^
Поразрядное “исключающее ИЛИ” a= b ^ c;
если один из сравниваемых битов равен 0, а второй бит
равен 1, то бит результата равен 1, в противном случае 0.
Если b=1010, c=0110, то a=1100
~
Поразрядная инверсия
a= ~ b;
если b=1010, то a=0101
8. Сдвиговые перации
<<
Сдвиг влево
a= b осуществляется сдвиг значения b влево на c разрядов;
в освобо-дившиеся разряды заносятся нули.
Если b=1011, c=2, то a=1100
>>
Сдвиг вправо
a= b >> c;
осуществляется сдвиг значения b вправо на c
разрядов; в освобо-дившиеся разряды заносятся нули,
если b имеет тип unsigned и копии знакового бита в
противном случае.
Если b=1011, c=2, то a=0010
9. Операции сравнения
==
Сравнение на равенство
a == b;
вырабатывается 1, если a равно b, и 0 – в противном
случае
> , >=
Больше , (Больше или равно)
a > b; a>=b;
вырабатывается 1, если a больше (больше или равно) b, и
0 – в противном случае
< , Меньше , (Меньше или равно) a < b; aвырабатывается 1, если a меньше (меньше или равно)
b, и 0 – в противном случае
!=
Не равно
a != b;
вырабатывается 1, если a не равно b, и 0 – в
противном случае
10.
Операции адресации и разадресации
b;
ptr присваивается адрес переменной b ;
*
Разадресация
a= * ptr;
Переменной a присваивается значение содержащееся по адресу
ptr ;
Операция последовательного вычисления
,
Запятая
a = (c— , ++b);
вычисляет операнда слева направо. Результат операции имеет
значение и тип второго операнда.
Если c=2, b=3, то a=4, c=1,
b=4
Операция условного выражения
?:
Условная операция
a= (b <0) ? (-b) : (b);
a присваивается абсолютное значение b
Size-операция
Sizeof
Определение размера в байтах
a= sizeof(int);
11.
Приоритет операций
В таблице показан приоритет (порядок вычисления)
операций языка С(С++). Операции упорядочены по приоритету
сверху вниз.
Операция
() [] -> .
! ~ ++ — + — *
< >=
== !=
= ^= |= <>=
Приоритет
слева направо
справа налево
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
слева направо
справа налево
слева направо
12. Ввод и вывод информации
Вывод информации
В языке С вывод информации обеспечивается функциями:
printf(), putchar(), puts().
int printf(«управляющая строка», аргумент1, аргумент2, . );
Управляющая строка представляет собой символьную строку,
заключенную в кавычки («xxxx») и определяющую порядок и
формат печати выводимой информации. параметра в поле
вывода.
13.
Управляющая строка может содержать информацию вида:
1) обычная текстовая информация;
2) спецификация преобразования, согласно которой
осуществляется вывод одного из аргументов, содержащихся
в списке аргументов. Формат спецификации:
% [знак] [размер поля вывода ][точность]
символ_преобразования
14.
Знак, расположенный после %, указывает на необходимость
выравни-вания выводимого параметра в поле вывода и
имеет следующий смысл:
—
Выравнивание влево выводимого числа в
пределах выделенного поля, по умолчанию
производится выравнивание вправо.
+
Выводится знак + перед положительным числом
пробел
0
Выводится знак пробела перед положительным
числом
Заполняет поле нулями
15.
Cимволы преобразования:
символ
Представление данных
d, i
Целое десятичное число
u
Целое беззнаковое десятичное число
o
x, X
f
Целое беззнаковое восьмеричное число
Целое беззнаковое шеснадцатеричное число
Число с плавающей запятой в записи с
фиксированной десятичной точкой
e, E
Значение со знаком в форме
c
s
p
Одиночный символ
Символьная строка
Указатель
[-]d.dddde[+|-]ddd
16.
Перед типом формата могут стоять следующие
модификаторы:
h
Если тип формата – d, i, o, x или X, то тип параметра short int.
При типе формата u тип параметра – unsigned short int
l
При типе формата – d, i, o, x или X тип параметра –
long int, при u — unsigned long.
При типе формата – e, E, f, g или G тип параметра –
double.
17.
Ввод информации
Ввод информации обеспечивается функциями
scanf, getch, getchar , gets и др.
int scanf(«управляющая строка», адрес аргумента1, адрес
аргумента2, . );
В функции scanf в качестве аргументов используются только
указатели на переменные.
В отличие от функции printf, в спецификации преобразования
функции scanf:
— отсутствует спецификация %g;
— спецификации %f и %e эквивалентны;
— для ввода целых чисел типа short применяется спецификация
%p.
18. Операторы языка Си
• условные операторы: условия if и оператор выбора
switch;
• операторы цикла: for , while , do while;
• операторы перехода: break , continue , return , goto;
• другие операторы: оператор «выражение», пустой
оператор.
Составной оператор – это несколько операторов
объединенных в блок с помощью фигурных скобок < >,
или разделенных запятой. Такой блок можно
рассматривать как один оператор.
Пустой оператор – состоит только из знака ; .
19. Операторы цикла
В языке Си имеется три оператора цикла:
• for
• while
• do
while
20.
Оператор
for (цикл с фиксированным числом повторов)
for(выражение1; выражение2; выражение3) тело цикла;
Тело цикла составляют одна либо некоторое подмножество инструк-ций,
заключенных в фигурные скобки.
выражение 1 служит для инициализации переменной цикла.
выражение 2 устанавливает условие, при котором цикл повторяется.
выражение 3 выполняет изменение переменной цикла.
Пример:
a=0;
for(i=0; i <5;i++)
a=a+i;
// в цикле одна инструкция
a=0; b=1;
for(i=0; i <5;i++)
< a=a+i; // в цикле несколько
b=b*i;
// инструкций
>
21.
Оператор
while (цикл с предварительной проверкой условия)
while(логическое выражение) тело цикла;
Тело цикла составляют одна либо некоторое подмножество
инструкций, заключенных в фигурные скобки. Логическое
выражение проверяется в начале каждой очередной итерации
цикла.
Пример:
a=0; i=0;
while(i <5)
a=a+i++; // в цикле одна инструкция
несколько
a=0; b=1;
while(i <5)
< a=a+i; // в цикле
b=b*i; // инструкций
i++;
>
22.
Оператор
цикла)
do …while (цикл с проверкой условия в конце итерации
do . . . while(логическое выражение) тело цикла;
Тело цикла составляют одна либо некоторое подмножество
инструкций, заключенных в фигурные скобки. Логическое
выраже-ние проверяется после окончания каждой очередной
итерации цикла.
Пример:
a=0; i=0;
do
a=a+i++; // в цикле одна инструкция
while(i <5);
a=0; b=1; i=0;
do
< a=a+i;
// в теле цикла
b=b*i;
// несколько
i++;
// инструкций
> while(i <5);
Источник: ppt-online.org