Jump to content

Неопределенное значение

В вычислительной технике (в частности, в программировании ) неопределенное значение — это состояние, при котором выражение не имеет правильного значения , хотя оно синтаксически правильное. Неопределенное значение не следует путать с пустой строкой , логическим значением «false» или другими «пустыми» (но определенными) значениями. В зависимости от обстоятельств вычисление неопределенного значения может привести к исключению или неопределенному поведению , но в некоторых языках программирования неопределенные значения могут возникать во время нормального, предсказуемого хода выполнения программы .

Динамически типизированные языки обычно обрабатывают неопределенные значения явно, если это возможно. Например, в Perl есть undef оператор [1] который может «присвоить» такое значение переменной. В других системах типов неопределенное значение может означать неизвестное, непредсказуемое значение или просто сбой программы при попытке его вычисления. Типы, допускающие значение NULL, предлагают промежуточный подход; см . ниже .

Умение обращаться

[ редактировать ]

Значение частичной функции не определено, если ее аргумент находится за пределами области определения . Сюда входят многочисленные арифметические случаи, такие как деление на ноль , квадратный корень или логарифм отрицательного числа и т. д. Другим распространенным примером является доступ к массиву с индексом, который выходит за пределы, как и значение в ассоциативном массиве для ключа, который он не содержит. На практике существуют различные способы разрешения подобных ситуаций:

Зарезервированное значение

[ редактировать ]

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

В то время как динамически типизированные языки часто гарантируют, что неинициализированные переменные по умолчанию принимают нулевое значение, статически типизированные значения часто этого не делают и отличают нулевые значения (которые четко определены) от неинициализированных значений (которые нет). [3]

Обработка исключений

[ редактировать ]

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

Разновидностью этого является обработка сигналов , которая выполняется на уровне операционной системы и не интегрирована в язык программирования. Обработчики сигналов могут попытаться выполнить некоторые формы восстановления, например завершить часть вычислений, но без такой гибкости, как полностью интегрированная обработка исключений.

Невозвратные функции

[ редактировать ]

Функция, которая никогда не возвращает результат, имеет неопределенное значение, поскольку это значение невозможно наблюдать. Таким функциям формально присваивается нижний тип , не имеющий значений. Примеры делятся на две категории:

Неопределенное поведение

[ редактировать ]

Все предыдущие методы обработки неопределенных значений требуют обнаружения неопределенности. То есть вызываемая функция определяет, что она не может вернуть нормальный результат, и предпринимает какие-то действия для уведомления вызывающей стороны. На другом конце спектра неопределенное поведение возлагает ответственность на вызывающую сторону, чтобы избежать вызова функции с аргументами за пределами ее домена. Нет предела тому, что может произойти. В лучшем случае легко обнаруживаемый сбой ; в худшем случае — тонкая ошибка в, казалось бы, несвязанном вычислении.

(Формальное определение «неопределённого поведения» включает в себя ещё более крайние возможности, в том числе такие вещи, как « остановиться и загореться » и «заставить демонов вылететь из носа». [4] )

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

Неопределенное значение в строгом смысле слова

[ редактировать ]

Строгое определение неопределенного значения — это на первый взгляд действительный (ненулевой) вывод, который бессмысленен, но не вызывает неопределенного поведения. Например, передача отрицательного числа в функцию быстрого обратного извлечения квадратного корня приведет к получению числа. Не очень полезное число, но вычисление завершится и что-то вернет .

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

Та же ситуация возникает в программном обеспечении, когда буфер данных имеется, но не полностью заполнен. Например, библиотека C strftime Функция преобразует метку времени в удобочитаемую форму в предоставленном выходном буфере. Если выходной буфер недостаточно велик для хранения результата, возвращается ошибка и содержимое буфера не определено.

В другом направлении, open системный вызов в POSIX принимает три аргумента: имя файла, некоторые флаги и режим файла. Файловый режим используется только в том случае, если флаги включают O_CREAT. Обычно используется форма с двумя аргументами. open, который предоставляет неопределенное значение для файлового режима, когда O_CREAT опущено.

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

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

Безопасная обработка неопределенных значений важна в оптимистичных системах управления параллелизмом , которые обнаруживают условия гонки постфактум. Например, чтение общей переменной, защищенной seqlock, приведет к появлению неопределенного значения, прежде чем будет определено, что произошло состояние гонки. Затем он отбросит неопределенные данные и повторит операцию. Это дает определенный результат до тех пор, пока операции, выполняемые с неопределенными значениями, не приводят к полноценному неопределенному поведению.

Другими примерами использования неопределенных значений являются генераторы случайных чисел и хеш-функции . Конкретные возвращаемые значения не определены, но имеют четко определенные свойства и могут использоваться без ошибок.

Обозначения

[ редактировать ]

В теории вычислимости неопределенность выражения обозначается expr ↑, а определенность — expr ↓.

См. также

[ редактировать ]
  1. ^ «недеф» . Документация Perl 5 . 25 сентября 2009 г. Проверено 26 марта 2010 г.
  2. ^ "определенный" . Документация Perl 5 . 25 сентября 2009 г. Проверено 26 марта 2010 г.
  3. ^ Перейти обратно: а б Карр, Ричард (1 октября 2006 г.). «Числовые типы данных C#, допускающие значение NULL» . Учебное пособие по основам C# . Проверено 27 марта 2010 г.
  4. ^ «Носовые демоны» . Файл жаргона . Проверено 12 июня 2014 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2be276bfe78db48e921a455d4b922465__1639065600
URL1:https://arc.ask3.ru/arc/aa/2b/65/2be276bfe78db48e921a455d4b922465.html
Заголовок, (Title) документа по адресу, URL1:
Undefined value - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)