Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

Void line2(int Len, y, char ch) // ошибка,

как при объявлении переменных. Имена параметров обязательны только в заголовке описания, а в прототипе можно указать только их типы: void LINE2(int , int , char ).

Вызов функции типа void выполняется, как и на Pascal, без использования дополнительного оператора, как это имеет место в некоторых других языках. Достаточно записать имя функции и в скобках, если есть, параметры. Если параметры отсутствуют, то и в прототипе, и в описании, и при вызове функции необходимо обязательно записать пустые круглые скобки.

1.2. Формальные и фактические параметры

Параметры, записанные в скобках заголовка функции, назовём формальными параметрами (Len, y и ch). Параметры, записанные при вызове функции, назовём фактическими параметрами, или аргументами (LEN, Y, C). Между ними должно быть следующее соответствие:

    • в типе, с учётом их совместимости. Например, вместо параметра типа char можно передать не только символ, как показано в первом вызове, но и его код типа int, как показано во втором вызове (гл. 4). Вместо формального вещественного параметра можно передать целый, но не наоборот;

    • в порядке следования. Нарушение этого требования приведёт либо к ошибке компиляции, либо повлияет на результат. Если в нашем примере вызвать функцию LINE2(“*”, 5, 20), то компилятор сообщает о невозможности преобразования char в int. Если же вызвать LINE2 (Y, LEN, ‘-‘), то в строке LEN будет выведено Y символов “-“;

    • в количестве параметров. Это требование справедливо, если не используются параметры по умолчанию (см. 6.2).

1.3. Передача параметров по значению

При передаче в функцию входных параметров, изменение которых не возвращается в вызывающую функцию, используется метод, который называется передачей по значению. Он имеет следующие особенности:

  • для фактического и формального параметров компилятор отводит разные ячейки памяти;

  • при выполнении программы содержимое аргумента копируется в формальный параметр, то есть при первом вызове в нашем примере выполняется Len=20, y=5 и ch=’*’ , хотя это явно нигде не записывается;

  • из первой особенности следует, что если в функции изменить формальный параметр, то это изменение не повлияет на значение переменной, используемой при вызове, то есть фактического параметра. Если бы в функции изменили y (например, там было бы записано y++), то значение соответствующей переменной Y в головной функции после второго вызова осталось бы без изменения, т. е. тем, что ввели;

  • в качестве фактического параметра, соответствующего параметрузначению, может быть выражение соответствующего или совместимого типа. Например, функцию можно вызвать так: LINE2 ( LEN*2, Y+1, ‘*’). Как частный случай можно передавать константу, как показано при первом вызове, или переменную (см. второй вызов). При этом её имя, используемое при вызове, не обязательно должно отличаться, как в нашем примере, от имени формального параметра. В головной программе переменную для фактической длины символов можно было бы тоже назвать Len. Но и в этом случае это разные ячейки памяти.