Перейти к содержимому

C typeof что это

  • автор:

Оператор typeof

Оператор typeof позволяет определить тип параметра (число, строка, объект). Оператор возвращает строку, содержащую тип ( ‘number’ , ‘string’ , ‘object’ ).

Для null оператор возвращает ‘object’ (это признанная ошибка языка). Для функций оператор возвращает ‘function’ . Это сделано для удобства, так как типа ‘function’ не существует.

Синтаксис

У оператора typeof есть 2 синтаксиса (оба синтаксиса работают одинаково):

typeof параметр; typeof(параметр);

Пример

Давайте посмотрим, как typeof работает с числом:

В результате выполненного кода мы получим значение number :

Пример

Теперь давайте зададим в параметре строку:

typeof ‘str’;

Результат выполнения кода:

Пример

Теперь укажем в параметре булевое значение true :

typeof true;

Результат выполнения кода:

Пример

Давайте посмотрим какой тип у значения undefined :

typeof undefined;

После выполнения кода мы получим также undefined :

Пример

Теперь давайте узнаем тип пустого объекта:

Результат выполнения кода:

Пример

А теперь узнаем тип пустого массива:

В результате также получим ‘object’ :

Пример

Давайте узнаем тип значения null :

typeof null;

В результате также получим ‘object’ , что является признанной ошибкой языка:

Пример

Теперь определим тип пустой функции:

typeof function() <>;

После выполнения кода мы получим ‘function’ , несмотря на то, что такого типа не существует. Данная строка нужна для удобства пользователя при определении функции:

Пример

Напишем функцию, которая будет выводить только числа:

function printNumber(number) < if (typeof number === 'number') < console.log(number); >> printNumber(2); printNumber(‘str’); printNumber(3);

Смотрите также

  • функцию isNaN ,
    которая осуществляет проверку на NaN
  • функцию isFinite ,
    которая проверяет число на конечность

Восемь типов данных, typeof

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/types.

В JavaScript существует несколько основных типов данных.

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

Число «number»

var n = 123; n = 12.345;

Единый тип число используется как для целых, так и для дробных чисел.

Существуют специальные числовые значения Infinity (бесконечность) и NaN (ошибка вычислений).

Например, бесконечность Infinity получается при делении на ноль:

alert( 1 / 0 ); // Infinity

Ошибка вычислений NaN будет результатом некорректной математической операции, например:

alert( "нечисло" * 2 ); // NaN, ошибка

Эти значения формально принадлежат типу «число», хотя, конечно, числами в их обычном понимании не являются.

Особенности работы с числами в JavaScript разобраны в главе Числа.

Число «bigint»

В JavaScript тип «number» не может содержать числа больше, чем 2 53 (или меньше, чем -2 53 для отрицательных). Это техническое ограничение вызвано их внутренним представлением. 2 53 – это достаточно большое число, состоящее из 16 цифр, поэтому чаще всего проблем не возникает. Но иногда нам нужны действительно гигантские числа, например в криптографии или при использовании метки времени («timestamp») с микросекундами.

Тип BigInt был добавлен в JavaScript, чтобы дать возможность работать с целыми числами произвольной длины.

Чтобы создать значение типа BigInt , необходимо добавить n в конец числового литерала:

// символ "n" в конце означает, что это BigInt const bigInt = 1234567890123456789012345678901234567890n;

Более подробно тип данных BigInt мы рассмотрим в отдельной главе BigInt.

Строка «string»

var str = "Мама мыла раму"; str = 'Одинарные кавычки тоже подойдут';

В JavaScript одинарные и двойные кавычки равноправны. Можно использовать или те или другие.

Тип символ не существует, есть только строка.

В некоторых языках программирования есть специальный тип данных для одного символа. Например, в языке С это char . В JavaScript есть только тип «строка» string . Что, надо сказать, вполне удобно.

Более подробно со строками мы познакомимся в главе Строки.

Булевый (логический) тип «boolean»

У него всего два значения: true (истина) и false (ложь).

Как правило, такой тип используется для хранения значения типа да/нет, например:

var checked = true; // поле формы помечено галочкой checked = false; // поле формы не содержит галочки

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

Специальное значение «null»

Значение null не относится ни к одному из типов выше, а образует свой отдельный тип, состоящий из единственного значения null :

