为什么许多语言在 `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>
同样的答案对 while
和 for
等其他句子有效。
许多编程语言需要在 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()
也是如此。
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>
同样的答案对 while
和 for
等其他句子有效。