「else if」は単一のキーワードですか?


100

C ++は初めてです。以下のような条件文がよく見られます。

if 
  statement_0;
else if
  statement_1;

質問:

構文的にはelse if、単一のキーワードとして扱うべきですか?それとも実際には以下のようにif外側の入れ子になったステートメントelseですか?

if 
  statement_0;
else 
  if
    statement_1;

5
第二のポイントへ。構文的には、ほとんど常に書かれていますelse if
TheNorthWes

8
いいえ、それでは文法がさらに複雑になります。単語はスペースのない単語です。他の言語にはやのようなキーワードがelseifありELIFます。実際、プログラミング言語Algol68のみ(?)が識別子にスペースを許可しています。いいね:PROC walk through tree ()
Joop Eggen 2014年

3
Fortran(少なくとも固定形式バージョン)とすべての標準化されたバージョンのAlgolでは、どこにでもスペースを使用できます。ある話によると、パンチカードのパンチャーは、コードを入力するときにスペースを追加する傾向があるようです。もう1つは、変数名にスペースを使用できるようにすることで、プログラマーはより適切な名前を使用できるようになり、問題は予測されませんでした。
プロファイラ2014年

1
elseifキーワードは、VBやPHPに存在します。
Salman A

3
Nitpick:C ++には正式にスペースを含むキーワードはありませんが、すべてのインテントや目的がそのように機能するような構成が含まれています。たとえばlong double、そのように書く必要があります。longdouble間違っています。
リスター氏2014年

回答:


133

C ++標準ドラフトセクションの「2.12 キーワードテーブル」4に両方ifelse個別にリストし、キーワードがない場合、これらは単一のキーワードではありませんelse if。私たちは、C ++のよりアクセスリストを見つけることができますキーワードをに行くことによってキーワードにcppreferencesセクション

セクションの文法6.4もこれを明確にします:

selection-statement:
 if ( condition ) statement
 if ( condition ) statement else statement

if中には、else ifある文で、次のelse用語を。このセクションでは、次のようにも述べています。

[...] selection-statementのサブステートメントifステートメントのelse形式の各サブ ステートメント)は、ブロックスコープ(3.3)を暗黙的に定義します。selection-statementのサブステートメントが単一のステートメントであり、compound-statementではない場合、それは、元のサブステートメントを含む複合ステートメントに書き直されたかのようになります。

次の例を示します。

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

では、少し拡張した例はどのように解析されますか?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

このように解析されます:

if 
{
  statement_0;
}
else
{ 
    if
    {
      statement_1;
    }
    else
    {
        if
        {
         statement_2 ;
        }
    }
}

注意

キーワード識別子であることをelse if理解することで、1つのキーワードにできないことも判断できます。また、数字の数字でクラス名を開始できますか?への私の回答で識別子の文法から確認できます。スペースはで許可されていないこと、識別子とそのため、一つのことができないキーワードが、2つの別々でなければならないキーワードelse if


1
標準なしでこれを推測できますか?ASMでは、jeqif| else if)、jneif| else if)、jmpelse)です。これに基づいて、それは単一のキーワードであると言いました。おそらく構文的にではなく、命令的に。
ブランドン

18
@ブランドン私は、使用されている文法とコンパイラ自体についての深い知識がなくても、アセンブリ言語から高水準の構造に確実に移行できるとは非常に疑っています。
Shafik Yaghmour 2014年

ただし、この定義は、パーサーで文法を定義するときに、すばらしい「ダングリングエルス」あいまいな構文ツリーの問題につながる可能性があることに注意してください...
LinearZoetrope

2
一部の言語はをサポートしていませんelse ifが、代わりにをサポートしていますelsif。これらの言語でelse ifは、は本当に1つのキーワードです。ただし、この回答が示すように、Cベースの言語は一般的にはそうしません。
sfdcfox 2014年

1
@クルミアは最後のelse声明を見たかったと思います。こちらもよろしくお願いします。
Matthias 14

78

構文的には、単一のキーワードではありません。キーワードに空白を含めることはできません。リストを書くときに論理的に、else if場合、それはおそらく良いでしょうあなたは、単一のキーワード、および書き込みとしてそれを参照してください。

if ( c1 ) {
    //  ...
} else if ( c2 ) {
    //  ...
} else if ( c3 ) {
    //  ...
} else if ( c4 ) {
    //  ...
} // ...

コンパイラーは文字通りこれを次のように見なします。

if ( c1 ) {
    //  ...
} else {
    if ( c2 ) {
        //  ...
    } else {
        if ( c3 ) {
            //  ...
        } else {
            if ( c4 ) {
                //  ...
            } // ...
        }
    }
}

しかし、両方の形式は同じものになり、最初の形式ははるかに読みやすくなります。


