Standard jest rodzajem „kontraktu” między tobą a twoim kompilatorem, który określa znaczenie twoich programów. Jako programiści często mamy pewien mentalny model działania języka, a ten model mentalny często jest niezgodny ze standardem. (Na przykład programiści C często myślą o wskaźniku jako z grubsza „liczbie całkowitej oznaczającej adres pamięci” i dlatego zakładają, że można bezpiecznie wykonywać dowolne operacje arytmetyczne / konwersje / manipulacje na wskaźnikach, które można wykonać za pomocą liczb całkowitych oznaczających pamięć adres. To założenie nie zgadza się ze standardem; w rzeczywistości nakłada bardzo surowe ograniczenia na to, co można zrobić ze wskaźnikami).
Jaka jest zatem korzyść z przestrzegania standardu, a nie własnego modelu mentalnego?
Mówiąc najprościej, chodzi o to, że standard jest poprawny, a twój własny model mentalny jest błędny. Twój model mentalny jest zwykle uproszczonym widokiem tego, jak rzeczy działają w twoim systemie, w typowych przypadkach, z wyłączonymi wszystkimi optymalizacjami kompilatora; dostawcy kompilatorów zazwyczaj nie starają się go dostosować, szczególnie jeśli chodzi o optymalizacje. (Jeśli nie wytrzymasz końca kontraktu, nie możesz oczekiwać od kompilatora żadnego konkretnego zachowania: wyrzucanie śmieci, wyrzucanie śmieci).
Ludzie wydają się nie lubić nieprzenośnych rozwiązań, nawet jeśli dla mnie działają.
Lepiej byłoby powiedzieć „nawet jeśli wydają się dla mnie pracować”. O ile twój kompilator nie udokumentuje, że dane zachowanie będzie działać (to znaczy: chyba że używasz wzbogaconego standardu, składającego się ze standardowej właściwej dokumentacji kompilatora plus), nie wiesz, że to naprawdę działa lub że jest naprawdę niezawodne. Na przykład, przepełnienie liczb całkowitych ze znakiem zwykle powoduje zawijanie na wielu systemach (tak INT_MAX+1
jest zazwyczaj INT_MIN
) - z tym wyjątkiem, że kompilatory „wiedzą”, że podpisana arytmetyka liczb całkowitych nigdy nie przepełnia się w (poprawnym) programie C, i często wykonują bardzo zaskakujące optymalizacje na podstawie tego „ wiedza, umiejętności".