为什么在大多数编程语言中需要在语句之后加分号而不是在if
elseif
和else
之后?
编译器是否都在寻找换行符?如果这是真的那么为什么他们不会为所有陈述这样做呢?
我错过了什么吗?这对我来说真的没有意义......
通常分号是必需的,因为编译器会忽略大多数空格。在if,elseif等语句之后不需要它,因为它不是语句的结尾。这些只是完整的陈述,后面跟着一个陈述或一系列陈述。
因为这些语言的编译器不会将空格用于语句终止。一个声明必须终止一些如何以及用分号完成。只要你正确地终止语句,你就可以在一行上编写所有代码(虽然这将是一个可怕的,可怕的想法)。
有些编译器会忽略空格并使用分号来确定语句,例如变量赋值与if {}代码块。
其他语言,如python,使用空格来查找语句和if块。
它涉及语句和表达式之间的区别。像C这样的语言需要一个块来包含一系列语句。像if
和while
这样的控制流程结构都是它们自己的语句:
void foo() {
if (bar) {
/* ... */
}
while (baz) {
/* ... */
}
}
这里不需要分号,因为foo()
中的所有内容都是一个声明。问题是,如果你想在一个预期声明的地方使用bar()
这样的表达式怎么办? C语法说你可以通过在表达式后添加分号来实现这一点(换句话说,表达式后跟;
是一个语句)。
所以,这是无效的:
void foo() {
1 + 2
}
因为1 + 2
是一种表达方式。你需要把它变成一个声明:
void foo() {
1 + 2;
}
为了完全理解发生了什么,重要的是要注意一个块(像{ foo(); }
这样的curlies中的东西也是一个声明,而if
的语法是这样的:
if ( <condition> ) <statement> (else <statement>)?
这就是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);
如果换行是划界符,这将是不可能的。如果newline是运营商,那么If
s,while
s和for
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");
}
}
如果newline是运算符而不是分号,那么这个源代码会非常难看:
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
这些任务以逗号分隔,但请注意参数也以逗号分隔。我们必须区分逗号作为参数分隔符和逗号作为任务的分隔符,因为计算机不像人类那样聪明。总之,任务分隔符是一个比参数分隔符更大的逗号。这就是为什么语句的分隔符是分号,参数的分隔符是逗号。