这是从一个笑话开始的:
采访者:C和C ++有什么区别?
候选人:ONE
我的问题是表达式abs(C++ - C)
和abs(C - C++)
是否会调用未定义的行为?
答案 0 :(得分:4)
这取决于C
的类型,但最好(用户定义的)
type,其中++
是一个函数),是否未指定
在评估之前或之后评估第二C
C.operator++
。
当然,对于内置类型,表达式是未定义的
行为,对于用户定义的类型,最终结果将是
还取决于用户如何定义operator++
,以及
编译器依赖的评估顺序。
答案 1 :(得分:3)
是的,这是未定义的行为。如果在语句中重用相同的变量,编译器将不会对何时发生增量做出任何承诺。
答案 2 :(得分:0)
是的,这是UB。从C99,第6.5节
表达式是指定的运算符和操作数序列 计算值
除非后面指定(对于函数调用(),&&,||,?:,和 逗号运算符),子表达式的评估顺序和 发生副作用的顺序都是未指明的
因此,当执行后增量时,快递C++ - C
无法保证。