Difference between revisions of "Nil/ru"

From Free Pascal wiki
Jump to navigationJump to search
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
 
{{Nil}}
 
{{Nil}}
  
[[Reserved_word/ru|Зарезервированное слово]] <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight> представляет собой специальное [[Constant/ru|значение]] [[Variable|переменной]]-указателя, не указывающей ни на что конкретное. В [[FPC/ru|FPC]] это реализовано как <syntaxhighlight lang="pascal" enclose="none">pointer(0)</syntaxhighlight> (числовое значение <syntaxhighlight lang="pascal" enclose="none">0</syntaxhighlight>), однако программист не должен использовать этот факт. На других языках программирования, например на C, кто-то пишет <syntaxhighlight lang="C" enclose="none">null</syntaxhighlight>. Термины “null pointer” или “nil pointer” используются взаимозаменяемо, даже среди программистов на Паскале.
+
[[Reserved_word/ru|Зарезервированное слово]] <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight> представляет собой специальное [[Constant/ru|значение]] [[Variable|переменной]]-указателя, не указывающей ни на что конкретное. В [[FPC/ru|FPC]] это реализовано как <syntaxhighlight lang="pascal" inline>pointer(0)</syntaxhighlight> (числовое значение <syntaxhighlight lang="pascal" inline>0</syntaxhighlight>), однако программист не должен использовать этот факт. На других языках программирования, например на C, кто-то пишет <syntaxhighlight lang="C" inline>null</syntaxhighlight>. Термины “null pointer” или “nil pointer” используются взаимозаменяемо, даже среди программистов на Паскале.
  
Есть два популярных объяснения этимологии <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight>. Кто-то говорит: <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight> означает латинское слово «nihil», означающее «ничего». Другой предполагает, что <syntaxhighlight lang="pascal" enclose="none">NIL</syntaxhighlight> - это английская аббревиатура, обозначающая “not in list” (нет в списке). Может быть, поскольку немецкое слово «Null» обозначает цифру «ноль», чтобы избежать путаницы или для различия между понятием и значением, было выбрано слово <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight>. Во всяком случае, это не имеет никакой разницы при программировании.
+
Есть два популярных объяснения этимологии <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight>. Кто-то говорит: <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight> означает латинское слово «nihil», означающее «ничего». Другой предполагает, что <syntaxhighlight lang="pascal" inline>NIL</syntaxhighlight> - это английская аббревиатура, обозначающая “not in list” (нет в списке). Может быть, поскольку немецкое слово «Null» обозначает цифру «ноль», чтобы избежать путаницы или для различия между понятием и значением, было выбрано слово <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight>. Во всяком случае, это не имеет никакой разницы при программировании.
  
 
__TOC__
 
__TOC__
  
 
== Совместимость присвоения ==
 
== Совместимость присвоения ==
<syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight> can be of course [[Becomes|assigned]] to a [[Pointer|<syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight>]] variable, but also to other types, which are in fact pointers, but their usage is more convenient.
+
<syntaxhighlight lang="pascal" inline>nil</syntaxhighlight> can be of course [[Becomes|assigned]] to a [[Pointer|<syntaxhighlight lang="pascal" inline>pointer</syntaxhighlight>]] variable, but also to other types, which are in fact pointers, but their usage is more convenient.
 
For instance [[Dynamic array|dynamic arrays]] or [[Class|classes]]:
 
For instance [[Dynamic array|dynamic arrays]] or [[Class|classes]]:
  
Конечно, <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight> может быть [[Becomes/ru|присвоен]] переменной [[Pointer/ru|<syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight>]], но также и другим типам, которые на самом деле являются указателями, но их использование более удобно. Например, [[Dynamic_array/ru|динамические массивы]] или [[Class/ru|классы]]:
+
Конечно, <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight> может быть [[Becomes/ru|присвоен]] переменной [[Pointer/ru|<syntaxhighlight lang="pascal" inline>pointer</syntaxhighlight>]], но также и другим типам, которые на самом деле являются указателями, но их использование более удобно. Например, [[Dynamic_array/ru|динамические массивы]] или [[Class/ru|классы]]:
 
