Читайте также:
|
|
Оператор return завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию, в точку, непосредственно следующую за вызовом. Функция main передает управление операционной системе. Формат оператора:
return [выражение];
Значение выражения, если оно задано, возвращается в вызывающую функцию в качестве значения вызываемой функции. Если выражение опущено, то возвращаемое значение не определено. Выражение может быть заключено в круглые скобки, хотя их наличие не обязательно.
Если в какой-либо функции отсутствует оператор return, то передача управления в вызывающую функцию происходит после выполнения последнего оператора вызываемой функции. При этом возвращаемое значение не определено. Если функция не должна иметь возвращаемого значения, то ее нужно объявлять с типом void.
Таким образом, использование оператора return необходимо либо для немедленного выхода из функции, либо для передачи возвращаемого значения.
Пример:
int sum (int a, int b) { renurn (a+b); }Функция sum имеет два формальных параметра a и b типа int, и возвращает значение типа int, о чем говорит описатель, стоящий перед именем функции. Возвращаемое оператором return значение равно сумме фактических параметров.
Пример:
void prov (int a, double b) { double c; if (a<3) return; else if (b>10) return; else { c=a+b; if ((2*c-b)==11) return; } }В этом примере оператор return используется для выхода из функции в случае выполнения одного из проверяемых условий.
Массив
Массив – это сложный тип данных, представляющий собой упорядоченную совокупность элементов одного типа.
Упорядоченность проявляется в том, что доступ к каждому элементу массива осуществляется посредством его индекса (номера) в массиве. Индекс представляет собой одно или несколько целых чисел, в зависимости от размерности массива.
Объявление массивов на языке С имеет следующий синтаксис:
тип имя[предел №1][предел №2]...[предел №N];
Примеры:
int a[10];
double b[5];
Обращение к элементам массива в языке С осуществляется путем указания имени массива и, следом за ним, индексов элемента в парных квадратных скобках. Индексация в языке C начинается с нуля.
Поэтому, в массиве a обращение к первому элементу будет иметь вид: a[0], а к последнему – a[9].
На практике наиболее часто используются только:
одномерные массивы (векторы);
двумерные массивы (матрицы).
Объявление одномерного массива в си (далее просто массив) имеет следующий синтаксис:
тип имя[размер];
В качестве размера массива может указываться любое положительное целочисленное значение. В стандарте С89 значение могло являться только константой. В стандарте С99 было введено понятие динамического массива.
Динамический массив - массив, при создании которого в качестве размера указывается значение некоторого выражения, в которое входят переменные, объявленные и инициализированные ранее (выражение должно иметь положительный целочисленный результат).
Например:
int n;
printf("Введите размер массива: ”);
scanf("%d”,&n);
double x[n];
При объявлении статических массивов допускается производить инициализацию элементов массива. Синтаксис такого объявления:
тип имя[размер] = {значение №1,... значение №N};
Примеры:
int a[5] = {1,2,3,4,5}, b[5] = {1,2};
double x[10] = {0.0};
int c[] = {1,2,3,4,5};
char d[] = {’a’,’b’,’c’};
int e[5] = {1,2,,4,5}; //Неправильно - ошибка
Объявление константных массивов (значения их элементов изменить нельзя) начинается с ключевого слова const, за которым следует объявление массива с инициализацией.
Примеры:
const int array[] = {1,2,3,4,5};
const double vector[5] = {1.0,2.0,3.0};
Обращение к элементу массива осуществляется путем указания имени массива, а после имени в квадратных скобках индекса элемента:
имя[индекс]
Индексация в языке С начинается с нуля, поэтому для массива размером, например, десять элементов правильными будут индексы от нуля до девяти включительно.
Каждый отдельный элемент массива может рассматриваться как простая переменная и, соответственно, выступать в выражениях в качестве RValue или LValue значений.
Ввод и вывод массивов в языке С осуществляется поэлементно в цикле. Например, ввод и вывод целочисленного массива из десяти элементов будет иметь вид:
int a[10];
for(int i=0;i<10;i++) scanf("%d”,&a[i]);
...
for(int i=0;i<10;i++) printf("%d\t”,a[i]);
Присвоение массива массиву также осуществляется поэлементно. Например, необходимо присвоить вещественный массив x вещественному массиву y. Фрагмент программы:
double x[15], y[15];
...
for(int i=0;i<15;i++) y[i] = x[i];
...
В языке С во время выполнения программы не производится контроль за допустимыми значениями индексов элементов. Поэтому, если индекс элемента выходит за рамки массива, то в программе возможно появление ошибок. Ошибки могут быть:
ростыми (например «случайное» изменение переменных);
критическими (выход за пределы пространства памяти, отведенной для программы).
Например:
int a[10];
for(int i=0;i<=10;i++) a[i] = i;
Функци
2.8. Функции
В виде функции оформляются вычисления, преобразования, другие действия, которые затем могут быть выполнены неоднократно с различными аргументами. С помощью функции большие вычислительные задачи подразделяют на более мелкие. Они позволяют воспользоваться тем, что уже сделано другими разработчиками, а не начинать создание программы каждый раз "с нуля". Язык
проектировался так, чтобы функции были эффективным и простым в использовании средством программирования. Обычно программы на языке Си представляют собой набор небольших функций. Программу можно располагать в
одном или нескольких исходных файлах. Эти файлы можно компилировать отдельно, а компоновку выполнять вместе, в том числе и с ранее откомпилированными библиотечными функциями. Часто оказывается предпочтительным реализовать ряд операций один раз
в виде некоторых модулей и в дальнейшем иметь возможность присоединять
эти модули к своей программе.
Объявление, определение и вызов функций
Определение функции имеет следующий вид:
тип_возвращаемого_значения имя(список_формальных_параметров)
{
последовательность_операторов;
}
Определение функции задает: 1) тип возвращаемого функцией значения;
2) имя функции; 3) список формальных параметров; 4) последовательность
операторов. Тело функции, заключенное в фигурные скобки, содержит объяв-
ления автоматических переменных и операторы, определяющие действия, вы-
полняемые функцией.
Прототип функции имеет следующий вид:
тип_возвращаемого_значения имя(список_формальных_параметров);
Вызов функции имеет следующий вид:
имя(список_фактических_параметров);
Пример с использованием прототипа, вызова и определения функции.
/* Прототип функции */
int volume(int a, int b, int c);
int main(void)
{
int x=5, y=6, v;
v=volume(x,y,8); /* Вызов функции */
return 0;
}
/* Определение функции */
int volume(int a, int b, int c)
{
return a*b*c;
}
Функции могут требовать указания параметров при своем вызове. Такие функции в заголовке содержат непустой список формальных параметров, который представляет собой последовательность объявлений формальных параметров, разделенных запятыми. Формальные параметры - это переменные, используемые внутри тела функции и получающие значение при вызове функции
путем копирования в них значений соответствующих фактических параметров. Фактические параметры - это значения, передаваемые в функцию при ее вызове. В том случае, если функция не использует параметров, то список пара-
метров оставляют пустым. Важно, что типы фактических параметров при вызове функции должны
быть совместимы с типами соответствующих формальных параметров.Функция может возвращать значение любого типа данных, за исключением массива. Функция завершает работу при выполнении оператора return,
имеющего следующий синтаксис: return выражение; Выражение должно соответствовать типу возвращаемого значения. Значение
указанного выражения возвращается в точку вызова функции в качестве результата.
Память для параметров при вызове функции отводится компилятором. Это означает, что компилятор должен иметь информацию о списке передаваемых в функцию параметров, что обеспечивается объявлением функции путем указания ее прототипа. Прототип должен обязательно предшествовать вызову функции. В нем указывается имя функции, тип возвращаемого значения и типы передаваемых в
функцию аргументов. Кроме того, с помощью прототипа компилятор осуществляет проверку соответствия типов передаваемых фактических параметров типам формальных параметров при вызове функции.
Область действия переменных и время жизни Программа на языке Си обычно оперирует с множеством внешних объек-
тов: переменных и функций. Глобальные переменные объявляются вне функций и доступны для лю-
бой функции. Они определяются в одном из модулей, а в тех модулях, где к ним нужен доступ, они описываются с помощью модификатора extern. Иногда требуется ограничить область видимости глобальной переменной
только текущим модулем. В этом случае переменная определяется как статическая с помощью модификатора static.
Локальные (автоматические) переменные определяются внутри функций. Эти переменные действительны только в ней, создаются в момент входа в функцию и уничтожаются при выходе из нее. Рассмотрим следующую таблицу:Переменные Область действия
(видимости)
Время жизни
Глобальные Программа Программа
Статические Модуль (отдельно откомпилированный файл)
Программа
Автоматические Функция Функция
Указатели
Указатели
Указатель – это переменная, содержащая адрес другой переменной.
Синтаксис определения указателя:
спецификатор_типа *имя переменной;
Символ «*» означает "указатель на". Спецификатор_типа задает тип пере-
менной, на которую указывает указатель.
Пример определения и инициализации указателя.
int c;
int *p; /* Определение указателя*/
p=&c; /* Инициализация указателя */
Результатом выполнения операции «&» является адрес объекта, так что в опе-
раторе
p=&c; 15
переменной p присваивается адрес ячейки с (говорят, что p указывает на c или
p ссылается на c). Операция «&» применяется только к объектам, расположен-
ным в памяти: к переменным и элементам массивов. Ее операндом не может
быть ни выражение, ни константа.
Символ «*» перед именем переменной имеет разное значение в опреде-
лении и в использовании. При определении он означает, что переменная явля-
ется указателем, а при использовании – это получение значения переменной, на
которую указывает указатель.
Пример с использованием указателя в операторах.
int x, y;
int *ip; /* ip – указатель на тип int */
ip=&x; /* Переменной ip присваивается адрес переменной x */
y=*ip; /* Значению y присваивается значение x */
*ip=0; /* Значению x присваивается значение 0 */
Допускаются следующие операции с указателями: присваивание значе-
ния указателя другому указателю того же типа, сложение и вычитание указате-
ля и целого, вычитание и сравнение двух указателей, ссылающихся на элемен-
ты одного и того же массива, а также присваивание указателю нуля и сравне-
ние указателя с нулем.
Нельзя складывать два указателя, перемножать их, делить, сдвигать, вы-
делять разряды; указатель нельзя складывать со значением типа float или
double; указателю одного типа нельзя присвоить указатель другого типа.
Дата добавления: 2015-12-08; просмотров: 63 | Нарушение авторских прав