
- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор sizeof
- •Оператор «запятая»
- •Операторы [ ] u ()
- •Приоритеты в с
- •Выражения
- •Преобразование типов в выражениях
- •Принудительные преобразования
- •Пробелы и круглые скобки
- •Сокращенные операторы в с
- •Операторы управления программой
- •Истина и ложь в с
- •Операторы выбора
- •Вложенные if
- •Лесенка if-else-if
- •Оператор ?
- •Вложенные операторы switch
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Метки и goto
- •Функции
- •Оператор return
- •Выход из функции
- •Возвращаемые значения
- •Значения, возвращаемые функцией main()
- •Правила видимости для функций
- •Аргументы функции
- •Передача по значению и передача по ссылке
- •Создание передачи по ссылке
- •Передача массивов в функции
- •Аргументы функции main()
- •Функции, возвращающие нецелые значения
- •Использование прототипов функции
- •Прототипы стандартных библиотечных функций
- •Создание прототипов функций, не имеющих параметров
- •Возврат указателей
- •Рекурсия
- •Сопоставление классического и современного объявления параметров
- •Указатели на функции
- •Особенности реализации
- •Параметризированные функции и функции общего назначения
- •Эффективность
- •Массивы
- •Одномерный массив
- •Создание указателя на массив
- •Передача одномерных массивов в функции
- •Двумерные массивы
- •Массивы строк
- •Многомерные массивы
- •Индексация с помощью указателей
- •Размещение массивов
- •Инициализация массива
- •Инициализация безразмерных массивов
- •Пример программы игры в крестики-нолики
- •Указатели
- •Указатели - это адреса
- •Переменные-указатели
- •Операторы для работы с указателями
- •Выражения с указателями
- •Присваивание указателей
- •Арифметические действия с указателями
- •Сравнение указателей
- •Динамическое выделение и указатели
- •Указатели на константы
- •Указатели на константы
- •Указатели на константы
- •Указатели и массивы
- •Указатели на символьные массивы
- •Массивы указателей
- •Указатели на указатели - многочисленное перенаправление
- •Инициализация указателей
- •Указатели на функции
- •Проблемы, связанные с указателями
- •Структуры, объединения и определяемые пользователем типы
- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Программа инвентаризации
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Битовые поля
- •Объединения
- •Перечисления
- •Использование sizeof для обеспечения переносимости
- •Ввод, вывод, потоки и файлы
- •Потоки и файлы
- •Текстовые потоки
- •Двоичные потоки
- •Консольный ввод/вывод
- •Чтение и запись символов
- •Чтение и запись строк: gets() и puts()
- •Форматированный консольный ввод/вывод
- •Печать символов
- •Вывод чисел
- •Вывод адресов
- •Спецификатор %n
- •Модификаторы формата
- •Спецификатор минимума ширины поля
- •Спецификатор точности
- •Выровненный вывод
- •Работа с другими типами данных
- •Модификаторы * u #
- •Спецификаторы формата
- •Ввод чисел
- •Ввод беззнаковых целых
- •Чтение отдельных символов с помощью scanf()
- •Чтение строк
- •Ввод адреса
- •Спецификатор %n
- •Использование множества сканирования
- •Пропуск нежелательных специальных символов
- •Обычные символы в управляющей строке
- •В scanf() следует передавать адреса
- •Модификаторы формата
- •Подавление ввода
- •Файловая система ansi с
- •Указатель на файл
- •Открытие файла
- •Запись символа
- •Чтение символа
- •Использование fopen(), getc(), putc() и fclose()
- •Использование feof()
- •Две расширенные функции: getw() и putw()
- •Работа со строками: fgets() и fputs()
- •Fseek() и произвольный доступ
- •Удаление файлов
- •Работа с консолью
- •Препроцессор и комментарии
- •Директивы условной компиляции
- •Использование defined
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
Операторы препроцессора # и ##
С предоставляет два оператора препроцессора: # и ##. Данные операторы используются в совокупности c #define.
Оператор # помещает аргумент, перед которым он стоит, в двойные кавычки. Например, рассмотрим программу: #include "stdio.h" #define mkstr(s) # s int main(void) { printf(mkstr(I like C) ); return 0; }
Препроцессор превратит строку printf(mkstr(I like C)); в строку printf ("I like С");
Оператор ## используется для конкатенации двух частей. Например: #include "stdio.h" #define concat(a, b) a ## b int main(void) { int xy = 10; printf("%d", concat(x, y)); return 0; }
Препроцессор преобразует printf("%d", concat(x, y) ); в printf("%d", xy);
Если эти операторы кажутся несколько странными, то надо запомнить, что в подавляющем большинстве случаев нет никакой необходимости в их использовании. Их изначальное назначение в том, чтобы позволить препроцессору обрабатывать некоторые специальные случаи.
Предопределенные макросы
Стандарт ANSI С имеет 5 предопределенных макросов: __LINE__ __FILE__ __DATE__ __TIME__ __STDC__
Borland С++ также определяет дополнительные макросы: __ВСОРТ__ __BCPLUSPLUS__ __BORLANDC__ __CDECL__ __CHAR_UNSIGNED __CONSOLE__ __CPPUNWIND __cplusplus __DLL__ _M_IX86__ __MSDOS__ __MT__ __OVERLAY__ __PASCAL__ __TCPLUSPLUS __ __TEMPLATES__ __TLS__ __TURBOC__ __WCHAR_T __WCHAR_T_DEFINED __Windows __WIN32__
Макрос __DATE__ содержит строку в виде месяц/день/год, соответствующую дате перевода исходного кода в объектный.
Время, когда был откомпилирован исходный код, содержится в строке __TIME__ в формате часы: минуты: секунды.
Если определен макрос __STDC__ то, значит, программа была откомпилирована с использованием стандарта ANSI С со включенной проверкой на совместимость. В противном случае __STDC__ не определен.
__ВСОРТ__ определен, если используется оптимизация.
При использовании Borland С++ если компилировать программу как С++-программу, то определяется макрос __BCPLUSPLUS__. Компиляция С++-программы также приводит к определению __TCPLUSPLUS__. Оба макроса содержат шестнадцатиричные значения, увеличивающиеся с каждой новой версией компилятора.
__BORLANDC__ содержит текущую версию компилятора (в шестнадцатиричном виде).
Макрос __CDECL__ определен, если используется стандартное соглашение С о вызове функций, т.е. паскалевский вызов не используется. В противном случае макрос не определен (если определен, то он принимает значение 1).
Если определен __CHAR_UNSIGNED, то стандартным символьным типом становится unsigned.
Если __CONSOLE__ определен для 32-битного компилятора, то программа является консольным приложением.
Если __CPPUNWIND определен, то разрешено разворачивание стека.
Если программа откомпилирована как С++-программа, то __cplusplus установлен в 1.
Для Borland С++ __DLL__ установлен в 1 при создании DLL-файла.
Макрос __М_IХ86 определен всегда.
Макрос __MSDOS__ установлен в 1 при использовании MS-DOS версии Borland C/C++.
Макрос __МТ__ установлен в 1, если многопоточная библиотека используется с 32-битным компилятором.
Когда программа компилируется с использованием оверлеев, то __OVERLAY__ установлен в 1.
Макрос __PASCAL__ установлен в 1 только в том случае, если при компиляции программы используется паскалевское соглашение о вызовах функций.
Для Borland С++ __TEMPLATES__ установлен в 1 для всех версий компиляторов, поддерживающих шаблоны. Данный макрос применим только при компиляции С++-программ.
При компиляции с использованием 32-компилятора __TLS__ содержит ненулевое значение.
__TURBOC__ содержит шестнадцатиричное значение, увеличивающееся с каждой новой версией языка.
Для С++-программ _WCHAR_T и _WCHAR_T_DEFINED установлены в 1 для указания того, что тип wchar_t является встроенным типом данных. Они не определены для С-программ. Для Borland С++ _Windows определен, если программа компилируется для использования под Windows.
При использовании 32-битного компилятора __WIN32__ установлен в 1.
В большинстве случаев данные макросы используются для достаточно сложных сред программирования, когда разрабатываются или поддерживаются несколько различных версий программ.