Неуточняемое поведение

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

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

Терминология

Согласно стандарту языка C99,

  • 3.4.1. поведение, определяемое реализацией (англ. implementation-defined behavior) — неуточняемое поведение, где каждая реализация документирует выбор поведения;
  • 3.4.3. неуточняемое поведение (англ. unspecified behavior) — использование неуточняемого значения или иное поведение, где данный Международный стандарт предоставляет два или более варианта и не налагает никаких других требований на выбор в каждом конкретном случае.

ISO/IEC 9899:201x [1]

Согласно стандарту языка C++,

  • 1.3.5. поведение, определяемое реализацией (англ. implementation-defined behavior) — поведение правильно построенной программной конструкции с правильными данными которое зависит от реализации и которое должно быть документировано каждой реализацией;
  • 1.3.13. неуточняемое поведение (англ. unspecified behavior) — поведение правильно построенной программной конструкции с правильными данными которое зависит от реализации. Реализация не обязана документировать выбор поведения. [Примечание: как правило, диапазон допустимых поведений указан в данном Международном стандарте.]

ISO/IEC 14882:2003(E)

Примеры

В Си и C++ (в отличие от языка Java) порядок вычисления параметров функции является неуточняемым; следовательно, в программе, указанной ниже, порядок, в котором будут напечатаны строки «F» и «G», зависит от компилятора.

#include <iostream>
int f() {
  std::cout << "F" << std::endl;
  return 3;
}

int g() {
  std::cout << "G" << std::endl;
  return 4;
}

int h(int i, int j) {
  return i + j;
}

int main() {
  return h(f(), g()); 
}

Классическим примером поведения, определяемого реализацией (неуточняемого поведения, которое обязано быть документировано реализациями) является размер типов данных; например long в различных компиляторах и операционных системах может быть размером в 32 или 64 бит. Программа, которая предполагает, что в один long всегда поместится указатель, будет некорректно работать на некоторых платформах (например, в Windows x64)[2].

См. также

Примечания

  1. ISO/IEC 9899:201x Committee Draft — August 11, 2008 (англ.).
  2. size of long integer type on different architecture and OS (англ.). Intel Software Network. Проверено 1 декабря 2009.

Ссылки

en:Unspecified behavior

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....