PEP8 与 C++
我是一个学生党,主要是学习 Python。后来开始学Java、C 和 C,然后遇到了一个问题:
因为我写 Python 代码的时候都遵守 PEP8 规则,然后就和 C 语法冲突了亿些
1、分号
Python 和这几种语言在语法上的差距比较大。
Python 的初衷是作为一个动态的脚本语言,语句末尾不用分号属于比较常见的情况。对于括号,Python 的语法成分不要求这个东西。
if <condition>:
...
带上括号也能成立的原因是 (True)
这个括号表达式的值是 True
本身,所以不影响程序的运行。
C++ 的 for
语句格式是这样的:
for (<init-statement> <condition>; <expression>)
<statement>
可以看出括号是必要的语法成分。
这里
<init-statement>
后面没有分号的原因是,;
是<init-statement>
的一部分。
这与语言设计者的理念有关,Python 的设计者认为这几种语句后面使用空格就能够区分各个语法成分,去掉多余的括号会更加简洁。
而 C++、Java、C# 等语言的语法受 C 语言的影响比较深,从 C 继承了一部分语法,就成了现在这个样子,它们也被称为类 C 语言。
有趣的是,C 的发明者设计新的语言 golang 时,也去掉了不少的括号。
写完上面的回复后,我意识到一些问题。
为什么 Python 和 Go 可以省略这些括号?
Python 的原因很简单,for
、if
和 while
的起始语句都以 :
结尾,所以能够区分起始语句和它们的语句块。
Go 我并不熟悉,查了一下语言规范,在 Go 中,大括号是强制使用的:
if <simple-stmt> expression {
...
}
所以 if
后的起始语句和语句块也能够区分开来。
C 和类 C 语言就不同了,它们的起始语句必须有括号,但语句块可以没有大括号。在 C++ 中,对于以下语句:
for (;;i++) 1;
去掉括号就难以分辨语法成分了。
所以实际上这是一个二选一的问题,总要有一个界定符存在的。