Стандарт - це свого роду "контракт" між вами та вашим компілятором, який визначає значення ваших програм. Як програмісти, ми часто маємо певну ментальну модель того, як працює мова, і ця ментальна модель часто суперечить стандарту. (Наприклад, програмісти C часто вважають покажчик приблизно "цілим числом, яке позначає адресу пам'яті", і тому припускають, що безпечно виконувати будь-які арифметичні / перетворення / маніпуляції на покажчиках, які можна виконувати з цілим числом, що позначає пам'ять Адреса. Це припущення не узгоджується зі стандартом; воно фактично накладає дуже жорсткі обмеження щодо того, що ви можете робити з покажчиками.)
Отже, яка перевага дотримуватися стандартної, а не власної ментальної моделі?
Простіше кажучи, це те, що стандарт правильний, а ваша власна ментальна модель неправильна. Ваша ментальна модель, як правило, є спрощеним уявленням про те, як все працює у вашій власній системі, у звичайних випадках, коли всі оптимізації компілятора вимкнено; Постачальники компіляторів, як правило, не докладають зусиль для його відповідності, особливо якщо мова йде про оптимізацію. (Якщо ви не дотримуєтесь свого закінчення договору, ви не можете очікувати конкретної поведінки від компілятора: сміття, сміття.)
Люди, здається, не люблять портативні рішення, навіть якщо вони працюють на мене.
Можливо, краще сказати, "навіть якщо вони, здається, працюють на мене". Якщо ваш компілятор спеціально не документує, що дана поведінка буде працювати (тобто якщо ви не використовуєте збагачений стандарт, що складається з належної стандартної плюс документації компілятора), ви не знаєте, що це дійсно працює або що це справді надійно. Наприклад, підписане ціле число переповнення, як правило, призводить до завершення роботи в багатьох системах (так, INT_MAX+1
як правило, INT_MIN
) - за винятком того, що компілятори "знають", що підписана ціла арифметика ніколи не переливається в (правильну) програму C, і часто проводять дуже дивні оптимізації на основі цього " знання ».