ホームページ >バックエンド開発 >C++ >C における未定義の動作と不正な形式の違いは何ですか?

C における未定義の動作と不正な形式の違いは何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-21 18:23:16615ブラウズ

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

未定義の動作と不正な動作の区別

未定義の動作 (UB)、不正な動作、および実装定義の動作は、 C.ただし、この規格の用語は、特に「不正な形式; 診断は必要ありません」という表現で混乱を招く可能性があります。

不正な形式のプログラムと診断可能性

形成されたプログラムが言語の構文または意味規則に違反しています。標準によれば、それ以外の場合は「整形式ではないものとしてのみ定義される」という。論理的には、これは、不正な形式のプログラムはコンパイルすべきではないことを意味します。

ただし、標準では、標準に従って不正な形式であっても、適切な形式のプログラムの動作を変更しない拡張機能を実装に含めることが許可されています。 。このような場合、実装は拡張機能の使用を診断する必要がありますが、実行の継続は許可されます。

未定義の動作と診断可能性

未定義の動作とは、拡張機能の使用を診断できないプログラムの動作を指します。規格によって予測される。実装では、実行を一時停止したり、問題を黙って無視したりするなど、どのような方法でも動作を自由に定義できます。不正形式とは異なり、UB は必ずしもプログラムをコンパイルすべきではないことを意味するわけではありません。

「不正な形式; 診断は必要ありません」

「不正な形式」という用語; 診断は必要ありません」は、プログラムが構文または意味規則に違反している状況を指すと解釈できますが、実装では診断する必要はありません。 エラー。これは、実装がサイレントに終了したり、実行を継続したりできることを除いて、基本的に UB と同等になります。

このような文言を使用する理由は、実装の柔軟性を考慮するためと思われます。これにより、実装では、実際に役立つ可能性のある方法で不正な形式のエラーを処理できるようになります。

結論

ただし、C 標準の文言には一貫性がない場合があります。一般的なルールとして、標準で明示的に明記されていない限り、または未定義の動作でない限り、誤ったコードまたは不正な形式のコードには診断が必要です。 「不正な形式; 診断は必要ありません」の場合、それは本質的に未定義の動作と同義であり、実装者に特定のエラーの処理方法についてある程度の自由度を与えます。

以上がC における未定義の動作と不正な形式の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。