Der Standard ist eine Art "Vertrag" zwischen Ihnen und Ihrem Compiler, der die Bedeutung Ihrer Programme definiert. Als Programmierer haben wir oft ein bestimmtes mentales Modell, wie die Sprache funktioniert, und dieses mentale Modell steht oft im Widerspruch zum Standard. (C-Programmierer stellen sich einen Zeiger beispielsweise häufig grob als "eine Ganzzahl, die eine Speicheradresse angibt" vor und gehen daher davon aus, dass es sicher ist, Arithmetik / Konvertierungen / Manipulationen an Zeigern durchzuführen, die mit einer Ganzzahl ausgeführt werden, die einen Speicher angibt Diese Annahme stimmt nicht mit dem Standard überein, sondern schränkt die Möglichkeiten mit Zeigern sehr stark ein.)
Was ist also der Vorteil, dem Standard zu folgen, anstatt Ihrem eigenen mentalen Modell zu folgen?
Einfach ausgedrückt, der Standard ist korrekt und Ihr eigenes mentales Modell ist falsch. Ihr mentales Modell ist in der Regel eine vereinfachte Ansicht der Funktionsweise auf Ihrem eigenen System, wobei in den meisten Fällen alle Compiler-Optimierungen deaktiviert sind. Compiler-Hersteller bemühen sich im Allgemeinen nicht, sich daran anzupassen, insbesondere wenn es um Optimierungen geht. (Wenn Sie Ihr Vertragsende nicht aufhalten, können Sie vom Compiler kein bestimmtes Verhalten erwarten: Garbage-In, Garbage-Out.)
Die Leute scheinen nicht tragbare Lösungen nicht zu mögen, auch wenn sie für mich arbeiten.
Es könnte besser sein zu sagen, "auch wenn sie für mich zu arbeiten scheinen ". Wenn Ihr Compiler nicht ausdrücklich dokumentiert, dass ein bestimmtes Verhalten funktioniert (dh, wenn Sie keinen angereicherten Standard verwenden, der aus der richtigen Standard- und Compiler-Dokumentation besteht), wissen Sie nicht, dass es wirklich funktioniert oder dass es wirklich zuverlässig ist. Beispielsweise führt der Überlauf von Ganzzahlen mit Vorzeichen in der Regel auf vielen Systemen zu einem Zeilenumbruch ( INT_MAX+1
was normalerweise der Fall ist INT_MIN
) - außer dass Compiler "wissen", dass Arithmetik mit Ganzzahlen mit Vorzeichen in einem (korrekten) C-Programm niemals überläuft, und auf dieser Grundlage häufig sehr überraschende Optimierungen durchführen. " Wissen".