Стандарт использует термин «неопределенное поведение», среди прочего, для описания общих ситуаций, когда подавляющее большинство реализаций будет вести себя одинаково предсказуемо, но где некоторые конкретные реализации могут лучше обслуживать своих клиентов, ведя себя по-разному.
Рассмотрим следующую функцию:
struct foo { unsigned char dat[256]; };
struct foo x,y;
void test(int a, int b)
{
struct foo temp;
temp.dat[a] = 1;
temp.dat[b] = 2;
x=temp;
y=temp;
}
Не думаю, что авторы Стандарта хотели требовать, чтобы программисты полностью инициализировали temp
перед его сохранением, но я также недумаю, что они хотели запретить реализациям просто записывать в x.dat[a]
, y.dat[a]
, x.dat[b]
и y.dat[b]
, оставляя при этом другие элементы этих структур держа то, что они держали ранее. Вместо того, чтобы пытаться точно определить, какие виды оптимизации должны быть разрешены, они просто предполагали, что реализации будут стремиться наилучшим образом удовлетворить потребности своих клиентов.