"Else if" tek bir anahtar kelime mi?


100

C ++ 'da yeniyim. Sık sık aşağıdaki gibi koşullu ifadeler görüyorum:

if 
  statement_0;
else if
  statement_1;

Soru:

Sözdizimselelse if olarak tek bir anahtar kelime muamelesi yapmalıyım ? Yoksa aslında aşağıdaki gibi ifdışta iç içe geçmiş bir ifade elsemi?

if 
  statement_0;
else 
  if
    statement_1;

5
İkinci noktanıza. Sözdizimsel olarak neredeyse her zaman yazılırelse if
TheNorthWes

8
Hayır, bu grameri daha da karmaşık hale getireceği için: kelime boşluksuz bir kelimedir. Diğer dillerde elseifve gibi anahtar kelimeler olsa da ELIF. Aslında sadece (?) Algol68 programlama dili bir tanımlayıcıda boşluğa izin verir; çok güzel:PROC walk through tree ()
Joop Eggen

3
Fortran (en azından sabit form versiyonları) ve Algol'un tüm standartlaştırılmış versiyonları her yerde boşluklara izin verir. Bir hikayeye göre, delikli kart deliciler, kod yazarken boşluk eklemeye meyilliydi; başka bir basitçe, değişken adlarında boşluk bırakmanın programcıların daha iyi isimler kullanmasına izin vereceği ve sorunların önceden görülmediği.
prosfilaes

1
elseifAnahtar kelime VB ve PHP bulunmaktadır.
Salman A

3
Nitpick: C ++ resmi olarak içinde boşluklar olan anahtar kelimelere sahip olmasa da, tüm amaç ve amaçlar için bu şekilde çalışan gibi yapılara sahiptir. Mesela long doublebunu böyle yazmalısın. longdoubleyanlış.
Bay Lister

Yanıtlar:


133

Biz gidersek Tek bir kelime değildir taslak C ++ standart bölüm 2.12 Anahtar kelimeler masa 4listeleri hem ifve elseayrı ayrı ve hiçbir orada else ifanahtar kelime. Anahtar kelimelerle ilgili cppreferences bölümüne giderek daha erişilebilir bir C ++ anahtar kelime listesi bulabiliriz .

Bölümdeki dilbilgisi 6.4de bunu netleştirir:

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

ifİçinde else ifbir olduğunu deyimi aşağıdaki elseterim. Bölüm ayrıca şunları söylüyor:

[...] Bir seçim ifadesindeki ikame (her alt ifade , if ifadesinin else biçiminde ) örtük olarak bir blok kapsamını (3.3) tanımlar. Bir seçim ifadesindeki alt ifade tek bir ifadeyse ve bileşik bir ifade değilse, orijinal alt ifadeyi içeren bir bileşik ifade olacak şekilde yeniden yazılmış gibidir.

ve aşağıdaki örneği sağlar:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

Öyleyse, biraz genişletilmiş örneğiniz nasıl çözümlenir?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

şu şekilde ayrıştırılacak:

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

Not

Biz de o belirleyebilir else iffark kadar bir anahtar kelime olamaz anahtar kelimeler şunlardır tanımlayıcılar ve biz cevabım bir tanımlayıcı için gramer görebilirsiniz sayısal bir rakam ile bir sınıf adı başlayabilirim? tanımlayıcılarda boşluklara izin verilmez ve bu nedenle else iftek bir anahtar kelime olamaz, ancak iki ayrı anahtar kelime olmalıdır .


1
Bunu standart olmadan anlayabilir misin? ASM'de: jeq( if| else if), jne( if| else if), jmp( else). Buna dayanarak, tek bir anahtar kelime olduğunu söylemiştim .. muhtemelen sözdizimsel olarak değil, talimat açısından.
Brandon

18
@Brandon Kullanılan dilbilgisi ve derleyicinin kendisi hakkında samimi bilgi olmadan assembly dilinden yüksek seviyeli yapılara güvenilir bir şekilde geçebileceğinizden şüpheliyim.
Shafik Yaghmour

Yine de, bu tanımın, ayrıştırıcıdaki dilbilgisini tanımlarken harika "sarkan" belirsiz sözdizimi ağacı sorununa yol
açabileceğini unutmayın

2
Bazı diller desteklemez else if, bunun yerine elsif. Bu dillerde, else ifgerçekten bir anahtar kelimedir. Bununla birlikte, bu cevabın belirttiği gibi, C tabanlı diller genellikle yoktur.
sfdcfox

1
Sanırım @Krumia son bir elseaçıklama görmek istedi . Bunu da takdir ediyorum.
Matthias

78

Sözdizimsel olarak, bu tek bir anahtar kelime değildir; anahtar kelimeler boşluk içeremez. Listeleri yazarken Mantıken, else ifeğer, muhtemelen daha iyi sen tek bir anahtar kelime ve yazma olarak görürler:

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

Derleyici bunu tam anlamıyla şu şekilde görür:

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

ancak her iki form da aynı şeye çıkıyor ve ilki çok daha okunabilir.


