[Powered by Google Translate] DAVID DICIURCIO: Так важна разабрацца ў
праграмаванні з'яўляецца паняцце сферы.
Вобласць можа быць вызначаны як кантэкст, у якім пераменная
бачнымі або даступнымі.
Напрыклад, выкажам здагадку, што ў нас ёсць функцыя, асноўны, гэта значыць
Мяркуецца павелічэння зменнай х, ад аднаго да двух.
Як мы бачым, асноўны ініцыялізуе х да аднаго, друкуецца
некаторыя тэкст, а затым запускае функцыю прырашчэння, перш чым
друкаваць тэкст.
Калі гэтая функцыя была карэктнай, было б
раздрукаваць х як 2.
Давайце паспрабуем.
>> Так што, як бачыце, асноўная не рабіць тое, што мы чакалі.
Ён вяртае значэнне 1, а
чым 2 мы чакалі.
Прычына гэтая памылка можа быць растлумачаная вобласці.
У функцыі, асноўныя, мы ініцыялізуецца х
толькі ў межах функцыі.
Іншымі словамі, зменная х аб'яўлена лакальна ў рамках
функцыі, асноўныя, і не даступны
за межамі функцыі.
Толькі асноўныя можаце атрымаць доступ да X ў гэтай сітуацыі.
Калі мы называем прырашчэнне мы не перадаем х у якасці ўваходных, але
проста копіяй х.
У выніку гэтага, функцыя прырашчэння толькі дадае
значэнне 1 копію значэння х.
Але не х сабе.
Калі мы вернемся да асноўнай, х сама не змянілася.
Такім чынам, выводзячы х толькі даюць значэнне 1.
>> Ну, тое, што пакідае пытанне: як мы павінны выправіць
гэтую функцыю?
Адным з рашэнняў аказвае прырост вяртаць значэнне.
Такім чынам, функцыя прырост будзе
вярнуць нам цэлае.
Такім чынам, вось наш перагледжаны код
Альтэрнатыўная функцыя прырашчэння.
Тут мы замест гэтага вярнуўся х + 1, а не проста канец
з х роўная х + 1.
Акрамя таго, звярніце ўвагу, што мы замянілі выхад
прырашчэнне, раней пустэчу, з унутр, заявіўшы, што
прырашчэнне цяпер будзе перадаць назад у цэлае лік.
Цяпер, пасля прырашчэння працуе, ён вернецца са значэннем
2, дакладна так, як мы планавалі.
>> Іншая сітуацыя, якая дэманструе важнасць асцылографа
У scopeloop.c.
У гэтым кодзе у нас ёсць цыкл, у якім пераменная
Усяго ініцыялізуецца пры кожным кроку.
На жаль, гэты код не кампілюецца.
Гэта таму, што пераменная агульнага самай справе не існуе
за межамі цыклу.
Зменныя, абвешчаныя ўнутры цыклаў існуе толькі ў
сам цыкл і прадэманстравалі ў нашых памылках
Паведамленне, усяго неаб'яўленай.
Зменная Увогуле да гэтага часу не абвешчаны ў рамках
функцыі асноўнага.
Акрамя таго, у кожнай ітэрацыі нашага цыклу, мы
якія переинициализация наш агульны 0.
Гэта само па сабе не вядзе кода пры кампіляцыі, але гэта
б не дапусціць поўнай з калі-небудзь падводзячы да значэння мінулага 1.
>> Зноў жа, што гэта лепшы спосаб гэта выправіць?
Адзін з самых простых метадаў ўключае ў сябе стварэнне агульнай для мясцовых
функцыі, асноўныя, а не сам цыкл.
Гэта складзе на самай справе павялічваецца, і, нарэшце,
каб яго можна было надрукавана пасля цыклу.
Іншы метад, які я толькі коратка будзе
быць выкарыстанне глабальных зменных.
Глабальныя зменныя з'яўляюцца зменнымі, якія былі абвешчаныя да асноўнага
, Якія захоўваюць сваю каштоўнасць на працягу ўсёй праграмы.
Вядома, функцыі можна змяніць значэнне глабальнай,
але яны не выходзяць за рамкі, як лакальныя зменныя.
Аднак, выкарыстоўваючы глабальныя зменныя, як правіла, нахмурыўся
як на дрэнны дызайн, так як ёсць больш эфектыўныя спосабы
абмену дадзенымі паміж функцыямі.
Напрыклад, з дапамогай паказальнікаў.
Але пра гэта ў іншы раз.
>> Нарэшце, важна мець разуменне сферы
ў кантэксце памяці кампутара, або аператыўнай памяці.
Калі мы выконваем праграму, лакальныя зменныя і функцыі
дадаюць у пэўным месцы ў
RAM называюць стэкам.
Як вяртання функцыі, кадры стэка з зменных
эфектыўна выдаляецца з стэка вызваліць больш памяці.
Такім чынам, пры разглядзе сферы, пераканайцеся, што вы памятаеце гэтыя тры
ключавыя моманты.
Адзін з іх, сфера можа быць лакальнымі або глабальнымі.
Гэта залежыць ад таго, дзе гэтая пераменная аб'яўлена.
Дзве зменныя, абвешчаныя або ініцыялізуецца ў функцыі
мясцовага гэтай функцыяй і не можа быць зменены іншымі
Функцыі, па меншай меры, не выкарыстоўваючы паказальнікі.
І, нарэшце, зменныя таксама з'яўляюцца лакальнымі для завесы, якія
абвешчаны ст.
Зменных не даступныя
па-за цыклу.
>> Гэта ўсё, што на дадзены момант на вобласць.
Дзякуй за прагляд.