Стандарт является своего рода «контрактом» между вами и вашим компилятором, который определяет значение ваших программ. Как программисты, мы часто имеем определенную ментальную модель того, как работает язык, и эта ментальная модель часто расходится со стандартом. (Например, программисты на C часто думают об указателе как о «целом числе, обозначающем адрес памяти», и поэтому предполагают, что безопасно выполнять любые арифметические операции / преобразования / манипуляции с указателями, которые можно выполнить с целым числом, обозначающим память адрес. Это предположение не соответствует стандарту, оно налагает очень строгие ограничения на то, что вы можете делать с указателями.)
Итак, в чем преимущество следования стандарту, а не вашей собственной ментальной модели?
Проще говоря, это то, что стандарт верен, а ваша собственная ментальная модель неправильна. Ваша ментальная модель, как правило, представляет собой упрощенное представление о том, как все работает в вашей собственной системе, в общих случаях, когда все оптимизации компилятора отключены; Поставщики компиляторов, как правило, не прилагают усилий, чтобы соответствовать ему, особенно когда речь идет об оптимизации. (Если вы не задерживаете конец контракта, вы не можете ожидать какого-либо особого поведения от компилятора: мусор входит, мусор выходит.)
Людям, похоже, не нравятся непереносимые решения, даже если они работают на меня.
Может быть, лучше сказать, «даже если они, кажется, работают на меня». Если ваш компилятор специально не документирует, что данное поведение будет работать (то есть: если вы не используете обогащенный стандарт, состоящий из собственно стандарта плюс документация компилятора), вы не знаете, что он действительно работает или что он действительно надежен. Например, целочисленное переполнение со знаком обычно приводит к переносу во многих системах (так, INT_MAX+1
как правило , есть INT_MIN
), за исключением того, что компиляторы «знают», что целочисленная арифметика со знаком никогда не переполняется в (правильной) программе на C, и часто выполняют очень неожиданные оптимизации на основе этого » знание".