我正在运行此c ++程序,以便在ubuntu中使用g ++编译器交换两个数字。
WebSocket ws = new WebSocket(address);
string database64 = "8wYBAAEBaf/7iac=";
string datastring = "......i....";
string datahex = "f306 0100 0101 69ff fb89 a7";
ws.OnOpen += (sender, e) =>
{
ws.Send(database64);
ws.Send(datastring);
ws.Send(datahex);
};
,我得到此输出int a = 6, b = 9;
a = a ^ b ^ (b = a);
cout << a << " " << b;
。这里先处理9 6
部分,然后再处理b
(b的旧值为9)。
但是当我运行该程序时
b=a
我得到a = a ^ b + (b = a);
cout << a << " " << b;
作为输出。这意味着这里先处理10 6
部分,因此每个b = a
的值现在为b
,因此它给出输出6
。
有人能解释为什么会这样吗?
答案 0 :(得分:4)
a = a ^ b ^ (b = a)
涉及不确定的行为,因为未指定评估顺序。如果只想交换两个整数,请使用std::swap
:
using std::swap;
int a = 6, b = 9;
swap(a, b);
答案 1 :(得分:3)
您的代码的行为是未定义! (b=a)
写入b
。在同一表达式b
中也有a^b^(b=a)
的读数,并且该表达式中也没有 sequencing 点。
该语言没有定义在未排序的步骤中读取和写入同一变量的行为。
为避免疑问,请注意,括号不是指定评估顺序,而是分组。
P.S。 XOR交换很愚蠢,并且可能比std::swap
慢。