内部声明中的等号/赋值运算符

时间:2016-11-13 23:32:26

标签: c++ c

前几天我正在浏览github,并在C ++中找到了这段代码。

order[i]= order[i]+order[r]-(order[r]=order[i]);

为什么一行代码中有2个等号?我以前从未见过这个。

2 个答案:

答案 0 :(得分:1)

在C和C ++中,赋值operator只是一个像其他任何运算符一样的运算符。它返回赋值左侧的对象。

最后括号将order[i]复制到order[r],然后使用order[r]及其新值。

非常重要的评论:此表达式的结果尚未确定:在某些其他语言中它是not guaranteed that the operands of the operator are evaluated from left to right。如果第二个术语在第三个术语的赋值之前或之后使用order[r],则它依赖于编译器。所以有两种可能的结果。

答案 1 :(得分:1)

分配运算符= returns an LVALUE, meaning a value can be further assigned to it

此外,这通常是编码不好,因为它很可怕。作者最好在多行上进行单独的赋值,因为它更易于阅读,在实现时不易出错(作为可读性的扩展),优化器可能会在任何一种情况下生成类似的代码等。此外,这种类型代码经常导致SO上的常见重复问题:sequence points, and why this code is horrible.

修改And as others have pointed out, it invokes UB. Axe it.