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

一条线上的多个分配未按预期工作

宋臻
2023-03-14
问题内容

我想交换两个int秒- xy在此例,并做到在一个没有线的库函数。

所以我从这里开始:

int x = 4;
int y = 3;

System.out.println(x);
System.out.println(y);

x ^= y;

System.out.println(x);
System.out.println(y);

y ^= x;

System.out.println(x);
System.out.println(y);

x ^= y;

System.out.println(x);
System.out.println(y);

输出是4, 3, 7, 3, 7, 4, 3, 4预期的。到目前为止一切都很好。

接下来是:

int x = 4;
int y = 3;

System.out.println(x);
System.out.println(y);

y ^= (x ^= y);

System.out.println(x);
System.out.println(y);

x ^= y;

System.out.println(x);
System.out.println(y);

输出4, 3, 7, 4, 3, 4再次符合预期。到目前为止还不错。

然后最后这个:

int x = 4;
int y = 3;

System.out.println(x);
System.out.println(y);

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

System.out.println(x);
System.out.println(y);

在此阶段,输出变为4, 3, 0, 4。现在我知道这04 ^ 4由于x当时未完成分配而导致的-为什么会发生这种情况?为什么不x ^= y实际分配7x变量,以使其成为7 ^ 4最后一次分配?


问题答案:

让我们尝试扩展您的最后一个表达式。

评估为

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

需要注意的是表达式从评估

它成为了,

x = 4 ^ (y = 3 ^ (x = 4 ^ 3));

现在,问题已变得显而易见。对?

编辑:

为了消除混乱,让我尝试通过从左到右的评估来解释我的意思。

int i = 1;
s = i + (i = 2) + i;

现在,该表达式的计算结果为

s = 1 +    2    + 2;

请注意,赋值i左边1,但是赋值的 右边
(和赋值上)被评估为2,因为评估是从左到右,当涉及表达式的第二部分和第三部分时,is的值为2



 类似资料:
  • 所以我有一个打开活动的通知: 我制作的活动是一个简单的对话框样式的活动。当我从通知抽屉中打开活动时,在任何其他应用程序上,如facebook、whatsapp、chrome浏览器等,活动就会按预期打开。问题是当我试图关闭它,并回到以前的应用程序。 单击对话框中创建的“关闭”按钮时: 同样的事情发生了:活动结束了,但我要回到主屏幕,而不是上一个应用程序。为什么?? *注意:以前的应用程序仍然在后台工

  • 问题内容: 我试图选择一个名为的类中的第一个。如果它是其中的第一个元素,它会起作用,但是如果在它之后出现,它将不起作用。 我的印象是,无论它在哪里,我拥有的CSS都会选择第一个。我该如何运作? 问题答案: 该选择装置 当且仅当它是一个元素时,才选择其父项的第一个孩子。 所述容器的这里是,这样不能满足。 您的情况有CSS3 : 但是由于浏览器兼容性问题而已,那么最好还是给第一个类一个类,然后再定位该

  • 我试图重写并为页脚返回不同的视图类型,但在函数中进行整数比较失败: 此图像显示了一个调试会话,其中输入为21,私有列表的大小为21,但是当我按下“step over”时,会跳过条件代码。 如果两个整数相等,为什么返回false? 我在运行之前清理并重建了我的项目。 更新: 当整数被硬编码时,它可以工作: 这是完整的适配器:https://gist.github.com/fergusom/79C6D

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括: