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

And*_*eas 9 c syntax programming-languages

我们大多数人可能遇到过这样的错误:当你在'if'中添加另一个语句并注意到它打印时不管分支的条件如何,只是为了及时发现挫折中的'if'条件周围的括号失踪.

例:

if (condition) {
    statement;
}
Run Code Online (Sandbox Code Playgroud)

相比:

if (condition)
    statement;
Run Code Online (Sandbox Code Playgroud)

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

保留它是可选的,而不是严格执行它的优点是什么?标准对此有何评价?

oua*_*uah 15

C标准说if (expression)必须跟着一个声明.它不要求语句是复合语句.

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

相信程序员.

另一方面,MISRA-C有一个必需的规则,if并且循环声明必须是复合语句.

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

if (condition) statement;
Run Code Online (Sandbox Code Playgroud)

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


Lig*_*ica 13

因为:

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

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

就个人而言,我发现对这种结构的不信任对任何模糊的程序员来说都是没有价值的; 我没有遇到过这个"bug",因为我选择省略一对括号,我忘记了如何编写C++.如果你碰到它,我建议你把它视为一个提示,要更多地关注你正在做的事情,而不是用"技巧"和"风格指南"掩盖它.

  • 其他一切都是平等的,任何时候我都必须在一个使得一个不可能的bug的方法与一个容易避免的方法之间做出选择.我将选择一个无论我或我的同事能力如何都无法实现的方法. (5认同)
  • @DavidBrown:但它没有_不会让一个错误变得"不可能".这是一个完全错误的安全措施.我无法理解为什么人们会想"哦,我知道,我只是确保我坚持_x_编码风格,这样我就不会犯错_y_." 现在他们假设他们总是记得坚持_x_编码风格,而且从不费心去寻找bug _y_!什么样的风格决定突然赋予作者无误?此外,我仍然宁愿这个场景,当由同事触发时,_did_导致一个错误,这样我们就可以解决那个人在审查/评估中的技巧而不是隐藏的问题. (5认同)

fre*_*low 6

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

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

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

  • 祝你在这个声明中设置一个断点. (3认同)