表格形式
f( g(), h() );
未定义g()
和h()
的评估顺序。它只指定一个必须在另一个之前发生。如果g()
和h()
都有程序执行所依赖的可见副作用,这是否是未定义的行为?
答案 0 :(得分:6)
“未定义的行为”具有非常具体的技术含义:它意味着对程序的功能实际上没有任何限制。它可能会使计算机着火或侮辱用户。这里,执行顺序是未指定 - 根据评估事物的顺序,有几种可能发生的选项。如果不了解有关编译器,优化器和执行环境的更多信息,您无法准确预测它将会是哪一个。
答案 1 :(得分:2)
不,不是。术语未定义的行为意味着程序中可能发生任何(包括崩溃)。这里的行为是不可预测的,这意味着一件事可能发生或另一件事,你不能依赖评估的顺序。
最大的区别在于,在您的情况下,理论上您可以通过测试每次调用后选择的订单并相应地采取行动,在程序中恢复正常。另一方面,一旦你遇到未定义的行为案例,你就会搞砸:它可以随时随地以任何方式咬你,直到程序结束。