我记得在Douglas Crockford的“Javascript the Good Parts”一书中读到,由于自动分号插入,无块语句可能会出错。
if (condition)
foo = true;
VS
if (condition)
{
foo = true;
}
在第二个示例中,它将一致地工作,在第一个示例中,解释器将自动插入分号,并且可能导致代码中的歧义。道格拉斯指出,这可能很糟糕,很难调试,我同意这一点。但它让我想到有哪些例子编码“风格”实际上有语法含义?换句话说,未遵循某种缩进或明显样式的示例实际上会导致错误或错误。我认为Python具有重要的空白是一个例子,YML要求没有标签是另一个。
随意回复各种语言和习语。我很想知道范式案例。在你的回答中,我想知道编码风格或语法行为的内容和原因。我不想开始任何编码风格的火焰战争,只是事实情况下,不知情的人会被绊倒。
答案 0 :(得分:7)
Javascript单独处理这两种情况。你必须使用第一个
return {
// code
}
return
{
// code
}
如果你不这样,口译员会在错误的地方添加半冒号。我认为它会在条件之后提出一个。所以第二个会错误地读作。
return;
{
// code
}
这不是无效的语法。
答案 1 :(得分:4)
编码风格不仅仅是为了便于阅读。还有一些其他因素,如
易维生素的一个例子如下:
if(x) return true;
VS
if(x)
{
return true;
}
很明显,第二个更容易维护,因为我可以简单地继续添加一个新行并添加对bla()的调用,而无需在之前添加括号。
答案 2 :(得分:4)
之前没有人提到过,但有一点是写作
if(NULL == p)// ...
而不是
if(p == NULL)// ...
这两者在功能上是等价的,所以这是一种风格问题。许多人更喜欢顶部的样式,因为如果你错误地输入“=”而不是“==”,第一个将不会编译,而第二个将编译,并创建一个很难找到的错误(尽管一些编译器现在给出你警告if(p = NULL))。
答案 3 :(得分:2)
在Python中,空格缩进而不是花括号或关键字分隔语句块。在某些陈述之后,缩进的增加;缩进的减少表示当前块的结束。
答案 4 :(得分:2)
除了分隔某些语言标记外,空格在任何C语言系列中都不重要。源代码的布局对编译器生成的可执行文件没有影响。
答案 5 :(得分:2)
在C ++中,
之间存在差异vector<pair<int,int>>
和
vector<pair<int,int> >
因为&gt;&gt;解析器将其视为单个标记。
答案 6 :(得分:2)
每当我打开括号,括号,单引号或双引号时,我总是关闭它,然后回去写下声明,条件等......这样可以避免一些可能出现的大错误!
答案 7 :(得分:1)
这取决于语言。在大家庭C / C ++ / Java / C#中,只要你的大括号被正确打开和关闭,空格就不是限制。
在像VB这样使用配对关键字的语言中,只是因为关键字划分了你不能拥有的功能
Private Sub someFunction() End Sub
但是在C,C ++和其他卷曲语言中,你可以拥有
void someFunction() { }
在python中,我猜它是一个完全不同的问题。
这一切都取决于特定的语言。根据您的具体示例,我不认为两者之间存在语法或语义差异。
答案 8 :(得分:1)
它依赖于语言。 例如在Java
中void someFunction() { }
和
void someFunction() {
}
和
void someFunction()
{
}
无任何暗示。但是,如果您感兴趣,Sun已经列出了一系列编码约定,您可以阅读它们here.
这些主要是为了代码的可维护性和可读性,但不必严格遵守。
答案 9 :(得分:1)
标题并非特定于条件块,因此我想到了这一点:
我还没有看到它被提及,但要考虑的一件事是你如何用简单的工具找到东西(比如grep及其来自windowsland的低级实现)。
例如,考虑这个(诚然有点人为)的例子
class Foo
// vs.
class
Foo
你可以用regex“class \ s + Foo”找到前者,但对于后者你必须有一个可以解析C ++ / C#/ java的专用工具。
这也适用于C函数原型,有些奇怪的人喜欢
void
bar (void)
// to
void bar(void)
虽然你通常可以假设如果在函数名前面是一些A-Z字符,那么它很可能是定义/声明。
实际上,当遇到ifblocks时,放置大括号对Visual Studio 200x中的调试代码有很大的影响。当它进入函数/块时,它会将文本/执行行光标放在开括号上。因此,如果右侧的括号恰好是waaaaay,则代码窗口必须滚动并且buggeritall停留在那里。非常讨厌。