当前位置: 首页 > 面试题库 >

为什么该语句在Java中不起作用x ^ = y ^ = x ^ = y;

禹昆
2023-03-14
问题内容
int x=1;
int y=2;
x ^= y ^= x ^= y;

我期望值可以交换。但是它给出x = 0和y = 1。当我尝试使用C语言时,它会给出正确的结果。


问题答案:

您的陈述大致相当于这种扩展形式:

x = x ^ (y = y ^ (x = x ^ y));

与C语言不同,在Java中,保证二进制运算符的左操作数在右操作数之前进行求值。评估如下:

x = x ^ (y = y ^ (x = x ^ y))
x = 1 ^ (y = 2 ^ (x = 1 ^ 2))
x = 1 ^ (y = 2 ^ (x = 3))
x = 1 ^ (y = 2 ^ 3)             // x is set to 3 
x = 1 ^ (y = 1)
x = 1 ^ 1                       // y is set to 1
x = 0                           // x is set to 0

您可以反转每个xor表达式的参数顺序,以便在再次评估变量之前完成赋值

x = (y = (x = x ^ y) ^ y) ^ x
x = (y = (x = 1 ^ 2) ^ y) ^ x
x = (y = (x = 3) ^ y) ^ x 
x = (y = 3 ^ y) ^ x             // x is set to 3
x = (y = 3 ^ 2) ^ x
x = (y = 1) ^ x
x = 1 ^ x                       // y is set to 1
x = 1 ^ 3
x = 2                           // x is set to 2

这是一个更紧凑的版本,也可以使用:

x = (y ^= x ^= y) ^ x;

但这是交换两个变量的真正可怕的方法。使用临时变量是一个更好的主意。



 类似资料:
  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,

  • 这个问题与Java表达式中子表达式的求值顺序不同,因为在这里肯定不是“子表达式”。需要加载它进行比较,而不是“求值”。这个问题是特定于Java的,表达式来自一个真实的项目,而不是通常为棘手的面试问题而设计的牵强附会的不切实际的构造。它应该是比较和替换习语的一行替换 它比x86 CMPXCHG指令还要简单,因此在Java中应该使用更短的表达式。

  • 问题内容: Python文档明确指出了调用。但是似乎在许多情况下,情况恰恰相反。它何时何地发生的原因在哪里记录,如何确定我的对象或方法将被调用。 编辑:只是为了澄清,我知道在优选中调用,但是我不清楚为什么优先于调用,而后者是文档状态将发生的原因。 编辑:从马克·迪金森的答案和评论中,它看起来像是: 丰富的比较替代 是它自己的,以它的(以及类似的,等等) 如果左对象是内置类或新样式类,而右对象是其子

  • 问题内容: 我正在编写一个Java程序来计算将“我的唱歌的怪兽”中的怪兽达到一定水平所需要的食物。当我运行程序时,它说:“无法从double转换为int”。有人可以解释为什么吗?这是程序。 问题答案: 您必须这样做: 如您在文档中所看到的,它会按设计返回a ,但是如果需要,则必须执行显式强制转换。

  • 如果抛出的结果不是25头25尾(即24-26比),它应该擦除包含结果的列表的内容,并再次循环50抛出,直到结果正好是25-25。 打印空列表。 启动while-loop,只有在my_list.count(1)为25时才结束。 使用随机(1,2)掷硬币。 将结果输入my_list。 如果my_list.count(1)不完全是25,那么代码应该擦除列表的内容并重复while循环。 --编码:拉丁语-

  • 问题内容: 只需创建一个首选大小的简单按钮即可。该方法似乎不起作用。我要去哪里错了? 问题答案: 您的框架受布局管理器的控制,它正在决定如何最好地布局组件,并覆盖您使用所指定的值 现代GUI需要在各种不同的图形环境中运行(甚至在同一OS上),例如,包括不同的DPI,屏幕大小和字体设置。 布局管理器使您不必担心(减少)这些问题,强烈建议您使用它们 看一眼 使用布局管理器 布局管理器的可视指南 更多细