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

为什么在“ for(…)”之后添加分号会如此显着地改变程序的含义?

胡沈义
2023-03-14
问题内容

我写了以下课程:

  public class TestOne {
     public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 100; i++) {
          count++;
        }
        System.out.println(count);
     }
   }

输出为100

然后我添加了分号:

    public class TestOne {
     public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 100; i++); {     // <-- Added semicolon
          count++;
        }
        System.out.println(count);
     }
   }

输出为1

结果令人难以置信。为什么添加的分号会如此显着地改变程序的含义?


问题答案:

这不是错误。分号成为for循环体中唯一的“语句” 。

编写另一种方法可以使其更容易看到:

for (int i = 0; i < 100; i++)
    ;

{
    count++;
}

由于分号,count++带有的块变成只有一条语句的裸块,该语句根本不与for循环关联。因此,此块及其count++内部仅执行 一次

这在语法上是有效的java。for (int i = 0; i < 100; i++);等效于:

for (int i = 0; i < 100; i++)
{ ; } // no statement in the body of the loop.

for由于循环增量语句或终止条件中的副作用,这种形式的循环可能很有用。例如,如果您想编写自己的代码indexOfSpace以在中找到空格字符的第一个索引String

int idx;

// for loop with no body, just incrementing idx:
for (idx = 0; string.charAt(idx) != ' '; idx++);

// now idx will point to the index of the ' '


 类似资料:
  • 问题内容: 我有以下MySql查询: 运行大约需要30秒,这很奇怪,因为如果我注释掉join或where子句,它会花费不到一秒钟的时间: 要么 每个过程不到一秒钟。 然后是STRAIGHT_JOIN关键字,在这里可以找到它的一个参考:http : //dev.mysql.com/doc/refman/5.0/en/join.html STRAIGHT_JOIN与JOIN相似,不同之处在于总是在右表

  • 我写了一个小基准来比较Python、Ruby、JavaScript和C的不同解释器/编译器的性能。正如预期的那样,结果表明(优化的)C打败了脚本语言,但是它的系数非常高。 结果是: 我想知道是否有人能解释为什么优化的C代码比其他代码快三个数量级以上。 C基准测试使用命令行参数以防止在编译时预计算结果。 下面,我放置了不同语言基准测试的源代码,它们应该在语义上是等价的。此外,我提供了优化的C编译器输

  • 对于我的Java类,要求我们在working For语句中添加分号,并解释为什么输出是这样的。我不明白为什么添加分号会产生错误的树类型错误,导致代码无法编译。代码下面是输出;我还向any标记添加了反斜杠,因为它不会以其他方式显示。那么,为什么for语句后面的分号会导致这样的错误呢?提前谢谢。 运行时间:

  • 这是我创建的一个简单程序,用于在java中练习多线程和同步。我想知道是否有人能向我解释一下,当从public void run()方法中删除同步块时,为什么输出不同? 带:带同步块 无:无同步块

  • 问题内容: 我正在阅读,发现在关闭正文之后,自己对“()”并不真正了解: 在: func(ch chan int){ch < -ACK } (replyChan) ` 在的示例中: 我不清楚关闭主体后添加和使用“()”的原因,希望有人可以清楚地解释一下。 问题答案: 这并不是说必须(仅)一个后添加 封 在。defer语句的语言规范要求其“ Expression” 始终 必须是函数调用。 为什么会这

  • 我可以从数据库中获取数据并将其存储在中。所有工作都很好,但是如果我从表中编辑数据并按enter键,数据就不会编辑。 值更改后不会在表中重写。 构造函数和getter/setter