- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
232 Глава 5
же шириной полей, что и раньше, так что соответствующие значения оказываются друг под другом.
Как вы можете видеть из вывода перед первым вызовом lowest (), третий элемент массива, array [2], содержит минимальное значение, так что функция возвращает ссылку на него и его значение изменяется на б. 9. Аналогично, после второго вызова array [ 10 ] изменяется на 7 . 9. Это достаточно ясно демонстрирует, что возврат ссыл- ки позволяет использовать функцию в левой части оператора присваивания.
Конечно, при желании вы можете использовать ее и в правой части присваива- ния или в составе любых других подходящих выражений. Если есть два массива — X и Y — с количеством элементов, указанным соответственно в lenx и leny, вы можете присвоить минимальному элементу массива х удвоенное значение удвоенного мини- мального элемента у в следующем операторе:
Этот оператор должен вызвать функцию lowest () дважды — один раз с аргумен- тами у и leny в выражении правой части присваивания и один — с аргументами х и lenx для получения адреса, куда должен быть сохранен результат правого выраже- ния.
Еще одно железное правило: возврат ссылок
То же правило, которое применяется к возврату указателей из функций, также ка- сается возврата ссылок.
Никогда не возвращайте из функции ссылку на локальную переменную.
Пока мы оставим тему возврата ссылок из функций, но пока не будем закрывать ее окончательно. Мы вернемся к ней опять в контексте определяемых пользователем типов и объектно-ориентированного программирования и узнаем еще о нескольких волшебных вещах, которые можно делать со ссылками.
Статические переменные в функциях
Есть несколько вещей, которые невозможно делать с автоматическими переменны- ми внутри функций. Например, невозможно подсчитать, сколько раз функция вызы- валась, поскольку нельзя накапливать значение счетчика от вызова к вызову. Однако существует не один способ обойти это при необходимости. Например, вы можете использовать параметр-ссылку для обновления счетчика в вызывающей программе, хотя это не поможет, если функция вызывается из множества разных мест програм- мы. Вы можете применить глобальную переменную, значение которой увеличивать внутри функции, но глобальные объекты — рискованная вещь, поскольку доступны в любой точке программы, что открывает путь к их непреднамеренному изменению.
Глобальные переменные также опасно применять в многопоточных программах, когда несколько одновременно выполняющихся потоков управления имеют доступ к ним, и вы должны специально позаботиться об управлении доступом из разных по- токов. Основная проблема, связанная с тем, что более одного потока имеют доступ к глобальной переменной, заключается в том, что один поток может изменить значе- ние глобальной переменной в то время как другой работает с ней. Наилучшее реше- ние в таких случаях состоит в том, чтобы вообще избегать применения глобальных переменных.
Чтобы создать переменную, чье значение сохраняется от одного вызова функции до другого, можно объявить ее внутри функции с ключевым словом static. При этом
Структурная
организация программ
используется точно такая же форма объявления static переменной, как вы уже ви- дели в главе 2. Например, чтобы объявить переменную count как static, можно вос- пользоваться таким оператором:
Это также инициализирует ее нулем.
Инициализация статической переменной в функции происходит только при первом вызове функции. Фактически, именно при первом вызове статическая переменная создается и ини- циализируется. Затем она продолжает существовать на протяжении всего времени выпол- нения программы, и любое значение, которое она имеет при завершении функции, остается доступным при следующемеевызове.
Следующий простой пример демонстрирует поведение статической переменной в функции.