《C 编程语言》第四版中的代码是否具有明确定义的行为?
尽管如此,相关代码仍表现出未指定的行为不调用未定义的行为。这是由于子表达式的求值顺序未指定,特别是对于 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 中,后缀表达式的求值顺序(如链式调用)得到了加强。函数参数中参数的初始化(包括副作用)现在相对于其他参数的顺序不确定。这确保了像相关代码这样的代码将具有明确指定的行为。
以上是第四版'C 编程语言”代码是否表现出明确定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!