1
Aslında, derleyici tam anlamıyla elsebir compound-statement. Sonra else, statement( return;veya gibi olabilir f()) veya compound-statement...
The Mask

@TheMask: Shafik Yaghmour'un yukarıdaki cevabına göre, derleyici kelimenin tam anlamıyla tek bir ifade görüyor, ancak bir bileşik ifade görmüş gibi davranıyor .
Ilmari Karonen

Bu cevap, ayrıştırıcının belirteçleri nasıl çıkaracağını belirtir. İyi.
haccks

24

Hayır öyle değil.
Bunlar iki anahtar sözcüktür ve ayrıca, ikinci "eğer", birinci "else" ifadesi tarafından belirlenen kapsamın "içindeki" bir alt maddedir.


2
Bu neler olup bittiğini iyi tanımlasa da, söylediklerinizi daha iyi kanıtlamak için gerçek dil tanımlarına bazı referanslar eklemek isteyebilirsiniz.
πάντα ῥεῖ

2
@ πάνταῥεῖ: Referanslar konusunda haklısınız, ancak bu çalışma Shafik Yaghmour tarafından henüz iyi yapıldı. Cevabı kabul edildi ve ben de oy verdim. İşim burada bitti.
pablo1977

16

Kapsamı küme parantezi kullanarak görebilirsiniz:

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

Ve normalde iki farklı anahtar kelimeyle uygulanır; biri eğer , diğeri ise başka .


Öyleyse, bir bileşik cümlenin kabul edildiği her yerde küme parantezlerinin kullanılması konusunda ısrar edenler, önemsiz olmayan tüm koşullarını böyle yazıyor olmalı, ha? :)
dlf

5
Bence her şeyi abartabiliriz, en sevdiğimiz kıvırcık tellerimiz bile. Bunu Evde Yapmayın.
ren geyiği

1
Tek bir ifadeden oluşsa bile, tüm alt ifadelerin etrafında kaşlı ayraçlar gerektiren tüm küme ayracı yapılı diller (bildiğim), "else if" anlamına gelen tek belirteçli bir anahtar kelimeye sahiptir. Sanırım bu anlatıyor.
zwol

@Zack: Swift, kuralınızı çiğneyen bir dildir. Tek ifadeli kod blokları için bile küme parantezi gerektirir, ancak "else if" anahtar kelimesi yoktur. Öte yandan, dilbilgisi C'den oldukça farklıdır. Bir if-statementisteğe bağlı olarak biter else-clause. An else-clause, ya else code-block da else if-statement. code-blockzorunlu diş tellerini içerir. Dolayısıyla elseanahtar kelimenin ardından yalnızca {veya gelebilir if.
GraniteRobert

@GraniteRobert Swift'e çok fazla bakmaya vaktim olmadı ama bu ilginç bir veri noktası; Böyle bir gramerin bir olasılık olduğunu düşünüyordum ama yapıldığını hiç görmemiştim. Ve bunun da insanların " else { if ... }" yazmasını engellediğini fark edeceksiniz .
zwol

10

Daha önce cevaplandığı gibi, değil. Bunlar iki anahtar kelimedir. Birbirini takip eden iki ifadenin başlangıcı. Bunu biraz daha netleştirmeyi denemek için, işte BNF grameri ifve elseC ++ dilindeki ifadeler.

 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

statementKendisinin de içerdiğini unutmayın selection-statement. Yani, aşağıdaki gibi kombinasyonlar:

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

C ++ standardına / semantiğine göre mümkündür ve geçerlidir.

Not: C ++ dilbilgisi bu sayfadan alınmıştır.



-1

Tüm bu açıklamalara kendi bakış açımı eklemek istiyorum. Gördüğüm gibi, bu anahtar kelimeleri ayrı ayrı kullanabiliyorsanız, bunlar İKİ anahtar kelime olmalıdır. Stackoverflow'daki bu bağlantıdan c ++ dilbilgisine bakabilirsiniz: Standart bir C ++ dilbilgisi var mı?

Saygılarımızla


-1

Bir if ifadesinin ardından isteğe bağlı bir else if ... else ifadesi gelebilir; bu, single if ... else if ifadesini kullanarak çeşitli koşulları test etmek için çok yararlıdır.

İf, else if, else ifadelerini kullanırken akılda tutulması gereken birkaç nokta vardır.

Bir if sıfır veya bir başkasına sahip olabilir ve herhangi bir if'in ardından gelmelidir.

Bir if, sıfırdan çok sayıda eğer'e sahip olabilir ve onlar diğerinden önce gelmelidir.

Bir kez başarılı olursa, başka hiçbiri kalmamışsa ya da başkası test edilmeyecektir.

if ... else deyimi öğreticisine bir göz atın .


2
Bu sadece standarda uymuyor ve dahası gereksiz. Dil, else ifbir anahtar kelime gibi simüle etmek için tüm ifade gücüne sahiptir , bu nedenle onu açıkça tanımlamanın bir anlamı olmayacaktır.
Ruslan

1
Bu, programcılar için faydalı bir basitleştirmedir. Ancak soru, if ifadelerinin nasıl kullanılacağını sormuyor.
Cruncher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.