If statement PHP,C++;,等等。语法解释

If statement PHP,C++;,等等。语法解释,if-statement,syntax,programming-languages,whitespace,If Statement,Syntax,Programming Languages,Whitespace,为什么在大多数编程语言中,需要在语句后面加分号,而不是在诸如if s, < >和对于< /Calp>S,如果新行是操作符,将是完全混乱的。请考虑此代码: for (int i = 0; i < n; i++) { if (i % 2 == 0) { System.out.println("It can be divided by two"); } { System.ou

为什么在大多数编程语言中,需要在语句后面加分号,而不是在诸如
if
else
之类的东西后面

编译器都注意换行吗?如果这是真的,那么他们为什么不为所有的陈述这样做呢


我错过什么了吗?这对我来说确实没有意义…

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

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

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

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

为什么使用“;”而不是“\n”终止语句。 很少有语言使用空格来影响语言的语义(新行是空格)。这是因为对于开发人员来说,它非常容易出错(因为空白对于所有用户来说都是不可见的)

看看那些确实使用空格来影响语义的语言,你会看到它对程序员的影响(通常会构建一些特殊的工具来帮助对齐东西等等)。很多秃顶的开发者(男性和女性)在遇到挫折时都会拔掉头发,因为他们插入了空格而不是标签,这导致循环提前退出。:-)

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

为什么不是所有的语句都是空白 只是你需要一种检查语句结尾的方法。

有些事情很明显,语句的结尾在哪里,您不需要额外的分隔符来允许解析器检测语句的结尾。

它与语句和表达式之间的差异有关。像C这样的语言需要一个块来包含一系列语句。控制流结构,如
if
while
都是独立的语句:

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()(else)?

这就是为什么
if
语句可以有用于正文或单个语句的块:块是单个语句。

源代码是一组语句。我们必须使用定界符对语句进行定界。如果我们使用换行符作为定界符,我们无法构造代码。只有滚动才能读取很长的行。(为了避免滚动,通常会拆分长行。)例如:

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);
如果新行是分隔符,这是不可能的。<代码>如果< /代码> s,<代码> < <代码> >和<代码>对于< /Calp>S,如果新行是操作符,将是完全混乱的。请考虑此代码:

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");
        }
    }

这些任务用逗号分隔,但请注意参数也用逗号分隔。我们必须区分逗号作为参数分隔符和逗号作为任务定界符,因为计算机不如人类智能。总之,任务分隔符比段落分隔符大米。这就是为什么语句的定界符是分号,参数的定界符是逗号。

一个松散相关的问题:这可能会有帮助。条件句用括号作为终止符;在
if(true){echo“hi”}
,结束括号的作用类似于分号,因为您正在结束条件,因此在这些括号内无法运行任何其他内容。在另一种语法中,
if(true):回显“hi”;endif;
您没有括号,所以最后一行后面还需要一个分号,以便它可以识别条件语句的结尾。@animuson将注释转换为答案有一些语言会走到另一个极端:并非所有语言都会这样做。在我的脑海中,我可以想到python、haskell、lisp和Rubytechnical“语句块”是一个“语句”。因此您可以简单地说“后跟一个语句”
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