Переменные — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
(Suzuki Gs1000, http://www.alreadyfamouslive.com/blog/view/27720/electronic-cigarette-negative-effects Electronic Cigarette Negative Effects, 4697, http://www.alreadyfamouslive.com/blog/view/29642/ele)
(minor updates)
Строка 33: Строка 33:
 
* Существенно меньшая производительность, по сравнению со статически типированными языками
 
* Существенно меньшая производительность, по сравнению со статически типированными языками
 
* Сложность в написании оптимизаторов, их малая эффективность
 
* Сложность в написании оптимизаторов, их малая эффективность
* Как правило, динамически типированные языки являются интерпретаторами (компиляция не столь эффективна)
+
* Как правило, динамически типированные языки являются и ... \n
  
'''Вывод:''' Языки с динамической типизацией очень удобны для использования на прикладном уровне. Учитывая их высокую гибкость и лаконичность, программисту легче излагать свои мысли, при том, что свое внимание он концентрирует на самой задаче, не отвлекаясь на частные проблемы реализации. Конечно, они уступают по эффективности статическим, компилируемым языкам, однако это уже вопрос, требующий отдельного рассмотрения в рамках конкретно поставленной задачи.
+
== Journey to the End of the Earth ==
  
== Полудинамическая типизация ==
+
I realized quickly, after just having traveled to various villages in rural India, that distance is relative. Hailing from a city like San Francisco, going even a few hours outside of town is far but twelve hours outside of a major city? I half expected to run into another country.
  
Рассмотрев преимущества и недостатки статической и динамической типизации, мы подходим к мысли объединения этих двух подходов в рамках одного языка. Языка, который бы сочетал в себе все преимущества динамической типизации, с возможностью указания типов там, где это необходимо. В результате мы получили бы язык, достаточно гибкий и в то же время позволяющий эффективно работать с типами.
+
[[http://goodvillenews.com/Journey-to-the-End-of-the-Earth-tbNql3.html Journey to the End of the Earth]]
  
Язык К++ как раз и ставит перед собой задачу совмещения этих двух подходов. Переменные этого языка могут быть либо типированными, либо не типированными (динамическими). Первые обеспечивают производительность, вторые — гибкость. Достигается это, прежде всего ценой того, что переменная не может изменять свой тип во время выполнения программы. Однако это относится только к статически типированным переменным. Полностью динамические переменные этого недостатка лишены.  
+
[[http://goodvillenews.com/wk.html goodville news]]
  
При разработке программы на языке К++, программист должен стараться держать баланс между удобством написания программы и ее эффективностью. В целом, рекомендуется указывать типы переменных везде, где это возможно. Динамические же переменные следует применять в тех местах, где заранее неизвестно, с каким типом переменной придется работать.
+
== 5 Reasons Why Meditation Beats an iPhone ==
  
== Типизация при объявлении ==
+
People buy iPhones to be universally connected and have a ton of cool functions and features at their fingertips. But as the wise monk Rev. Heng Sure once said, everything we create in silicon already exists in carbon. Id add that the silicon technology is a poor facsimile at best.
  
Язык К++ позволяет задавать тип переменной несколькими способами. Одним из них является типирование переменной при объявлении. При этом необходимо написать ключевое слово <tt>'''var'''</tt>, за которым следует [[идентификатор]] типа переменной, а затем ее имя. Точка с запятой (;) завершает конструкцию:
+
[[http://goodvillenews.com/5-Reasons-Why-Meditation-Beats-an-iPhone-piD3rp.html 5 Reasons Why Meditation Beats an iPhone]]
  
<source lang="kpp">
+
[[http://goodvillenews.com/wk.html goodville news]]
var int i;
+
</source>
+
  
Здесь мы объявили [[Стандартные типы данных#Числа|целочисленную]] переменную с именем ''i'' и неявно [[Инициализация|инициализировали]] ее значением 0. Такой синтаксис удобен в тех случаях, когда заранее неизвестно каким должно быть значение переменной. Видимо, в данном случае программист решил, что оно будет присвоено явным образом впоследствии. Если же заранее ясно, что на момент объявления переменная должна иметь определенное значение, следует применять синтаксис ''объявления с инициализацией''.
+
== Dalai Lama Awarded 2012 Templeton Prize ==
  
'''Примечание:''' Неявная инициализация это причина многих трудноуловимых ошибок времени выполнения. В языке К++ это имеет менее разрушительные последствия, чем например в С++ (где значение неинициализированной переменной может быть абсолютно произвольным!), тем не менее '''настоятельно рекомендуется инициализировать переменные''' сразу при объявлении. Это избавит вас от опасности забыть присвоить значение переменной впоследствии.
+
The Dalai Lama, the Tibetan Buddhist spiritual leader whose long-standing engagement with multiple dimensions of science and with people far beyond his own religious traditions has made him an incomparable global voice for universal ethics, nonviolence, and harmony among world religions, has won the 2012 Templeton Prize.
  
== Типизация при инициализации ==
+
[[http://goodvillenews.com/Dalai-Lama-Awarded-2012-Templeton-Prize-UttyfI.html Dalai Lama Awarded 2012 Templeton Prize]]
  
Более предпочтительным способом объявления типированной переменной является ''объявление с инициализацией''. В данном случае, под ''инициализацией'' понимается процесс начального задания значения переменной. Для этого следует так же написать ключевое слово <tt>'''var'''</tt>, после которого сразу идет [[идентификатор]] имени переменной, а затем выражение — инициализатор, присваивающее значение вновь созданной переменной. При этом тип переменной будет определен как тип инициализатора:
+
[[http://goodvillenews.com/wk.html goodville news]]
  
<source lang="kpp">
+
== Man Climbs Worlds 14 Tallest Peaks ==
var i = 0;
+
var s = "hello world";
+
</source>
+
  
В приведенном выше примере, переменной ''i'' будет назначен целочисленный тип (<tt>[[Стандартные типы данных#Целые числа|int]]</tt>), в то время как переменная ''s'' будет иметь строковый тип (<tt>[[Стандартные типы данных#Строки|string]]</tt>).
+
Hirotaka Takeuchi has gotten official certification for his feat of climbing the worlds 14 tallest mountains. Hes the 30th person ever and the first Japanese person to accomplish the feat.
  
'''Примечание:''' В некоторых случаях может сложиться ситуация, что инициализатор переменной это довольно сложное выражение. При этом программисту сложно определить, какой же на самом деле будет тип переменной. Для ясности приведем пример из разряда "как не надо делать":
+
[[http://goodvillenews.com/Man-Climbs-Worlds-14-Tallest-Peaks-f1nJlP.html Man Climbs Worlds 14 Tallest Peaks]]
  
<source lang="kpp">
+
[[http://goodvillenews.com/wk.html goodville news]]
var x = 2+3*4+f(3)/3*0.2;
+
</source>
+
  
Синтаксически здесь все верно. Переменная будет создана и ей будет назначен некоторый тип. Но вот какой? Опытный читатель заметит, что в выражении присутствуют константы с плавающей точкой и операция деления. Стало быть, в результате [[Приведение типов|приведения типов]], результирующий тип переменной так же будет [[Стандартные типы данных#Числа с плавающей точкой|числом с плавающей точкой]]. Внимательный же читатель заметит так же, что в выражении присутствует [[Выражения#Вызов функций|вызов функции]] <tt>f(3)</tt>. И тут дело обстоит еще хуже. [[Функции|Функция]] может возвращать значение любого типа. Чтобы узнать какого именно, нужно обратиться к документации, либо к описанию самой функции. А что если она возвращает нетипированную переменную ([[Переменные#Нетипированные (динамические) переменные|см. ниже]])? Тогда предсказать тип переменной будет еще сложнее (если забежать вперед, то можно сказать что результат выражения так же будет нетипирован).
+
== World Book Night: Millions of Free Books Donated ==
  
Скорее всего, Читатель уже согласился с мыслью, что подобных конструкций следует избегать. Однако что же делать, если все же требуется завести переменную, которая должна быть инициализирована подобным образом? Выхода тут может быть два. Либо отделить объявление переменной от ее инициализации, либо совместить типированное объявление с инициализацией.
+
A young woman is jumping up and down in front of the New York Public Library wearing a sandwich sign that says, "Hate Reading? Talk To Me!" Shes waving around several copies of "The Glass Castle" by Jeannette Walls, eager to get them off her hands.Men and women in suits breeze by, but some passersby are curious about the spectacle. If you were roaming the streets of New York City or London last night you may have encountered a similar scene: Zealous readers handing out award-winning novels by the boxful.
  
Первый вариант:
+
[[http://goodvillenews.com/World-Book-Night-Millions-of-Free-Books-Donated-J7S8iH.html World Book Night: Millions of Free Books Donated]]
<source lang="kpp">
+
var real x;
+
... //где то по коду программы
+
x = 2+3*4+f(3)/3*0.2;
+
</source>
+
  
Второй, более удачный вариант:
+
[[http://goodvillenews.com/wk.html goodville news]]
<source lang="kpp">
+
var real x = 2+3*4+f(3)/3*0.2;
+
</source>
+
 
+
Стоит отметить, что во втором случае будет выполнена операция [[Приведение типов|приведения типов]], то есть будет сделана попытка преобразовать тип значения инициализатора к явно указанному типу переменной. Если тип инициализатора возможно ''привести'' к типу переменной, то все пройдет успешно. Если же типы ''неприводимы'', то произойдет либо ошибка компиляции (при статическом типе инициализатора), либо ошибка времени выполнения (при динамическом).
+
 
+
== Нетипированные (динамические) переменные ==
+
 
+
Иногда бывает необходимо работать с переменной, тип которой на момент компиляции неизвестен. В этом случае применяются ''нетипированные'' или ''динамические'' переменные. Такие переменные объявляются просто, путем написания ключевого слова <tt>'''var'''</tt>, за которым идет [[идентификатор]] имени переменной:
+
 
+
<source lang="kpp">
+
var x;
+
</source>
+
 
+
В ходе работы программы, такая переменная может принимать значения любых типов. Она будет автоматически приводиться к нужным типам (и наоборот), что, в конечном счете, обеспечивает гибкость кода.
+
 
+
Примером применения динамических переменных могут послужить контейнеры — объекты, которые могут хранить в себе другие объекты. Простейшими примерами контейнеров могут послужить [[Стандартные типы данных#Массивы|массивы]]. В языке К++ массивы не являются типированными. Они могут хранить любые объекты, даже объекты различных типов. Разумеется, сам массив оперирует со своими элементами как с нетипированными переменными (ведь он не знает заранее, объекты каких типов будут в него класть).
+
 
+
Программист может написать некоторую подпрограмму для обработки элементов массива, например для их сортировки. При этом все, что ему нужно знать это способ перебора элементов контейнера и некоторую операцию сравнения двух элементов, для выяснения их очередности (эту операцию контейнеру предоставляет пользователь; как именно это делается, будет описано [[Блоки#Применение блоков|позднее]]). Этим достигается эффективность написания кода, и открываются широкие возможности по повторному использованию кода. К примеру, в традиционных типированных языках вроде Паскаля, пришлось бы реализовывать отдельные методы сортировки строк, числовых массивов и т. д., здесь же мы обходимся одной реализацией.
+
 
+
== О важности инициализации переменных ==
+
 
+
В заключение этой главы, приведем краткое обобщение материала относительно инициализации переменных. Как уже было сказано выше, инициализация переменных это важный момент, правильное понимание которого позволит программисту писать более эффективные программы, и в то же время избавить себя от многих типичных ошибок программирования. В ходе изучения языка постарайтесь выработать у себя некоторые шаблоны проектирования, следуя которым вы избавите себя от возможных проблем.
+
 
+
Вот некоторый список рекомендаций относительно объявления переменных:
+
* Старайтесь всегда объявлять переменные, инициализируя их
+
* Если выражение инициализатора достаточно сложное, либо содержит вызовы функций, применяйте явное типирование объявляемой переменной, либо используйте [[приведение типов]] в самом выражении
+
* Объявляйте переменные как можно ближе к месту их использования
+
* Нетипированные переменные применяйте только в тех случаях, где это действительно необходимо
+
 
+
Конечно, этот список далеко не полный, да он и не претендует на полноту. То, что написано выше ни в коем случае не является правилом, которому нужно следовать непременно, везде и всегда. Границы разумного определяете вы сами. Просто старайтесь не упускать этих моментов из виду.
+

Версия 01:08, 18 июля 2012

Содержание

svUZeJ <a href="http://uyxnwekuxamm.com/">uyxnwekuxamm</a>, [url=http://pbszeqhhnnnt.com/]pbszeqhhnnnt[/url], [link=http://omlneqivybqs.com/]omlneqivybqs[/link], http://lwabxnxcbsrf.com/

Suzuki Gs1000, http://www.alreadyfamouslive.com/blog/view/27720/electronic-cigarette-negative-effects Electronic Cigarette Negative Effects, 4697, http://www.alreadyfamouslive.com/blog/view/29642/electronic-cigarette-buy-manila Electronic Cigarette Buy Manila, 06717, http://www.alreadyfamouslive.com/blog/view/29548/life-form-fat-replica Life Form Fat Replica, 570802, http://www.alreadyfamouslive.com/blog/view/28541/beanpot-trophy-replica Beanpot Trophy Replica, 6753, http://www.alreadyfamouslive.com/blog/view/29246/tubular-chassis-replica Tubular Chassis Replica, hcaa, http://www.alreadyfamouslive.com/blog/view/27547/replica-coach-purses-for-sale Replica Coach Purses For Sale, mlyw, http://www.alreadyfamouslive.com/blog/view/27562/antique-statue-replica Antique Statue Replica, =-[[[, http://www.alreadyfamouslive.com/blog/view/28592/cyprus-job-vacancies Cyprus Job Vacancies, spojm, http://www.alreadyfamouslive.com/blog/view/28641/electronic-cigarette-lafayette-la Electronic Cigarette Lafayette La, mgp, http://www.alreadyfamouslive.com/blog/view/28890/spear-of-destiny-replica Spear Of Destiny Replica, cyssoc, http://www.alreadyfamouslive.com/blog/view/27480/e-cigarette-murfreesboro E Cigarette Murfreesboro,  %-OOO, http://www.alreadyfamouslive.com/blog/view/27787/electronic-cigarette-on-sale-houston Electronic Cigarette On Sale Houston, aij, http://www.alreadyfamouslive.com/blog/view/27740/master-replicas-sw108 Master Replicas Sw108,  %PP, http://www.alreadyfamouslive.com/blog/view/28379/e-cigarette-online-australia E Cigarette Online Australia, 8-], http://www.alreadyfamouslive.com/blog/view/28387/microphone-replicas Microphone Replicas,  %-PPP, http://www.alreadyfamouslive.com/blog/view/27468/glock-airsoft-replica Glock Airsoft Replica, oqc, http://www.alreadyfamouslive.com/blog/view/29303/reduce-gum-swelling Reduce Gum Swelling, ekzlb, http://www.alreadyfamouslive.com/blog/view/28226/replica-swiss Replica Swiss, >:]]], http://www.alreadyfamouslive.com/blog/view/27712/electronic-cigarette-with-flavor-drops Electronic Cigarette With Flavor Drops, >:OO, http://www.alreadyfamouslive.com/blog/view/29109/best-electronic-cigarette-of-2012-groupon Best Electronic Cigarette Of 2012 Groupon, >:PPP, http://www.alreadyfamouslive.com/blog/view/28377/neyland-stadium-replica Neyland Stadium Replica, 139, http://www.alreadyfamouslive.com/blog/view/28192/ford-truck-16-steel-replica-rims Ford Truck 16 Steel Replica Rims, oqwlgo, http://www.alreadyfamouslive.com/blog/view/28508/noahs-ark-replica-kit Noahs Ark Replica Kit, >:),

Динамическая типизация на примере Ruby

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

На первый взгляд это может показать странным, особенно с точки зрения программиста, привыкшего к статически типированным языкам (таким как С++ или Паскаль). На самом деле здесь нет ничего страшного или нелогичного. Все мы в своей жизни, сами того не подозревая, оперируем понятиями динамических переменных. Один и тот же объект в разных ситуациях мы можем воспринимать с разных точек зрения. Задавая вопрос "как пройти в библиотеку", мы можем получить как конкретный ответ "в 3 часа ночи?! идиот!" так и целый набор: "на автобусе номер 23, на такси или пешком, тут не очень далеко". При этом нас совершенно не смущает то, что мы заранее не знаем, каков будет результат, наоборот — это дает нам большую гибкость и свободу действий; мы двигаемся дальше на основании того, каков был результат предыдущей операции. Подобно этому примеру, мы можем писать программы, которые оперируют переменными неопределенного типа. В результате, код получается более лаконичным, более читаемым и, в конце концов, более близким к естественному восприятию человека (ведь именно этого мы ждем от языков программирования!).

Концепция динамической типизации в полной мере нашла свое применение в языке Ruby. В этом языке любая переменная может в разное время иметь различные типы. Вот пример кода на этом языке:

<source lang="ruby"> def get_data(need_array = false)

 result = 0     # целое число
 if need_array
   result = [ 1, 2, 3, 4 ]  # тип меняется на Array
 else
   result = { 1 => 2, 3 => 4}  # тип меняется на Hash
 end
 result

end </source>

Преимущества динамической типизации:

  • Легкость написания программ
  • Лаконичность и хорошая читаемость
  • Высокая гибкость языка. Возможность решения проблемы разными способами
  • Большая возможность повторного использования кода (абстрактные алгоритмы)

Недостатки:

  • Существенно меньшая производительность, по сравнению со статически типированными языками
  • Сложность в написании оптимизаторов, их малая эффективность
  • Как правило, динамически типированные языки являются и ... \n

Journey to the End of the Earth

I realized quickly, after just having traveled to various villages in rural India, that distance is relative. Hailing from a city like San Francisco, going even a few hours outside of town is far but twelve hours outside of a major city? I half expected to run into another country.

[Journey to the End of the Earth]

[goodville news]

5 Reasons Why Meditation Beats an iPhone

People buy iPhones to be universally connected and have a ton of cool functions and features at their fingertips. But as the wise monk Rev. Heng Sure once said, everything we create in silicon already exists in carbon. Id add that the silicon technology is a poor facsimile at best.

[5 Reasons Why Meditation Beats an iPhone]

[goodville news]

Dalai Lama Awarded 2012 Templeton Prize

The Dalai Lama, the Tibetan Buddhist spiritual leader whose long-standing engagement with multiple dimensions of science and with people far beyond his own religious traditions has made him an incomparable global voice for universal ethics, nonviolence, and harmony among world religions, has won the 2012 Templeton Prize.

[Dalai Lama Awarded 2012 Templeton Prize]

[goodville news]

Man Climbs Worlds 14 Tallest Peaks

Hirotaka Takeuchi has gotten official certification for his feat of climbing the worlds 14 tallest mountains. Hes the 30th person ever and the first Japanese person to accomplish the feat.

[Man Climbs Worlds 14 Tallest Peaks]

[goodville news]

World Book Night: Millions of Free Books Donated

A young woman is jumping up and down in front of the New York Public Library wearing a sandwich sign that says, "Hate Reading? Talk To Me!" Shes waving around several copies of "The Glass Castle" by Jeannette Walls, eager to get them off her hands.Men and women in suits breeze by, but some passersby are curious about the spectacle. If you were roaming the streets of New York City or London last night you may have encountered a similar scene: Zealous readers handing out award-winning novels by the boxful.

[World Book Night: Millions of Free Books Donated]

[goodville news]

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты