前几天我正在浏览github,并在C ++中找到了这段代码。
order[i]= order[i]+order[r]-(order[r]=order[i]);
为什么一行代码中有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.