「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 サイトの他の関連記事を参照してください。