
- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор 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
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
Пробелы и круглые скобки
Для улучшения читабельности программ выражения в С могут содержать табуляции и пробелы. Например, следующие два выражения полностью эквивалентны: х=10/у~(127/х); х = 10 / у ~ (127 / х) ; Использование дополнительных круглых скобок не вызовет ошибок и не уменьшит скорость вычисления выражения. Можно использовать круглые скобки для уточнения порядка вычисления как для себя, так и для остальных людей, читающих программу. Например: какое из двух выражений легче читать? х=у/3-34*temp&127; или х = (у / 3) - ((34 * temp) & 127);
Сокращенные операторы в с
С имеет несколько специальных сокращенных операторов, кодирующих некоторые операторы присваивания. Например:
х = х + 10; может быть кратко записано как х += 10;
Оператор += сообщает компилятору, что необходимо присвоить переменной х старое значение x плюс 10.
Это сокращение работает для всех бинарных операторов в С (где требуется два операнда). Стандартная форма сокращений следующая: переменная = переменная оператор выражение; то же самое, что и переменная оператор = выражение; В другом примере х = х - 100; записывается как х -= 100; Сокращенная нотация широко используется при профессиональном написании программ, и следует хорошо с ней разобраться.
Операторы управления программой
В данном разделе рассказывается о различных операторах управления программой. Это механизмы, с помощью которых можно изменять порядок выполнения программы. С предоставляет три категории операторов управления программой: итерационные операторы, операторы выбора и операторы переходов. Итерационные операторы - это while, for и do/while. Они чаще всего называются циклами. Операторы выбора или условные операторы - это if и switch. Операторы перехода - это break, continue и goto. (Оператор return, в принципе, также является оператором перехода, поскольку он воздействует на программу.) Функция exit() она также влияет на выполнение программы.
Истина и ложь в с
Большинство операторов управления программой в любых компьютерных языках, включая С, основываются на проверке условий, определяющих, какого рода действие необходимо выполнить. В результате проверки условий можно получить истину или ложь. В противоположность другим языкам, где вводится специальный тип для хранения истины и лжи, в С истине соответствует любое ненулевое значение, включая отрицательные числа. Лжи соответствует ноль. Данный способ описания истины и лжи реализован в С изначально, поскольку он предоставляет возможность легкого написания эффективных подпрограмм.
Операторы выбора
С поддерживает два типа оператора выбора: if и switch. Кроме этого, оператор ? является альтернативой оператору if.
IF
Стандартная форма оператора if следующая: if (выражение) оператор; else оператор; где оператор может быть или простым, или составным. (Надо помнить, что в С составной оператор -это группа операторов, заключенных в фигурные скобки.) Оператор else не обязателен. Стандартная форма оператора if с составными операторами следующая: if (выражение) { последовательность операторов } else { последовательность операторов }
Если выражение истинно (любое значение, кроме 0), выполняется блок операторов, следующий за if; иначе выполняется блок операторов, следующих за else. Всегда выполняется код ассоциированный или с if или с else, но никогда не выполняются оба кода одновременно.
Рассмотрим следующую программу, являющуюся простейшим вариантом игры «угадай число». Она печатает сообщение «**Rignt**», когда игрок угадывает число. # inсlude <stdio.h > /* программа "угадай число" */ int main(void) { int magic = 123; /* искомое число */ int guess; printf ("Enter your guess: "); scanf ("%d", &guess); if (guess == magic) printf("** Right **"); return 0; } Программа использует оператор строгого равенства (==) для определения того, угадал игрок число или нет. Если угадал, то сообщение выводится на экран.
Рассмотрим следующую версию данной программы, иллюстрирующую использование оператора else для вывода сообщения о неправильном числе: #include <stdio.h> /* программа "угадай число 2" */ int main(void) { int magic = 123; /* искомое число */ int guess; printf("Enter your guess: "); scanf("%d",&guess); if (guess = magic) printf("** Right..**"); else printf(".. Wrong .."); return 0; }