Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_otvyty.docx
Скачиваний:
2
Добавлен:
04.08.2019
Размер:
100.42 Кб
Скачать

Билет 19: Побочные эффекты в языке Си.

Операции присваивания в сложных выражениях могут вызывать побочные эффекты, так как они изменяют значение переменной. Побочный эффект может возникать и при вызове функции, если он содержит прямое или косвенное присваивание (через указатель). Это связано с тем, что аргументы функции могут вычисляться в любом порядке. Например, побочный эффект имеет место в следующем вызове функции: prog (a,a=k*2); В зависимости от того, какой аргумент вычисляется первым, в функцию могут быть переданы различные значения. Порядок вычисления операндов некоторых операций зависит от реализации и поэтому могут возникать разные побочные эффекты, если в одном из операндов используется операции увеличения или уменьшения, а также другие операции присваивания. Например, выражение i*j+(j++)+(--i) может принимать различные значения при обработке разными компиляторами. Чтобы избежать недоразумений при выполнении побочных эффектов необходимо придерживаться следующих правил. 1. Не использовать операции присваивания переменной в вызове функции, если эта переменная участвует в формировании других аргументов функции. 2. Не использовать операции присваивания переменной в выражении, если эта переменная используется в выражении более одного раза.

Билет 20: Организация функций. Определение функций

В языке С существует несколько понятий относительно функций:

Определение функции

Объявление функции

Вызов функции

Основным компонентом является определение функции. Оно содержит реализацию алгоритма, должно быть единственным и записываться в *.c.

Структура определения:

Заголовок – реализация интерфейса между функцией и внешним кодом

Тело – непосредственно реализация алгоритма

Заголовок состоит из нескольких частей: тип возвращаемого значения, имя функции, список формальных параметров. Возвращаемое значение передается функции-родителю через return. Имя функции служит непосредственно для вызова, список формальных параметров для передачи в функцию необходимых значений.

Пример: double pow(double a, double b) { ТЕЛО }

Наверное, стоит дописать: здесь double – тип возвращаемого функцией значения, pow – имя функции, используемое при вызове функции, double a, double b – параметры функции. Также стоит отметить, что если тип возвращаемого значения void, то в теле функции не должно быть return.

Билет 21: Вызов и прототип функций

Объявление функции служит для 2 целей:

Позволяет выполнить корректную компиляцию вызова (что такое «корректная компиляция вызова»?)

Позволяет написать корректный вызов функции (не покидает ощущение, что это как-то не корректно сформулировано)

Объявление функции также называют прототипом функции. Для их хранения существуют заголовочные файлы (*.h).

Пример: double pow(double a, double b);

Вызов функции:

Список аргументов имеет синтаксис выражений. Аргументы и параметры должны быть согласованы по количеству и типу.

Пример: pow(10, 2);

Билет 22: Передача параметров в функциях

Параметры имеют статус локальных переменных (память выделяется в стеке, по завершению работы функции освобождается).

Способы передачи параметров:

По значению

По ссылке (указателю, адресу)

Можно сказать, что второй пункт является частью первого, так как передача по указателю так же является передачей по значению (адрес переменной). Но так как принцип работы с указателем отличается от работы с переменной, эти 2 типа стоит различать.

Стоит отметить, что передача через указатель также позволяет функции возвращать результаты своей работы через этот указатель. Когда вы передаёте данные по значению, связь между той переменной, значение которой вы передали, и самой функции обрывается, и функция НИКАК не сможет изменить значения той переменной. С указателями на переменную, связь между функцией и переменной остаётся.

Билет 23. Инструкции. Общие сведения.

Выражение – инструкция.

Любое выражение превращается в инструкцию, если после выражения поставить «;».

«х = 4» - выражение

« х = 4;» - инструкция

Составная инструкция.

Назначение: группировка отдельных инструкций.

Формат:

{

<инструкция 1>

<…>

<инструкция n>

}

Применяется она, когда синтаксис языка допускает наличие только одной инструкции, а тебе нужно поставить несколько.

Блок – частный случай составной инструкции.

Пустая инструкция «;»

Билет 24. Инструкции перехода.

Break, continue, return, go to

Break – прерываниецикла (инструкций for, while, do while)

Управление передаётся на 1ю инструкцию, которая стоит за телом цикла. Зе=здесь не указано, что является 1й инструкции цикла. Я сам точно не помню, но знаю, что n++ написанная в скобках – тоже инструкция цикла. Является она первой? Если да, то это необходимо отметить.

For (i = 0; i <= n; n++)

{

<телоцикла>

If (x<0)

Break

<другие действия> }

<1 ая инструкция вне тела цикла>

// на неё передаст управление инструкция break

Continue – продолжает цикл, но завершает текущий шаг цикла.

For (i=1; i<=10; i++)

{

If (i<=5 && i>=2)

Continue

Printf (“%d\n”, i);

}

// при таком исполнении программа не будет выводить числа от 2 до 2 на экран, так как continue передаст управление на след шаг цикла перепрыгивая функцию printf

Return – две задачи:

Сформировать результат, который вернёт функция

Завершить работу тела функции (в функциях с возвращаемым типом void нельзя писать return, и наоборот, в функциях с возвращаемым типом не void НЕОБХОДИМО писать return).

Я думаю здесь пример не нужен, так как он довольно громоздкий, а смысл return, надеюсь, и без того всем понятен.

Double sqrt_sum_sqr (double a, double b)

{

Return sqrt (a*a + b*b);

}

Int main (void)

{ printf (“%0.4g\n”, sqrt_sum_sqr(3, 4)); }

4) Go to

go to <a>, где <a> - метка инструкции к которой будет выполняться переход

if (x<0)

go to error;

<другие инструкции>

Error : printf (“ошибка!”) ;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]