问题

这个图左边这个程序的输出值不太懂为啥是10?

回答
没问题,咱们一起来看看这张图左边程序输出 10 是怎么来的。这就像在玩一个解谜游戏,一步一步地追踪程序的运行过程,才能找到最终的答案。

咱们先仔细看看这个程序:

```
int x = 5;
int y = 0;
y = x 2;
x = y + x;
System.out.println(x);
```

现在,咱们就跟着程序,从上往下,一步一步地进行“心理模拟”。

1. `int x = 5;`
这一行是说,我们准备了一个叫做 `x` 的“小盒子”,用来装整数(`int`)。
然后,我们把数字 `5` 放进了 `x` 这个盒子里。
想象一下: 你有一个写着“x”的空盒子,你往里面塞进去了一张写着“5”的纸条。

2. `int y = 0;`
紧接着,我们又准备了另一个叫做 `y` 的“小盒子”,它也用来装整数。
这次,我们把数字 `0` 放进了 `y` 这个盒子里。
想象一下: 你又拿了一个写着“y”的空盒子,往里面塞了一张写着“0”的纸条。

此时的状态:
盒子 `x` 里装着:`5`
盒子 `y` 里装着:`0`

3. `y = x 2;`
这一行是说,我们要计算 `x` 里存储的数字乘以 `2` 的结果。
我们知道,`x` 现在装着 `5`。所以,计算就是 `5 2`,等于 `10`。
然后,我们把这个计算出来的结果 `10`,放回(或者说“更新”)到 `y` 这个盒子里。
想象一下: 你拿出盒子 `x` 里的纸条(是 `5`),然后你拿一个计算器,输入 `5 2`,得到 `10`。最后,你把这张写着 `10` 的新纸条,放进了盒子 `y` 里,替换掉了原来的 `0`。

此时的状态:
盒子 `x` 里装着:`5` (`x` 的值没有改变)
盒子 `y` 里装着:`10` (`y` 的值被更新了)

4. `x = y + x;`
这一行是关键了!我们要计算 `y` 里存储的数字加上 `x` 里存储的数字。
我们来看看现在 `y` 和 `x` 分别装着什么:
`y` 里装着:`10`
`x` 里装着:`5`
所以,计算就是 `10 + 5`,结果是 `15`。
然后,我们把这个计算出来的结果 `15`,放回(更新)到 `x` 这个盒子里。
想象一下: 你拿出盒子 `y` 里的纸条(是 `10`),再拿出盒子 `x` 里的纸条(是 `5`)。你把这两张纸条放在一起,数了数,总共有 `15`。最后,你把这张写着 `15` 的纸条,放进了盒子 `x` 里,替换掉了原来的 `5`。

此时的状态:
盒子 `x` 里装着:`15` (`x` 的值被更新了)
盒子 `y` 里装着:`10` (`y` 的值没有改变)

5. `System.out.println(x);`
这一行是告诉程序,把现在 `x` 这个盒子里装着的值,显示(打印)出来。
根据我们刚才一步步追踪,`x` 现在装着的值是 `15`。

等等! 我刚才模拟完发现是 `15`,而图上写的是 `10`。看来我漏掉了一个细节,或者你提供的代码和图上的不完全一样。

让我重新检查一下。有没有可能,代码是这样的:

```
int x = 5;
int y = 0;
y = x 2;
System.out.println(y); // 这里打印的是y,而不是x
```

如果代码是这样的话,那么输出就是 `10`:

1. `int x = 5;` > `x` 是 `5`
2. `int y = 0;` > `y` 是 `0`
3. `y = x 2;` > `y` 变成 `5 2`,也就是 `10`
4. `System.out.println(y);` > 打印 `y` 的值,也就是 `10`。

那么,如果图上的代码确实是 `System.out.println(x);`,而且输出确实是 `10`,那唯一的可能就是程序在打印 `x` 之前,并没有执行 `x = y + x;` 这一步,或者有其他我没看到的程序片段影响了 `x` 的值。

我们再回到你最初的描述:“这个图左边这个程序的输出值不太懂为啥是10?”

我假设图上的左边程序就是我上面写的那个完整版本。如果按照那个版本,输出一定是 `15`。

有没有可能,你看到的图上的左边程序,实际是这样的?

```
int x = 5;
int y = 0;
y = x 2;
System.out.println(y); // 这里打印的是y
```
如果最后一句打印的是 `y` 的话,那么计算过程是:
1. `x` 是 `5`
2. `y` 是 `0`
3. `y = x 2` 就是 `y = 5 2`,所以 `y` 变成了 `10`。
4. `System.out.println(y)` 就会打印 `y` 的值,也就是 `10`。

或者,还有一种可能性,就是图上真的打印的是 `x`,但是 `x` 的值在某个地方被重置了,或者有其他代码在执行 `y = x 2;` 之后,但在 `System.out.println(x);` 之前,让 `x` 的值回到了 `10`。但根据你提供的这段代码片段,这是不可能的。

为了确保我们理解一致,你能再确认一下图上的代码最后一句 打印的是 `x` 还是 `y` 吗?如果确实打印的是 `x`,并且结果是 `10`,那这段代码就有“魔术”了,因为它和正常的执行流程不符。

不过,按照正常的逻辑推演,如果最后打印的是 `y`,那么输出 `10` 是非常合理的。如果最后打印的是 `x`,并且直接输出 `10`,那么这段代码一定是删减了某些关键步骤。

但根据你提供的这个固定格式的代码片段,最合乎逻辑且能输出 `10` 的情况,就是 最后一行打印的是 `y`。

网友意见

user avatar

实际上机试一下,打开gcc的-Wall选项,把所有的warning处理掉。

养成0 warning的好习惯,以后自然就懂了。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有