B
Code-Hacker schrieb:
1. Kannst du das noch etwas genauer erläutern? Ich glaube ich habe eine ganz falsche Vorstellung von undefiniertem Verhalten....
Es gibt 4 Abstufungen der Strenge, mit denen der Standard den Effekt einer bestimmten Konstruktion vorschreibt. Erstens ist das natürlich, dass das exakte Verhalten vorgeschrieben ist. Als nächstes haben wir "implementation defined". Der Effekt eines solchen Konstruktes steht nicht im Standard, sondern wird von jedem Implementor festgelegt und dokumentiert. Dazu gehören z.B. die Wertebereiche der einzelnen Typen. Das nächste ist "unspecified". Für ein solches Konstrukt existieren mehrere verschiedene sinnvolle Auslegungsweisen, die der Implementor nach Gutdünken auswählen kann und nicht dokumentieren muss. Dazu gehört z.B. die Reihenfolge, in der Funktionsargumente ausgewertet werden. Das letzt ist "undefiniert". Der Standard erlegt dem Implementor hier keinerlei Beschränkungen auf. Das hast du z.b., wenn du einen Nullpointer dereferenzierst: Unter MS-DOS wirst du schlicht und einfach den Inhalt der Speicherstelle 0 bekommen, Unix schickt dir ein SIGSEGV, Windows einen Bluescreen, der Z8 Microcontroller liest ein Zeichen vom seriellen Port oder so ... vom bösesten Absturz bis hin zu zufällig richtigen Ergebnissen ist alles möglich, aber theoretisch genauso gut, dass spontan Dämonen aus deiner Nase fliegen.