Неспецифіко́вана поведі́нка () або поведі́нка, що визнача́ється реаліза́цією () — поведінка комп'ютерної програми, яка може відрізнятися на різних платформах і компіляторах, оскільки специфікація мови програмування пропонує кілька допустимих варіантів реалізації якоїсь мовної конструкції. На відміну від невизначеної поведінки, програма з неспецифікованою поведінкою з точки зору відповідності специфікації мови не вважається помилковою; за неспецифікованої поведінки, специфікація зазвичай обмежує можливі варіанти поведінки, хоча й не зводить їх до єдиного припустимого.
Термінологія Відповідно до стандарту мови C99, 3.4.1. поведінка, визначена реалізацією () — неспецифікована поведінка, вибір якої документується окремо в кожній реалізації; 3.4.3. неспецифікована поведінка () — використання неспецифікованого значення або інша поведінка, де цей Міжнародний стандарт надає два або більше варіантів і не накладає жодних інших вимог на вибір у кожному конкретному випадку. Згідно зі стандартом мови C++,
1.3.5. поведінка, визначена реалізацією () — поведінка правильно побудованої програмної конструкції з правильними даними, що залежить від реалізації і яка має бути документована кожною реалізацією; 1.3.13. неспецифікована поведінка () — поведінка правильно побудованої програмної конструкції з правильними даними, що залежить від реалізації. Реалізація має документувати вибір поведінки. [Примітка: як правило, діапазон допустимих поведінок зазначено в цьому Міжнародному стандарті.]
Приклади У Сі і C++ (на відміну мови Java) порядок обчислення параметрів функції є неспецифікованим; отже, в програмі, наведеній нижче, порядок, у якому будуть надруковані рядки «F» та «G», залежить від компілятора.
#include <iostream> int f() { std::cout << "In f\n"; return 3; }
int g() { std::cout << "In g\n"; return 4; }
int sum(int i, int j) { return i + j; }
int main() { return sum(f(), g()); }
Класичним прикладом поведінки, що визначається реалізацією (неспецифікованої поведінки, яка має документуватися реалізацією), є розмір типів даних; наприклад long у різних компіляторах та операційних системах може мати розмір 32 або 64 біт. Програма, яка передбачає, що в один long завжди поміститься вказівник, некоректно працюватиме на деяких платформах (наприклад, у Windows x64).
Див. також Багатоплатформність
Примітки
Посилання RSDN FAQ: Яка між ними різниця (unspecified та undefined)? Мобільність на рівні вихідних текстів