此表达式是否调用未定义的行为?

时间:2014-02-13 15:47:56

标签: c++ c undefined-behavior

这是从一个笑话开始的:

  采访者:C和C ++有什么区别?
   候选人:ONE

我的问题是表达式abs(C++ - C)abs(C - C++)是否会调用未定义的行为?

3 个答案:

答案 0 :(得分:4)

这取决于C的类型,但最好(用户定义的) type,其中++是一个函数),是否未指定 在评估之前或之后评估第二C C.operator++

当然,对于内置类型,表达式是未定义的 行为,对于用户定义的类型,最终结果将是 还取决于用户如何定义operator++,以及 编译器依赖的评估顺序。

答案 1 :(得分:3)

是的,这是未定义的行为。如果在语句中重用相同的变量,编译器将不会对何时发生增量做出任何承诺。

答案 2 :(得分:0)

是的,这是UB。从C99,第6.5节

  

表达式是指定的运算符和操作数序列   计算值

     

除非后面指定(对于函数调用(),&&,||,?:,和   逗号运算符),子表达式的评估顺序和   发生副作用的顺序都是未指明的

因此,当执行后增量时,快递C++ - C无法保证。