Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der Unterschied zwischen undefiniertem Verhalten und Fehlformalität in C?

Was ist der Unterschied zwischen undefiniertem Verhalten und Fehlformalität in C?

Susan Sarandon
Susan SarandonOriginal
2024-11-21 18:23:16551Durchsuche

What's the Difference Between Undefined Behavior and Ill-Formedness in C  ?

Undefiniertes Verhalten von Fehlform unterscheiden

Undefiniertes Verhalten (UB), Fehlform und umsetzungsdefiniertes Verhalten sind unterschiedliche Konzepte in C . Die Terminologie des Standards kann jedoch verwirrend sein, insbesondere mit der Formulierung „schlecht geformt; keine Diagnose erforderlich.“

Schlecht geformte Programme und Diagnostizierbarkeit

Ein krank- Das gebildete Programm verstößt gegen die syntaktischen oder semantischen Regeln der Sprache. Gemäß der Norm wird es „ansonsten nur als nicht wohlgeformt“ definiert. Logischerweise bedeutet dies, dass ein schlecht geformtes Programm nicht kompiliert werden sollte.

Der Standard lässt jedoch zu, dass Implementierungen Erweiterungen haben, die gemäß dem Standard falsch geformt sind, aber das Verhalten wohlgeformter Programme nicht ändern . In diesen Fällen muss die Implementierung die Verwendung der Erweiterung diagnostizieren, darf jedoch die Ausführung fortsetzen.

Undefiniertes Verhalten und Diagnostizierbarkeit

Undefiniertes Verhalten bezieht sich auf Programmverhalten, das dies nicht kann vom Standard vorhergesagt werden. Den Implementierungen steht es frei, das Verhalten auf beliebige Weise zu definieren, einschließlich durch Aussetzen der Ausführung oder stillschweigendes Ignorieren des Problems. Im Gegensatz zu „schlecht geformt“ bedeutet UB nicht unbedingt, dass das Programm nicht kompiliert werden sollte.

„Schlecht geformt; keine Diagnose erforderlich“

Der Begriff „schlecht geformt“. „Keine Diagnose erforderlich“ kann so interpretiert werden, dass es sich auf Situationen bezieht, in denen ein Programm gegen die Syntax- oder Semantikregeln verstößt, die Implementierung jedoch nicht zur Diagnose des Fehlers erforderlich ist. Dies würde es im Wesentlichen äquivalent zu UB machen, mit der Ausnahme, dass Implementierungen die Ausführung immer noch stillschweigend beenden oder fortsetzen können.

Der Grund für die Verwendung einer solchen Formulierung ist wahrscheinlich, dass Flexibilität bei der Implementierung ermöglicht wird. Es ermöglicht Implementierungen, Fehler zu behandeln, die andernfalls schlecht formuliert wären, und zwar auf eine Weise, die in der Praxis nützlich sein kann.

Schlussfolgerung

Obwohl der Wortlaut des C-Standards manchmal inkonsistent ist Die allgemeine Regel lautet, dass fehlerhafter oder falsch geformter Code eine Diagnose erfordert, es sei denn, der Standard gibt ausdrücklich etwas anderes an oder es handelt sich um undefiniertes Verhalten. Im Fall von „schlecht geformt; keine Diagnose erforderlich“ ist dies im Wesentlichen gleichbedeutend mit undefiniertem Verhalten, was den Implementierern einen gewissen Spielraum bei der Behandlung bestimmter Fehler gibt.

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen undefiniertem Verhalten und Fehlformalität in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn