【问题标题】:PHP, C++, etc. syntax explanationPHP、C++等语法解释
【发布时间】:2011-04-10 10:01:35
【问题描述】:

为什么在大多数编程语言中要求在语句之后放置分号,而不是在 if elseifelse 之类的内容之后?

编译器是否都在寻找换行符?如果这是真的,那么他们为什么不对所有陈述都这样做呢?

我错过了什么吗?这对我来说真的没有意义......

【问题讨论】:

  • 一个松散相关的问题:stackoverflow.com/questions/404735/… 这可能会有所帮助。
  • 条件句有括号作为终止符;在if (true) { echo "hi" } 中,结束括号的作用类似于分号,因为您要结束条件,因此无论如何都不能在这些括号内运行任何其他内容。在替代语法中,if (true): echo "hi"; endif; 没有括号,因此在最后一行之后仍然需要一个分号,以便它可以识别条件的结尾。
  • @animuson 把评论变成答案
  • 有些语言一直走到另一个极端:compsoc.dur.ac.uk/whitespace
  • 并非所有语言都这样做。我脑海中浮现出 python、haskell、lisp 和 ruby​​

标签: if-statement syntax programming-languages whitespace


【解决方案1】:

源代码是一组语句。我们必须使用分隔符来分隔语句。如果我们使用换行符作为分隔符,我们就无法构建我们的代码。很长的行只能通过滚动阅读。 (为了避免滚动,长行通常会被分割。)例如:

ParserUtils.RefreshProperty(m_cfg.PORTAL_ID, ParserUtils.CreateHashFromUrl(strDetailLinkUrl), Convert.ToInt32(m_cfg.Type), strPrice, strAddress, strStreet, strPostCode, strFeatures, strDescription, strImgFile, strBedrooms, strReception, strBath, strStatus, strLink, strPropType, strOutside, strTenure, strKeywords, strFullText, strContactInfo, m_ieBrowser.URL);

非常难看,我们将这一行分成几行以使其更具可读性:

    ParserUtils.RefreshProperty(m_cfg.PORTAL_ID,
    ParserUtils.CreateHashFromUrl(strDetailLinkUrl),
    Convert.ToInt32(m_cfg.Type), strPrice,
    strAddress, strStreet, strPostCode, strFeatures, strDescription, strImgFile,
    strBedrooms, strReception, strBath, strStatus, strLink, strPropType,
    strOutside, strTenure, strKeywords, strFullText, strContactInfo,
    m_ieBrowser.URL);

如果换行符是分隔符,这将是不可能的。如果换行符是运算符,Ifs、whiles 和 fors 将一团糟。考虑这段代码:

for (int i = 0; i < n; i++)
    {
        if (i % 2 == 0)
        {
            System.out.println("It can be divided by two");
        }
        {
            System.out.println("It can't be divided by two");
        }
    }

如果换行符是运算符而不是分号,那么这个源代码会很丑:

for (int i = 0
     i < 0
     i++) { if (i % 2 == 0) { System.out.println("It can be divided by two")
                          } { System.out.println("It can't be divided by two")
                          } }

此代码难以阅读,并且作为分隔符在逻辑上是有效的。例如,我的妻子将我的任务写在纸上(一种算法),如下所示:

Buy food(Bread, Meat, Butter),
Go and pay the taxes,
Call your mother, because she wants to talk to you

这些任务用逗号分隔,但请注意参数也用逗号分隔。我们必须区分逗号作为参数分隔符和逗号作为任务的分隔符,因为计算机不如人类聪明。总而言之,任务分隔符是一个比参数分隔符更大的逗号。所以语句的分隔符是分号,参数的分隔符是逗号。

【讨论】:

    【解决方案2】:

    它涉及语句和表达式之间的差异。像 C 这样的语言需要一个块来包含一系列语句。 ifwhile 等控制流结构都是独立的语句:

    void foo() {
        if (bar) {
            /* ... */
        }
        while (baz) {
            /* ... */
        }
    }
    

    这里不需要分号,因为foo() 中的所有内容都是一个语句。问题是,如果你想在需要声明的地方使用像 bar() 这样的表达式怎么办? C 语法说,您可以通过在表达式后添加分号来做到这一点(换句话说,表达式后跟 ; 是一个语句)。

    所以,这是无效的:

    void foo() {
        1 + 2
    }
    

    因为1 + 2 是一个表达式。你需要把它变成一个语句:

    void foo() {
        1 + 2;
    }
    

    要完全理解发生了什么,重要的是要注意一个块(像{ foo(); } 这样的花括号也是一个语句,if 的语法类似于:

    if ( <condition> ) <statement> (else <statement>)?
    

    这就是为什么if 语句可以包含用于主体或单个语句的块:块单个语句。

    【讨论】:

      【解决方案3】:

      为什么使用';'而不是 '\n' 来终止语句。

      很少有语言使用空格作为影响语言语义的东西(新行是空格)。这是因为它对开发人员来说非常容易出错(因为空白是所有强烈不可见的)。

      查看确实使用空格来影响语义的语言,您会看到对程序员的影响(通常会构建特殊工具来帮助对齐事物等)。许多秃头开发人员(男性和女性)如果因为插入空格而不是制表符而感到沮丧,他们会扯掉头发,这会导致循环提前退出。 :-)

      此外,通过不使用空格来改变语言的语义含义,您现在可以仅为该语言的人类读者使用空格,以尝试将代码格式化为易于阅读的形式(对于人类而言) (或者您可以滥用空白来隐藏含义)。

      为什么不是所有的语句都是空白

      只是您需要一种方法来检查语句的结尾。
      有些事情很明显语句的结尾在哪里,您不需要额外的分隔符来让解析器检测到语句的结尾。

      【讨论】:

        【解决方案4】:

        一些编译器会忽略空格并使用分号来确定语句,例如变量赋值与 if {} 代码块。

        其他语言,如 python,使用空格来查找语句和 if 块。

        【讨论】:

          【解决方案5】:

          通常需要分号,因为编译器会忽略大部分空格。在 if、elseif、else 等语句之后不需要它,因为它不是语句的结尾。只有在后面跟着一个语句或语句块时,它们才是完整的语句。

          【讨论】:

          • 从技术上讲,“语句块”就是“语句”。所以你可以简单地说“后跟声明”
          【解决方案6】:

          因为这些语言的编译器不考虑使用空格来终止语句。必须以某种方式终止语句,并且使用分号完成。只要您正确终止语句,您就可以在一行中编写所有代码(尽管这将是一个可怕的、可怕的想法)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-08
            • 1970-01-01
            • 2013-03-19
            • 1970-01-01
            • 2010-11-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多