19

言語設計者は、次のシナリオで中括弧をオプションにすることを選択しました。

if (a)
    b
while (a)
    b
...

このように、関数で同じことが許可されないのはなぜですか?

int add(int a, int b)
    return a + b;
4

6 に答える 6

27

これだと文法がおかしくなるに違いない。たとえば、この空の関数定義に違いはありません...

void empty()
{
    ;
}

...そしてこの関数宣言:

void empty();
于 2012-10-23T16:00:25.877 に答える
6

彼らがこれを「選択」したかどうかはわかりません。むしろ、if、while、for などの中括弧を省略する能力は、文法を指定する方法の自然な結果として現れます。おそらく古いスタイルの関数宣言のため、文法は関数に対してそれを禁止しています。

于 2012-10-23T15:55:12.593 に答える
3

関数定義に関する決まったキーワードはありません。if/ else/ for/ while/にswitchは、論理制御構造の始まりを示すキーワードが 1 つあります。

コンテキストにより、人間int some_name (some_expression) some_other_expressions;は関数がどのように来るかを識別できますが、プログラミングの実践では (明確に実行できますが)、トークンストリームの 3-4-6 シンボルの先にあることを確認するには、関数宣言からこれを変更するものがないことを確認するために多くのバックトラックが必要です。別のものに。

プログラミング言語パーサーは、構文解析へのアプローチによって分類できます。トークン リスト内の現在のトークンを取得し、次のトークンが「これは if である」または「これは関数である」ことを確認するかどうかをチェックするか、最大限に調べるかのいずれかです。先のトークン (2-3-6?) を確認し、「これは関数である可能性がある」、「5 番目のトークンを確認したので、これは確かに関数である」ことを確認します。必要に応じてトークンリストに追加して、調査している構成が他のものではないことを確認します。

于 2012-10-23T15:58:12.300 に答える
2

推測すると、関数には通常複数のステートメントが含まれるのに対し、if または while ステートメントにはステートメントが 1 つしか含まれないことが多いためです。また、C++ で {} の省略を許可するとメンバー関数があいまいになるため、これは先見の明がありました。例えば:

struct s
{
     void f() const int i; //does const refer to int i or the function?
}
于 2012-10-23T15:53:53.177 に答える
1

中括弧は、「if」および「if-else」制御ステートメントのオプションのコンポーネントではありません。「if」制御ステートメントの文法的な生成により、1つの非終端記号が式の後に続くことができます。「if-else」制御ステートメントの文法的な生成により、1つの非終端記号が式の後に続き、1つの非終端記号が「else」終端記号の後に続くことができます。その非終端記号の名前は<statement>です。

制御構造(別名制御ステートメント)のコンテキストでは、中括弧は<compound-statement>(<block>と呼ばれることもあります)として知られる言語の非終端記号に属します。非終端記号<compound-statement>は、<statement>の文法生成の右側に表示されます。そのため、中括弧は「if」および「if-else」制御ステートメントで使用できます(つまり、複合ステートメントステートメントです)。

<statement> ::= <if-then-statement> | 
                <if-then-else-statement> | 
                <for-statement> |
                <do-while-statement> |
                ...
                <compound-statement>

<statement-list> ::=  <statement> | <statement-list> <statement> 

<if-then-statement> ::= "if" "(" <expression> ")" <statement> 

<if-then-else statement> ::= "if" "(" <expression> ")" <statement> 'else' <statement>

<compound-statement> ::= "{" <statement-list> "}"

関数宣言に関して、<compound-statement>非終端記号は、<function-declaration>文法生成の右側にある最後の非終端記号です。

PSすべての非終端記号は文法的な生成物です。すべての文法生成は、1つ以上の非終端記号および/または終端記号になります。終端記号は言語のキーワードです。

于 2013-02-19T20:28:20.227 に答える