为什么在以下代码中会发生这种情况?

时间:2019-08-30 16:58:27

标签: c++ g++ bitwise-operators

我正在运行此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

有人能解释为什么会这样吗?

2 个答案:

答案 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慢。