var age = null;

В JavaScript null не является «ссылкой на несуществующий объект» или «нулевым указателем», как в некоторых других языках. Это просто специальное значение, которое имеет смысл «ничего» или «значение неизвестно».

В частности, код выше говорит о том, что возраст age неизвестен.

Специальное значение «undefined»

Значение undefined , как и null , образует свой собственный тип, состоящий из одного этого значения. Оно имеет смысл «значение не присвоено».

Если переменная объявлена, но в неё ничего не записано, то её значение как раз и есть undefined :

var x; alert( x ); // выведет "undefined"

Можно присвоить undefined и в явном виде, хотя это делается редко:

var x = 123; x = undefined; alert( x ); // "undefined"

В явном виде undefined обычно не присваивают, так как это противоречит его смыслу. Для записи в переменную «пустого» или «неизвестного» значения используется null .

Символы «symbol»

«Символ» представляет собой уникальный идентификатор.

Создаются новые символы с помощью функции Symbol() :

// Создаём новый символ - id let

При создании символу можно дать описание (также называемое имя), в основном использующееся для отладки кода:

// Создаём символ id с описанием (именем) "id" let

Символы гарантированно уникальны. Даже если мы создадим множество символов с одинаковым описанием, это всё равно будут разные символы. Описание – это просто метка, которая ни на что не влияет.

Например, вот два символа с одинаковым описанием – но они не равны:

let id1 = Symbol("id"); let id2 = Symbol("id"); alert(id1 == id2); // false

Более подробно c символами мы познакомимся в главе Тип данных Symbol.

Объекты «object»

Первые 7 типов называют «примитивными».

Особняком стоит восьмой тип: «объекты».

Он используется для коллекций данных и для объявления более сложных сущностей.

Объявляются объекты при помощи фигурных скобок <. >, например:

var user = < name: "Вася" >;

Мы подробно разберём способы объявления объектов и, вообще, работу с объектами, позже, в главе Объекты.

Оператор typeof

Оператор typeof возвращает тип аргумента.

У него есть два синтаксиса: со скобками и без:

  1. Синтаксис оператора: typeof x .
  2. Синтаксис функции: typeof(x) .

Работают они одинаково, но первый синтаксис короче.

Результатом typeof является строка, содержащая тип:

typeof undefined // "undefined" typeof 0 // "number" typeof 1n // "bigint" typeof true // "boolean" typeof "foo" // "string" typeof Symbol() // "symbol" typeof <> // "object" typeof null // "object" (1) typeof function()<> // "function" (2)

Последние две строки помечены, потому что typeof ведёт себя в них по-особому.

  1. Результат typeof null == «object» – это официально признанная ошибка в языке, которая сохраняется для совместимости. На самом деле null – это не объект, а отдельный тип данных.
  2. Функции мы пройдём чуть позже. Пока лишь заметим, что функции не являются отдельным базовым типом в JavaScript, а подвидом объектов. Но typeof выделяет функции отдельно, возвращая для них «function» . На практике это весьма удобно, так как позволяет легко определить функцию.

К работе с типами мы также вернёмся более подробно в будущем, после изучения основных структур данных.

Итого

Есть 5 «примитивных» типов: number , string , boolean , null , undefined и 6-й тип – объекты object .

Очень скоро мы изучим их во всех деталях.

Оператор typeof x позволяет выяснить, какой тип находится в x , возвращая его в виде строки.

C typeof что это

Есть еще один способ указать тип выражения — typeof. Его синтаксис похож на sizeof , однако семантически конструкция действует как имя типа, определенное с помощью typedef.

Существует 2 способа указать аргумент для typeof : с помощью выражения или с помощью имени типа. Вот пример с выражением:

typeof (x[0](1))

Здесь подразумевается, что x это массив указателей на функции; описываемый тип относится к типу возвращаемых значений функций.

Пример с использованием в качестве аргумента имени типа:

typeof (int *)

Здесь описывается тип указателей на int.

Если вы пишете заголовочный файл, который должен работать при подключении к программам ISO C, то вместо typeof пишите __typeof__ (см. описание альтернативных ключевых слов [2]).

Конструкт typeof может использоваться везде, где можно использовать typedef name. Например, typeof можно использовать в декларации, в приведении типа (cast), или внутри sizeof или typeof.

