- •Язык c. Лекция 1
- •1. Общая характеристика языка
- •1.1. История создания
- •2. Отличительные особенности языка c
- •2.1. Нет ничего, кроме функций
- •3.3. Описания
- •3.4. Общая структура программы
- •3.5. Способ передачи аргументов при вызове функции
- •4. Пример простой программы: решение квадратного уравнения
3.3. Описания
Объекты программы (сложные типы, переменные, функции) необходимо описывать до их использования. Это правило иногда допускает исключения (применительно к функциям), но лучше ими не пользоваться (плохой стиль, который увеличивает вероятность скрытых ошибок).
Пользование стандартными библиотечными функциями требует большого количества относящихся к ним описаний. Эти описания не нужно писать самому: они помещены в т.н. стандартные «заголовочные» файлы, которые поставляются вместе с компилятором и библиотеками. Заголовочные файлы включаются в состав программы с помощью директивы #include.
3.4. Общая структура программы
Программа состоит из отдельных функций. Каждая функция записывается отдельно (т. е. функции нельзя «вкладывать» друг в друга, как в Паскале). Порядок следования функций в файле с исходным текстом программы не имеет значения (при условии, что объявление функции или переменной встречается в исходном файле раньше их использования).
Как уже упоминалось, в законченной программе обязательно должна присутствовать функция с именем main — её вычисление и есть выполнение программы.
Исходный текст программы может находиться как в одном, так и в нескольких файлах. Единственное ограничение — функцию нельзя разрывать, она целиком должна находиться в одном файле. Для правильной сборки программы, состоящей из нескольких файлов, необходимо во всех её частях иметь согласованные объявления и определения.
Способ разбиения исходного текста на файлы не безразличен с точки зрения смысла программы. Переменная может быть видимой (доступной):
для единственной функции (локальная переменная)
для всех функций в пределах одного исходного файла (внешняя статическая)
для всех функций программы (внешняя, или глобальная)
Функция может быть видимой (доступной для вызова):
для всех функций в пределах одного исходного файла (статическая функция)
для всех функций программы (глобальная функция)
3.5. Способ передачи аргументов при вызове функции
В языке C имеется единственный способ передачи аргументов (параметров) при вызове функций — по значению. Это значит, что в момент вызова функции создается временная переменная и в нее копируется значение аргумента. Таким образом, функция имеет дело с копией, а не с аргументом-оригиналом.
Если нужно написать функцию, которая изменяет значение какой-либо переменной в вызывающей программе, ей следует передавать в качестве аргумента не саму переменную, а указатель на неё (т.е. адрес расположения переменной в памяти компьютера). Получив значение указателя (адреса), функция сможет читать содержимое памяти или записывать новое содержимое в память по указанному адресу (это называется косвенной адресацией, или косвенным доступом по указателю).
В языке C есть две специальных операции для работы с указателями:
&x — определить адрес (получить указатель) на переменную x
*p — обратиться к памяти по адресу p (т.е. получить доступ к переменной по указателю на нее).
4. Пример простой программы: решение квадратного уравнения
/* example1.c - Решение квадратного уравнения.
*/
#include <stdio.h>
#include <math.h>
void main (void)
{
double a, b, c, d, x1, x2;
printf ("Введи коэффициенты a, b, c: ");
scanf ("%lf%lf%lf", &a, &b, &c);
d = b*b - 4.0*a*c;
if (d < 0.0)
printf ("Уравнение имеет комплексные корни\n");
else {
x1 = (-b + sqrt(d))/(2.0*a);
x2 = (-b - sqrt(d))/(2.0*a);
printf ("x1 = %g\nx2 = %g\n", x1, x2);
}
}
1 Имеются переводы на русский язык обеих изданий книги Кернигана и Ритчи. Второе английское издание вышло по меньшей мере в трех разных переводах:
– Перевод Вик. С. Штаркмана под ред. Вс. С. Штаркмана, М.: «Финансы и статистика», 1992 г.
– Те же переводчик и редактор, исправленное издание (пересмотрен перевод терминологии, заново проведена сверка с оригиналом). СПб.: «Невский Диалект», 2001.
– Перевод В. Л. Бродового. М.: Издательский дом «Вильямс», 2006.
2 В языке C говорят, что функция «возвращает» значение, т.е. программа обращается к функции («вызывает» ее), та вычисляет значение, соответствующее заданному аргументу (аргументам) и возвращает вычисленное значение вызвавшей программе, которая после этого продолжает свою работу.