<syntaxhighlight lang="pascal" line highlight="10,12,14,16,18">
 
<syntaxhighlight lang="pascal" line highlight="10,12,14,16,18">
 
program nilDemo(input, output, stderr);
 
program nilDemo(input, output, stderr);
Line 33: Line 33:
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
Обратите внимание, что присвоение <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight> динамическому массиву практически эквивалентно вызову процедуры <syntaxhighlight lang="pascal" enclose="none">setLength(dynamicArrayVariable, 0)</syntaxhighlight>. Значения массива теряются, если счетчик ссылок <tt>dynamicArrayVariable</tt> достигает нуля. Однако не существует сопоставимого механизма для других типов, например, присвоение <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight> переменной <syntaxhighlight lang="pascal" enclose="none">class</syntaxhighlight>'а или <syntaxhighlight lang="pascal" enclose="none">pointer</syntaxhighlight> ''не'' освободит (т.е. де-аллокирует) память, которая, возможно, была занята ссылочной структурой.
+
Обратите внимание, что присвоение <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight> динамическому массиву практически эквивалентно вызову процедуры <syntaxhighlight lang="pascal" inline>setLength(dynamicArrayVariable, 0)</syntaxhighlight>. Значения массива теряются, если счетчик ссылок <tt>dynamicArrayVariable</tt> достигает нуля. Однако не существует сопоставимого механизма для других типов, например, присвоение <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight> переменной <syntaxhighlight lang="pascal" inline>class</syntaxhighlight>'а или <syntaxhighlight lang="pascal" inline>pointer</syntaxhighlight> ''не'' освободит (т.е. де-аллокирует) память, которая, возможно, была занята ссылочной структурой.
  
 
== Приложение ==
 
== Приложение ==
В манере Паскаля вы обычно не пишете такие выражения, как <syntaxhighlight lang="pascal" enclose="none">pointerVariable = nil</syntaxhighlight>, а используете более толковые идентификаторы. Шаблон [[Assigned|<syntaxhighlight lang="pascal" enclose="none">system.assigned</syntaxhighlight>]] заменяется точно таким же выражением, но скрывает тот факт, что переменная (''реализована'' как) указатель. Поэтому его использование не является обязательным.
+
В манере Паскаля вы обычно не пишете такие выражения, как <syntaxhighlight lang="pascal" inline>pointerVariable = nil</syntaxhighlight>, а используете более толковые идентификаторы. Шаблон [[Assigned|<syntaxhighlight lang="pascal" inline>system.assigned</syntaxhighlight>]] заменяется точно таким же выражением, но скрывает тот факт, что переменная (''реализована'' как) указатель. Поэтому его использование не является обязательным.
  
Шаблон [[FreeAndNil|<syntaxhighlight lang="pascal" enclose="none">SysUtils.FreeAndNil</syntaxhighlight>]] будет вызывать шаблон класса <syntaxhighlight lang="pascal" enclose="none">free</syntaxhighlight> и присваивать <syntaxhighlight lang="pascal" enclose="none">nil</syntaxhighlight> передаваемому указателю (переменной типа <tt>class</tt>). Хотя это хорошая идея, очистить указатели, которые больше не указывают на допустимые объекты, это может усложнить отладку, так как нет доступного указателя, указывающего на адрес, которым был определенный объект.
+
Шаблон [[FreeAndNil|<syntaxhighlight lang="pascal" inline>SysUtils.FreeAndNil</syntaxhighlight>]] будет вызывать шаблон класса <syntaxhighlight lang="pascal" inline>free</syntaxhighlight> и присваивать <syntaxhighlight lang="pascal" inline>nil</syntaxhighlight> передаваемому указателю (переменной типа <tt>class</tt>). Хотя это хорошая идея, очистить указатели, которые больше не указывают на допустимые объекты, это может усложнить отладку, так как нет доступного указателя, указывающего на адрес, которым был определенный объект.
  
== see also ==
+
== См.также ==
* [[^|<syntaxhighlight lang="pascal" enclose="none">^</syntaxhighlight>]]
+
* [[%5E/ru|Оператор разыменования указателя <syntaxhighlight lang="pascal" inline>^</syntaxhighlight>]]
* {{Doc|package=RTL|unit=system|identifier=returnnilifgrowheapfails|text=<syntaxhighlight lang="pascal" enclose="none">system.returnNilIfGrowHeapFails</syntaxhighlight>}}
+
* Переменная {{Doc|package=RTL|unit=system|identifier=returnnilifgrowheapfails|text=<syntaxhighlight lang="pascal" inline>system.returnNilIfGrowHeapFails</syntaxhighlight>}}
* <syntaxhighlight lang="pascal" enclose="none">{$objectChecks on}</syntaxhighlight>
+
* <syntaxhighlight lang="pascal" inline>{$objectChecks on}</syntaxhighlight>
* [[Nullable types|nullable types]]
+
* [[Nullable types|Обнуляемые типы]]
  
 
[[Category:Code]]
 
[[Category:Code]]

Latest revision as of 16:25, 6 August 2022

Deutsch (de) English (en) suomi (fi) français (fr) русский (ru) 中文(中国大陆)‎ (zh_CN)

Зарезервированное слово nil представляет собой специальное значение переменной-указателя, не указывающей ни на что конкретное. В FPC это реализовано как pointer(0) (числовое значение 0), однако программист не должен использовать этот факт. На других языках программирования, например на C, кто-то пишет null. Термины “null pointer” или “nil pointer” используются взаимозаменяемо, даже среди программистов на Паскале.

Есть два популярных объяснения этимологии nil. Кто-то говорит: nil означает латинское слово «nihil», означающее «ничего». Другой предполагает, что NIL - это английская аббревиатура, обозначающая “not in list” (нет в списке). Может быть, поскольку немецкое слово «Null» обозначает цифру «ноль», чтобы избежать путаницы или для различия между понятием и значением, было выбрано слово nil. Во всяком случае, это не имеет никакой разницы при программировании.

Совместимость присвоения

nil can be of course assigned to a pointer variable, but also to other types, which are in fact pointers, but their usage is more convenient. For instance dynamic arrays or classes:

Конечно, nil может быть присвоен переменной pointer, но также и другим типам, которые на самом деле являются указателями, но их использование более удобно. Например, динамические массивы или классы:

 1program nilDemo(input, output, stderr);
 2var
 3	loc: pointer;
 4	chk: array of boolean;
 5	msg: PChar;
 6	prc: TProcedure;
 7	obj: TObject;
 8begin
 9	// указываем в никуда
10	loc := nil;
11	// очищаем динамический массив
12	chk := nil;
13	// очищаем строку
14	msg := nil;
15	// процедурная переменная не ссылается ни на одну процедуру
16	prc := nil;
17	// теряем ссылку на объект
18	obj := nil;
19end.

Обратите внимание, что присвоение nil динамическому массиву практически эквивалентно вызову процедуры setLength(dynamicArrayVariable, 0). Значения массива теряются, если счетчик ссылок dynamicArrayVariable достигает нуля. Однако не существует сопоставимого механизма для других типов, например, присвоение nil переменной class'а или pointer не освободит (т.е. де-аллокирует) память, которая, возможно, была занята ссылочной структурой.

Приложение

В манере Паскаля вы обычно не пишете такие выражения, как pointerVariable = nil, а используете более толковые идентификаторы. Шаблон system.assigned заменяется точно таким же выражением, но скрывает тот факт, что переменная (реализована как) указатель. Поэтому его использование не является обязательным.

Шаблон SysUtils.FreeAndNil будет вызывать шаблон класса free и присваивать nil передаваемому указателю (переменной типа class). Хотя это хорошая идея, очистить указатели, которые больше не указывают на допустимые объекты, это может усложнить отладку, так как нет доступного указателя, указывающего на адрес, которым был определенный объект.

См.также