当程序执行取决于执行顺序时,它是未定义的行为吗?
Is it undefined behaviour when program execution depends on execution order?
在
形式的表达式中
f( g(), h() );
未定义 g()
和 h()
的计算顺序。它只是指定一个必须先于另一个发生。如果 g()
和 h()
都具有程序执行所依赖的可见副作用,这是未定义的行为吗?
不,不是。术语未定义的行为 意味着任何事情 都可能在程序中发生(包括崩溃)。这里的行为是不可预测的,这意味着一件事可能会发生,你不能依赖评估的顺序。
最大的区别在于,在您的情况下,从理论上讲,您可以通过测试每次调用后选择的顺序并相应地采取行动,使您的程序回到正轨。另一方面,一旦遇到 未定义行为 情况,你就完蛋了:它可以随时随地以任何方式咬你,直到程序结束。
"Undefined behavior" 具有非常具体的技术含义:它意味着对程序可以做什么实际上没有任何限制。它可能会使计算机着火或侮辱用户。在这里,执行顺序是 未指定 - 根据评估的顺序,可能发生的事情有几个选项。如果不了解更多有关编译器、优化器和执行环境的信息,您就无法准确预测它将成为哪一个。
在
形式的表达式中f( g(), h() );
未定义 g()
和 h()
的计算顺序。它只是指定一个必须先于另一个发生。如果 g()
和 h()
都具有程序执行所依赖的可见副作用,这是未定义的行为吗?
不,不是。术语未定义的行为 意味着任何事情 都可能在程序中发生(包括崩溃)。这里的行为是不可预测的,这意味着一件事可能会发生,你不能依赖评估的顺序。
最大的区别在于,在您的情况下,从理论上讲,您可以通过测试每次调用后选择的顺序并相应地采取行动,使您的程序回到正轨。另一方面,一旦遇到 未定义行为 情况,你就完蛋了:它可以随时随地以任何方式咬你,直到程序结束。
"Undefined behavior" 具有非常具体的技术含义:它意味着对程序可以做什么实际上没有任何限制。它可能会使计算机着火或侮辱用户。在这里,执行顺序是 未指定 - 根据评估的顺序,可能发生的事情有几个选项。如果不了解更多有关编译器、优化器和执行环境的信息,您就无法准确预测它将成为哪一个。