ホームページ  >  記事  >  バックエンド開発  >  第 4 版「C プログラミング言語」のコードは明確に定義された動作を示しますか?

第 4 版「C プログラミング言語」のコードは明確に定義された動作を示しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-23 22:14:29183ブラウズ

Does Fourth Edition

「C プログラミング言語」第 4 版のコードには明確に定義された動作がありますか?

問題のコードは、未定義の動作を引き起こさないこと。これは、特に s.replace() の呼び出しに関して、部分式の評価順序が指定されていないことが原因です。

未指定の部分式評価の原則

関数引数の評価順序は不特定です。つまり、個々の関数の引数の評価順序を想定することはできません。この場合、s.find() の引数は s.replace() の前後で評価されることは保証されません。

評価順序の影響

評価順序、s.find() の結果は、s.replace() の副作用によって変更される可能性があります。これは、s.replace() が文字列の長さを変更し、後続の s.find() 呼び出しの結果に影響を与えるためです。

実際の評価の違い

提供されたテストでは、clang は s.replace(0, 4, "") より前に s.find("even") を評価しますが、gcc はそれらを逆の順序で評価する可能性があります。この順序の違いにより、連鎖関数呼び出しの結果が異なります。

C 17 の変更

C 17 では、後置式 (連鎖呼び出しなど) の評価順序が変更されます。強化されました。関数の引数内のパラメーター (副作用を含む) の初期化は、他のパラメーターに関して不定の順序で行われるようになりました。これにより、問題のコードのようなコードの動作が明確に指定されるようになります。

以上が第 4 版「C プログラミング言語」のコードは明確に定義された動作を示しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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