Операнд typeof оценивается на наличие побочных эффектов тогда и только тогда, когда он является выражением изменяемого типа или именем такого типа.

Использование typeof часто полезно вместе с операторными выражениями (statement expressions, см. [3]). Ниже показан пример, как безопасно определить макрос «максимума», который работает с любыми арифметическими типами, и оценивает каждый из своих аргументов ровно 1 раз:

#define max(a,b) \
 typeof (b) _b = (b); \
 _a > _b ? _a : _b; >) 

Причина появления здесь нижних подчеркиваний в именах локальных переменных — чтобы избежать конфликтов с именами переменных, которые появляются вы выражениях, которыми подменяются аргументы a и b. Когда-нибудь будет изобретена новая форма синтаксиса декларации, которая позволит вам объявлять переменные, область видимости которых начнется только после их инициализаторов; это будет более надежным способом предотвращения подобных конфликтов.

Вот еще примеры использования typeof:

• Объявление y с типом того, на что указывает x:

typeof (*x) y;

• Объявляет y как массив таких значений:

typeof (*x) y[4];

• Декларирует y как массив указателей на символы:

typeof (typeof (char *)[4]) y;

Это эквивалентно традиционному объявлению C:

char *y[4];

Чтобы лучше уяснить смысл объявления с помощью typeof, может быть полезно написать, переписать его с помощью вот таких макросов:

#define pointer(T) typeof(T *)
#define array(T, N) typeof(T [N]) 

Переписанное таким способом объявление:

array (pointer (char), 4) y;

Таким образом, array (pointer (char), 4) это тип массивов 4 указателей на char.

В GNU C, но не GNU C++, вы можете объявить также тип переменной как __auto_type. В этом случае объявление должно декларировать только одну переменную, декларатором которой должен быть просто идентификатор, объявление должно быть инициализировано, и тип переменной определяется инициализатором; имя переменной не находится в области видимости до инициализатора (на C++, для этой цели вы должны использовать C++11 auto). С помощью __auto_type показанный выше макрос максимума может быть написан вот так:

#define max(a,b) \
 typeof (b) _b = (b); \
 _a > _b ? _a : _b; >) 

Использование __auto_type вместо typeof дает 2 преимущества:

— Каждый аргумент макроса появляется только 1 раз при расширении макроса. Это не дает экспоненциально разрастаться размеру кода расширяемого макроса, когда вызовы этих макросов вложены а аргументы таких макросов.
— Если аргумент макроса имеет изменяемый тип, то при использовании __auto_type он вычисляется только один раз, но дважды при использовании typeof.

[Ссылки]

1. Referring to a Type with typeof site:gcc.gnu.org.
2. gcc: альтернативные ключевые слова.
3. gcc: операторы и объявления в выражениях.

C typeof что это

А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

От: TepMuHyc
Дата: 12.04.02 11:18
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.
А также есть аналогичный Java-вскому оператор каста dynamic_cast.

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

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?
Развивается. Правятся. Но до 2005 года (могу ошибаться) стандарт не изменится.
И так пока есть только один компилятор который его поддерживает в полной мере.

____________________
God obviously didn’t debug, hasn’t done any maintenance, and no documentation can be found. Truly amateur work.

От: TepMuHyc
Дата: 12.04.02 11:18
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.
А также есть аналогичный Java-вскому оператор каста dynamic_cast.

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

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?
Развивается. Правятся. Но до 2005 года (могу ошибаться) стандарт не изменится.
И так пока есть только один компилятор который его поддерживает в полной мере.

____________________
God obviously didn’t debug, hasn’t done any maintenance, and no documentation can be found. Truly amateur work.

От: Mish
Дата: 12.04.02 11:19
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

Если компилятор поддерживает RTTI, то можешь пользоваться оператором typeid.
А вообще-то можно обойтись и без информации о типах. Если у меня руки чешутся написать
if (typeid(myObject) == typeid(TObject)).
то значит я неправильно спроетировал иерархию классов.

От: Кирпа В.А.
Дата: 12.04.02 11:24
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

Это что например так

double val;
typeof(val) = «double» .

А в какую память компилятор будет помещать строку? Не понятно!