1
実際、コンパイラーは文字のelse後にが続くことを認識しませんでしたcompound-statement。の後else、それはstatementreturn;またはのようなものかもしれませんf())またはcompound-statement... を探します...
マスク

@TheMask:上記のShafik Yaghmourの回答によると、コンパイラーは文字通り単一のステートメントを認識しますが、複合ステートメントを認識したふりをします。
Ilmari Karonen 14年

この回答は、パーサーがトークンを抽出する方法を示しています。良い。
2014年

24

いいえそうではありません。
これらは2つのキーワードであり、さらに、2番目の「if」は、最初の「else」ステートメントによって決定されるスコープの「内部」のサブステートメントです。


2
これは何が起こっているのかをよく説明していますが、実際の言語定義にいくつかの参照を追加して、あなたが言っていることをよりよく証明することができます。
πάνταῥεῖ

2
@πάνταῥεῖ:あなたはリファレンスについて正しいですが、この作業はShafik Yaghmourによってまだうまく行われています。彼の答えは受け入れられたもので、私も投票しました。私の仕事はここで終わりました。
pablo1977

16

中括弧を使用してスコープを表示できます。

if(X) {
  statement_0;
}
else {
  if(Y) {
    statement_1;
  }  
}

そして、通常2つの異なるキーワードで実装されます。1つは、もう1つはelseです


したがって、複合ステートメントが受け入れられる場所では中括弧を使用する必要があると主張する人は、このような自明ではない条件文をすべて記述する必要があると思いますか?:)
dlf 2014年

5
愛する中かっこでさえ、何でもやり過ぎることがあると思います。これを家でしないでください。
トナカイ2014年

1
すべてのサブステートメントを中括弧で囲む必要があるすべてのブレース構造言語(私が知っている)は、単一のステートメントで構成されている場合でも、「else if」という意味の単一トークンキーワードを持っています。私はそれが語っていると思います。
zwol 2014年

@ザック:Swiftはあなたのルールを破る言語です。単一ステートメントのコードブロックでも中括弧が必要ですが、「else if」キーワードはありません。一方、文法はCとはかなり異なります。Anはif-statementオプションので終わりますelse-clauseelse-clauseであるのいずれか else code-blockまたはelse if-statementcode-block必須のブレースが含まれています。だから、elseキーワードだけを続けることができます{if
GraniteRobert 2014年

@GraniteRobert私自身、Swiftをほとんど見る時間はありませんでしたが、それは興味深いデータポイントです。そのような文法は可能性があると思っていましたが、実際にそれを見たことがありませんでした。そして、あなたもそれが人々に「else { if ... }」を書かせることを避けることに気付くでしょう。
zwol 2014年

10

すでに答えたように、そうではありません。2つのキーワードです。これは、互いに続く2つのステートメントの開始です。もう少し明確にするために、C ++言語でのステートメントifelseステートメントを扱うBNFグラマーを次に示します。

 statement:      
    labeled-statement
    attribute-specifier-seqopt expression-statement
    attribute-specifier-seqopt compound-statement    
    attribute-specifier-seqopt selection-statement  
    attribute-specifier-seqopt iteration-statement    
    attribute-specifier-seqopt jump-statement  
    declaration-statement
    attribute-specifier-seqopt try-block

   selection-statement: 
         if ( condition ) statement
     if ( condition ) statement else statement

それstatement自体が含まれていることに注意してくださいselection-statement。したがって、次のような組み合わせ:

if (cond1)
   stat
else if(cond2)
   stat
else
   stat

C ++標準/セマンティクスに従って可能であり、有効です。

注:C ++文法は、このページから引用しています。



-1

これらすべての説明に私の見解を付け加えたいと思います。ご覧のとおり、これらのキーワードを個別に使用できる場合は、2つのキーワードでなければなりません。たぶん、あなたはstackoverflowのこのリンクからc ++文法を見ることができます: 標準のC ++文法はありますか?

よろしく


-1

ifステートメントの後にオプションのelse if ... elseステートメントを続けることができます。これは、単一のif ... else ifステートメントを使用してさまざまな条件をテストするのに非常に役立ちます。

if、else if、elseステートメントを使用する場合、注意すべき点がほとんどありません。

ifはゼロまたは他のifを持つことができ、それはelse ifの後に来る必要があります。

ifは、ゼロから多くのelse ifを持つことができ、それらはelseの前に来る必要があります。

else ifが成功すると、彼がelse ifかelseかをテストすることはありません。

外観を持っている場合... else文のチュートリアル


2
これは規格に対応していないだけでなく、冗長です。この言語はelse if、まるでキーワードのようにシミュレートする表現力をすべて備えているため、明示的に定義しても意味がありません。
ルスラン2014年

1
これはプログラマにとって便利な簡略化です。しかし、問題はifステートメントの使用方法を尋ねることではありません。
ランチャー2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.