为什么许多语言在 `if` 条件两边使用括号

Why do many languages use parentheses around `if` condition

许多编程语言需要在 if 条件两边加上括号。

例如:

if (x < 50)
{
}

为什么不能这样写,没有括号:

if x < 50
{
}

假设语言设计者是务实的人,为什么需要括号?

简单回答:运算符优先级。记住基本的 highschool/elementary 数学:7 * 4 + 3 的答案是什么? 31?还是 49?

大括号允许您强加自己的优先级,以覆盖语言的自然优先级:

(7 * 4) + 3 -> 31 (the natural answer by BEDMAS rules)
7 * (4 + 3) -> 49

如果你说的是 {},那就是允许表达式的多行块。

没有大括号:

if (...)
   a = 1;  // only this line is part of the "if"
   b = 1;  // ignore the indentation - this is always executed

v.s.

if (...) {
   a = 1;  // part of the "if"
   b = 1;  // also part of the "if"
}

在 C 中,if 实际上是一个逗号运算符,而不仅仅是一个表达式。可以这样写:

int i = 0;
if (i = i + 1, i/2 > 0) {
}

所以这里需要大括号(实际上是括号)。例如while()也是如此。

然而,C 中的

return 运算符只接受一个表达式,因此它不需要括号:

return i + 1;

尽管许多程序员仍然这样写:

return (i + 1);

真正的简短答案是 "Because their syntax/grammar language definition",它与表达式中的括号无关。

在语言的定义中,创建者定义了一组开发者必须遵循的规则。

在 C、C++、Objective C、java、javascript 和其他基于 C 的语言中,括号在它们的语法中用于定义如何将条件表达式与执行的句子,但这只是为了定义,因为它不是必需的。 Dennis Ritchie(C 创建者)本可以使用另一种方法将条件表达式与 true/false 语句分开,但他选择了括号。

# Grammar of "if sentence" in C (in BNF)
<if-statement> ::= if ( <expression> ) <statement>
                 | if ( <expression> ) <statement> else <statement>

像 Modula2、Pascal、ADA、Delphi、Oracle PL/SQL 和其他基于 Modula2 的语言不使用括号定义它们的语法,但它们使用关键字 then 来将条件表达式与语句分开:

# Grammar of "if sentence" in Pascal (in BNF)
<if-statement> ::= if <expression> then <statement> 
                 | if <expression> then <statement> else <statement>

同样的答案对 whilefor 等其他句子有效。

参见完整的 C 语法 here, and Pascal grammar here 以供参考。