【问题标题】:What does the semicolon actually do?分号实际上是做什么的?
【发布时间】:2020-11-27 19:16:58
【问题描述】:

我在看一个典型的 for 循环:

class ForDemo {
    public static void main(String[] args){
         for(int i=1; i<11; i++){
              System.out.println("Count is: " + i);
         }
    }
}

我对@9​​87654322@ 后面的分号很满意:这是一个声明新变量i 的语句。如果i++也是语句,为什么后面没有分号?

另一个例子。我打开 Jshell 并输入以下内容:

jshell> int a=1;
a ==> 1
jshell> a++
$2 ==> 1
jshell> a
a ==> 2
jshell> int b=1;
b ==> 1
jshell> b++;
$5 ==> 1
jshell> b
b ==> 2

换句话说,++ 命令的工作原理与是否有分号无关。我希望没有它就无法工作。

最后一个例子(改编自关于= 和== 之间区别的演示文稿):

jshell> boolean x = false;
x ==> false
jshell> if (x = true) System.out.println("Sorry! This is wrong ...");
Sorry! This is wrong ...
jshell> boolean x = false;
x ==> false
jshell> if (x = true;) System.out.println("Sorry! This is wrong ...");
|  Error:
|  ')' expected
|  if (x = true;) System.out.println("Sorry! This is wrong ...");
|              ^

我明白 = 和 == 之间的区别。我的问题是为什么它在上半年有效(if (x = true) 没有 ;),而不是 ;(if (x = true;))。

对这几个例子表示歉意,但我认为这个问题相对简单:如果存在表达式(没有;)作为命令语句(使用;)的情况,分号的功能是什么?

【问题讨论】:

  • " 如果 i++ 也是语句,为什么后面没有分号?" - i++ 是一个可以是语句的表达式,但在for循环声明中,它不是语句。我强烈建议你忽略 jshell 方面——基本上 jshell 可以有自己的规则;关注 Java 语言规则。
  • 分号什么都不做。它仅用于分隔表达式和语句。它只是语言语法的一部分。 JShell 对代码的解释与 Java 编译器略有不同,它并不总是需要分号。
  • 分号没有语义意义,它只是用在Java语句的末尾。这就像英语中的句号——我们把它写在句末,没有它,句子的意思是一样的,没有它,句子只是句法错误。

标签: java


【解决方案1】:

分号什么都没有,因为for循环被定义为(以及其他)

BasicFor 语句: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) 语句

根据https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html

根据定义,三个部分之间有两个分号。

【讨论】:

    【解决方案2】:

    分号是堆栈调用的分隔符。 if() 的内部需要 boolean,而不是堆栈调用。 只有在 {} 内是预期的语句。

    for() 的内部需要三个堆栈调用:一个定义循环变量,一个定义中断子句,一个定义每个循环之后发生的事情。

    示例: 构造 for(;;); 是一个有效的 java 构造。但是你永远不应该将它用作它唯一会做的事情就是永远循环:你没有定义变量、中断条件或在每次调用后执行的东西。在循环期间,您也什么都不做。

    【讨论】:

    • 我明白为什么 for(;;);已验证。我的问题是另一个:为什么不写 for(;;;) (即多加一个分号)
    • 因为“;”是语句的分隔符。如果你写了 for(;;;),你实际上会定义四个空语句,这不是 for 循环所期望的(3 个语句)。 (抱歉,如果太晚了,我不会经常查看收件箱。)
    猜你喜欢
    • 2011-03-11
    • 2010-11-26
    • 2015-06-23
    • 2017-12-26
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多