0

只是想检查一下我的思维方式是否正确。这是一个示例方法:

1 public static boolean isCircle (int M, int m) {
2     boolean result = false;
3     if (M == m & M > 0 & m > 0) {
4         result = true;
5     }
6     return result;
7     }

如果我要绘制这种方法的程序图(每条线是一个节点,它们的路径是边),其中的变量不满足条件,例如 M = 1,m = 0。程序会从第 3 行 -> 行6,或从第 3 行 -> 第 5 行(条件结束)。我会认为第 3 行到第 6 行,但我不确定。

4

2 回答 2

0

这取决于。IDE 中的大多数调试器都将执行标记放在将要执行的行的开头。在执行了第 3 行中计算为 的条件后false,下一个要执行的有意义的行是第 6 行。

但是,请考虑以下代码:

1 public static boolean isCircle (int M, int m) {
2     boolean result = false;
3     if (M == m & M > 0 & m > 0) {
4         result = true;
5     } else printf("false!");
6     return result;
7 }

如果执行跳到 6,这意味着printf是作为条件的一部分执行的,这对于调试来说是令人沮丧的。

您可以在任何 IDE 中使用调试器验证此行为。您可能会发现一个或两个 IDE 将执行置于下一条语句的开头(第 6 行),但如果除 5 行之外还有其他内容要执行},我希望它会暂停执行在跳过那条线之前。

任何值得一提的调试器都会忽略没有任何意义的行(空格、注释、打开/关闭括号),但会在每个有意义的行的开头暂停,以便您可以评估变量、设置新断点等。

于 2017-05-30T14:45:51.830 回答
0

它将跳转到 6,因为这是下一条指令。

关闭}实际上并不是程序的一部分,而是关闭了一个块,因此它自己不会做任何事情。

请参阅这篇文章以获取可能清楚的字节码。 http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html#if_else

如您所见,右括号没有被翻译,所以它不存在。它表示块结束,但不是执行的一部分。

于 2017-05-30T13:51:50.747 回答