Re[2]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:28
Оценка:

Здравствуйте Кирпа В.А., Вы писали:

КВ>double val;
КВ>typeof(val) = «double» .

КВ>А в какую память компилятор будет помещать строку? Не понятно!
Зачем мне строка, название типа я могу и через typeid получить.

double val; typeof(val) val2 = val;

Re[2]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:29
Оценка:

Здравствуйте TepMuHyc, Вы писали:

TMH>Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.
TMH>А также есть аналогичный Java-вскому оператор каста dynamic_cast.

Мне не нужен typeid (typeid возвращает тип на уровне выполнения), мне нужен именно оператор typeof, которые на этапе компиляции возвращет тип выражения.
Часто бывает нужна для template-ов.

templateclass T> Saver < typeof(T::Get()) var; Saver(T &t) < var = t.Get(); >~Saver() < t.Put(var); >>;

Даже, когда я пишу такой код, я должен помнить какого типа была переменная var;

Type container; for (Type::iterator it = var.begin(); it != var.end(); ++it)

А хочется чего-нибудь такого:

Type container; for (typeof(container)::iterator it = var.begin(); it != var.end(); ++it)

Re[3]: typeof

От: Кирпа В.А.
Дата: 12.04.02 11:32
Оценка:

Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Кирпа В.А., Вы писали:

КВ>>double val;
КВ>>typeof(val) = «double» .

КВ>>А в какую память компилятор будет помещать строку? Не понятно!
DG>Зачем мне строка, название типа я могу и через typeid получить.

DG>Я хочу:
DG>

DG>double val; DG>typeof(val) val2 = val; DG>

Че то я не догнал что у тебя val2

Re[4]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:34
Оценка:

Здравствуйте Кирпа В.А., Вы писали:

DG>>Я хочу:
DG>>

DG>>double val; DG>>typeof(val) val2 = val; DG>>

КВ>Че то я не догнал что у тебя val2

Объявление переменной типа double

Re[3]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:40
Оценка:

Здравствуйте DarkGray, Вы писали:

Извиняюсь, должно быть конечно так:

Type container; for (Type::iterator it = container.begin(); it != container.end(); ++it) < >[ccode] А хочется чего-нибудь такого: [ccode] Type container; for (typeof(container)::iterator it = container.begin(); it != container.end(); ++it)

Re[3]: typeof

От: Vi2 http://www.adem.ru
Дата: 12.04.02 11:49
Оценка: -1

Здравствуйте DarkGray, Вы писали:

DG>Я хочу:

DG>double val; DG>typeof(val) val2 = val;

Для этого существует typedef.
Vita Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 11:59
Оценка:

Здравствуйте Vi2, Вы писали:

Vi2>Для этого существует typedef.
Для того чтобы сделать typedef я должен знать тип выражения, а в том то и дело что в общем случае я его не знаю.

std::ifstream ifs("i.txt"); typedef /*и какой type сюда вставлять */ TellgType; TellgType pos = ifs.tellg();

Re[5]: typeof

От: Vi2 http://www.adem.ru
Дата: 12.04.02 12:03
Оценка: -1

Здравствуйте DarkGray, Вы писали:

DG>Для того чтобы сделать typedef я должен знать тип выражения, а в том то и дело что в общем случае я его не знаю.

DG>std::ifstream ifs("i.txt"); DG>typedef /*и какой type сюда вставлять */ TellgType; DG>TellgType pos = ifs.tellg();

Так если ты его не знаешь, компилятор-то его откуда узнает. Мне кажется, это накручивание на пустом месте.
А мой ответ был обусловлен примером. Если

double val; typeof(val) val2 = val;
typedef double myvartype; . myvartype val; myvartype val2 = val;

Vita Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: typeof

От: Юнусов Булат
Дата: 12.04.02 12:11
Оценка:

Здравствуйте TepMuHyc, Вы писали:
TMH>И так пока есть только один компилятор который его поддерживает в полной мере.
А это какой?

Re[6]: typeof

От: DarkGray http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.04.02 12:12
Оценка:

Здравствуйте Vi2, Вы писали:

Vi2>Так если ты его не знаешь, компилятор-то его откуда узнает. Мне кажется, это накручивание на пустом месте.

Что значит не знает, а почему тогда sizeof работает?

std::ifstream ifs("i.txt"); std::cout sizeof (ifs.tellg()) "\n";

Re[7]: typeof

От: Vi2 http://www.adem.ru
Дата: 12.04.02 12:17
Оценка: -1

Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Vi2, Вы писали:

Vi2>>Так если ты его не знаешь, компилятор-то его откуда узнает. Мне кажется, это накручивание на пустом месте.

DG>Что значит не знает, а почему тогда sizeof работает?

DG>std::ifstream ifs("i.txt"); DG>std::cout sizeof (ifs.tellg()) "\n";

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

Vita Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: typeof

От: Павел Кузнецов
Дата: 12.04.02 13:50
Оценка:

DG>>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?
TMH>Из тех соображений что это не Java. В нем аналогичный (по духу) оператор назван typeid.

typeid — операция времени выполнения, typeof — времени компиляции.

TMH>И так пока есть только один компилятор который его поддерживает в полной мере.

На сегодняшний день не существует ни одного компилятора, поддерживающего стандарт в полной мере. Лучшие оцениваются процентов на 98%.

Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен

От: Павел Кузнецов
Дата: 12.04.02 14:05
Оценка: 18 (2)

DG>А из каких соображений в языке C++ нет оператора typeof (тоже что и sizeof, только возвращает не размер значения, а тип значения)?

Компилятор gcc поддерживает расширение __typeof. Вполне возможно, что typeof или аналогичная функциональность может войти в следующий стандарт C++.

DG>И вообще стандарт языка C++ сейчас развивается или только правятся в нем мелкие дефекты?

Скорее всего, в новом стандарте C++ изменения коснутся в основном стандартной библиотеки. Почитать об этом можно в интервью со Страуструпом.

Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: typeof

От: TepMuHyc
Дата: 12.04.02 15:52
Оценка:

Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Здравствуйте TepMuHyc, Вы писали:
TMH>>И так пока есть только один компилятор который его поддерживает в полной мере.
ЮБ>А это какой?
Так Comeau.

____________________
God obviously didn’t debug, hasn’t done any maintenance, and no documentation can be found. Truly amateur work.

Re[8]: typeof

От: Dr_Sh0ck
Дата: 13.04.02 04:09
Оценка:

Здравствуйте Vi2, Вы писали:

Vi2>И вообще, раз нет такой возможности typeof, то и не о чем говорить: ах, что бы было если б было.

Да и вообще, енплохо было бы почитать «Дизайн и эволюция языка С++». Там приводится много ответов на потенциальные «если бы».

Do not fake yourself 😉
ICQ#: 198114726
Re[4]: typeof

От: Anatolix https://www.linkedin.com/in/anatolix/
Дата: 17.04.02 09:45
Оценка:

Здравствуйте TepMuHyc, Вы писали:

TMH>Здравствуйте Юнусов Булат, Вы писали:

ЮБ>>Здравствуйте TepMuHyc, Вы писали:
TMH>>>И так пока есть только один компилятор который его поддерживает в полной мере.
ЮБ>>А это какой?
TMH>Так Comeau.

Твое мнение ошибочно, и похоже основано на заверении разработчиков
компилятора. Borland тоже называет свой компилятор Ansi совместимым
а пользы столько же. И Intel называет и KAI.

Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев

Re[5]: typeof

От: Юнусов Булат
Дата: 17.04.02 10:26
Оценка:

Здравствуйте Anatolix, Вы писали:

A>Твое мнение ошибочно, и похоже основано на заверении разработчиков
A>компилятора. Borland тоже называет свой компилятор Ansi совместимым
A>а пользы столько же. И Intel называет и KAI.

A>Посмотри вот здесь и все cтанет понятно:
A>http://www.boost.org/status/cs-win32.html
A>http://www.boost.org/status/cs-linux.html

Re[5]: typeof

От: Павел Кузнецов
Дата: 17.04.02 13:35
Оценка: 4 (1)

TMH>>>>И так пока есть только один компилятор который его поддерживает в полной мере.
ЮБ>>>А это какой?
TMH>>Так Comeau.

A>Твое мнение ошибочно, и похоже основано на заверении разработчиков компилятора.

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

A>Borland тоже называет свой компилятор Ansi совместимым а пользы столько же.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *