为什么C允许在块周围留下括号?

时间:2015-09-14 18:03:40

标签: c syntax programming-languages

我们大多数人可能遇到过这样的错误,当你在'if'中添加另一个语句并注意到它打印时无论分支的条件如何,只是为了迟早发现挫折周围的'如果'条件不见了。

示例:

if (condition) {
    statement;
}

与:相比:

if (condition)
    statement;

请注意,我不希望讨论哪种编码标准更好,因为我们都对此有所了解,而且它非常依赖于上下文。相反,我会对编程语言的优势和这些优势感兴趣,为什么决定不严格执行。它是否使语法更简单?编译器实现?

将它保留为可选项而不是严格执行它有什么好处?标准对此有何看法?

7 个答案:

答案 0 :(得分:15)

C标准规定if (expression)必须后跟声明。它不要求语句是复合语句

在C"的精神中(参见C Rationale文件),其中一个短语是:

  

相信程序员。

另一方面,MISRA-C具有if的必需规则,并且循环该语句必须是复合语句。

只有当语句与if放在同一行时,某些编码样式才允许if的单个语句。例如:

if (condition) statement;

请注意,C和C ++不仅是{}if可选的语言。例如,在Java中它也是可选的,但在Perl中它是必需的。

答案 1 :(得分:13)

由于:

  • 会过度干预 - 程序员选择编码风格,而不是语言;

  • 它会进一步使语法复杂化;更简单,更健壮,只需说if (condition)后跟statement,让递归​​处理所有内容。

就我个人而言,我发现对这种结构的不信任对于任何含糊不清的程序员来说都是毫无根据的;我没有遇到过这个" bug"在那里我忘记了如何编写C ++只是因为我选择省略了一对括号。如果你碰到它,我建议你把它当作一种提示,以便更多地关注你正在做的事情,而不是用“诀窍”来掩盖它。和"风格指南"。

答案 2 :(得分:6)

有时,不必编写大括号就会使代码更具可读性:

if (x < 0) throw std::invalid_argument("meh");
if (a != b) return 0;
if (i == k) continue;

理论上,您可以设计一种编程语言来除了控制流语句之外需要括号,但这种安全性可能会被额外的语言复杂性所抵消。

答案 3 :(得分:4)

C / C ++也没有要求严格遵守K&amp; R风格。对于喜欢Allman风格的人来说,额外的支撑是完全没必要的:

if (condition)
    statement;

if (condition)
{
   statement;
   statement;
}

随着lambdas和braced初始化的引入,我们在代码中看到越来越多的括号,我认为Allman风格实际上更好地管理它。

答案 4 :(得分:4)

你稍微误解了它。支撑既不是可选的也不是强制性的。没有决定是允许它们还是强制执行它们。大括号if语句(或任何类似构造)的一部分。它们属于遵循该条件的陈述。简单语句不会有它们,但复合语句将(根据定义,复合语句是括在括号中的语句列表)。

这种情况以及编译器如何处理它直接来自这个语法定义(实际上,没有C特定的,我能想到的那个时代的大多数其他语言,Al​​gol,Pascal,等等,即使它们使用过关键字而不是大括号,做同样的事情)。基本上,任何没有特定结束关键字的语言(例如ifend ififfi)都必须以这种方式处理。

如果您在if或任何其他类似构造中的单个语句中包含大括号,则不要使用if允许的可选形式括号。你碰巧为它提供了一个复合语句(因此,括在括号中)只包含一个语句,这是完全合法的。但是对于编译器来说它是一样的,它不会处理它。

实际上,但这是一个品味问题,当然,许多程序员宁愿忽略它们,因为它可以减少混乱。

答案 5 :(得分:3)

范围只是复合语句。它可以放在任何地方:

void foo() {
  int a = 0;
  a = 1; // this is a simple statement.
  { // this is inside a scope. It is a compound statement. Note that I don't need an if.
    a = 2;
    a++;
  }
  return a;
}

能够在ifwhile或其他构造之后放置任何语句(复合或不复合)使语法更容易实现。

答案 6 :(得分:3)

C是在计算机具有40×25个字符图形的时候创建的。

如果你想要条件块/语句的缩进 你保存一个(在同一行上打开大括号)或两行(在下一行打开大括号):

if (condition)
    statement;

if (condition) {
    statement;
}

if (condition)
{
   statement;
}

所以保存一条线很重要。它允许在一个屏幕上显示更多源代码。