Apakah "else if" adalah kata kunci tunggal?

100

Saya baru mengenal C ++. Saya sering melihat pernyataan kondisional seperti di bawah ini:

if 
  statement_0;
else if
  statement_1;

Pertanyaan:

Secara sintaksis , haruskah saya memperlakukan else ifsebagai kata kunci tunggal? Atau itu sebenarnya ifpernyataan bersarang di luar elseseperti di bawah ini?

if 
  statement_0;
else 
  if
    statement_1;
pemodel
sumber
5
Untuk poin kedua Anda. Secara sintaksis itu hampir selalu dituliselse if
TheNorthWes
8
Tidak, karena itu akan membuat tata bahasanya lebih kompleks: kata adalah kata tanpa spasi. Bahasa lain memiliki kata kunci seperti elseifdan ELIF. Nyatanya hanya (?) Bahasa pemrograman Algol68 memungkinkan spasi dalam pengenal; bagus juga:PROC walk through tree ()
Joop Eggen
3
Fortran (setidaknya versi bentuk tetap), dan semua versi standar Algol memungkinkan spasi di mana saja. Satu cerita mengatakan bahwa pelubang kartu tampaknya cenderung menambahkan spasi saat mengetik dalam kode; Sederhananya, mengizinkan spasi dalam nama variabel akan memungkinkan pemrogram menggunakan nama yang lebih baik dan masalahnya tidak terduga.
prosfilaes
1
Kata elseifkunci ada di VB dan PHP.
Salman A
3
Nitpick: meskipun C ++ secara resmi tidak memiliki kata kunci dengan spasi di dalamnya, C ++ memiliki konstruksi seperti untuk semua maksud dan tujuan yang berfungsi seperti itu. Misalnya, long doubleAnda harus menulis seperti itu. longdoublesalah.
Tuan Lister

Jawaban:

133

Kata kunci tersebut bukan satu kata kunci jika kita membuka draf C ++ bagian standar tabel 2.12 Kata Kunci4 daftar keduanya ifdan elsesecara terpisah dan tidak ada else ifkata kunci. Kita dapat menemukan daftar kata kunci C ++ yang lebih mudah diakses dengan membuka bagian cppreferences pada kata kunci .

Tata bahasa di bagian ini 6.4juga menjelaskan hal ini:

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

The ifdalam else ifadalah pernyataan mengikuti elseistilah. Bagian itu juga mengatakan:

[...] Substatement dalam pernyataan-pemilihan (setiap substatement, dalam bentuk lain dari pernyataan if ) secara implisit mendefinisikan lingkup blok (3.3). Jika substatement dalam pernyataan-pemilihan adalah pernyataan tunggal dan bukan pernyataan-majemuk , hal itu seolah-olah ditulis ulang menjadi pernyataan-majemuk yang mengandung substatement asli.

dan memberikan contoh berikut:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

Jadi bagaimana contoh Anda yang sedikit diperpanjang diuraikan?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

akan diurai seperti ini:

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

Catatan

Kita juga dapat menentukan bahwa else iftidak bisa menjadi satu kata kunci dengan menyadari bahwa kata kunci adalah pengidentifikasi dan kita dapat melihat dari tata bahasa untuk pengenal dalam jawaban saya untuk Bisakah Anda memulai nama kelas dengan digit numerik? spasi tidak diperbolehkan dalam pengenal dan oleh karena itu else iftidak boleh menjadi satu kata kunci tetapi harus merupakan dua kata kunci yang terpisah .

Shafik Yaghmour
sumber
1
Anda bisa menyimpulkan ini tanpa standar? Dalam ASM-nya: jeq( if| else if), jne( if| else if), jmp( else). Berdasarkan itu, saya akan mengatakan itu adalah kata kunci tunggal .. mungkin tidak secara sintaksis tetapi bijaksana.
Brandon
18
@Brandon Saya sangat meragukan Anda dapat beralih dari bahasa assembly ke konstruksi tingkat tinggi tanpa pengetahuan mendalam tentang tata bahasa yang digunakan dan kompiler itu sendiri.
Shafik Yaghmour
Meskipun perhatikan bahwa definisi ini berpotensi mengarah pada masalah pohon sintaks ambigu "menggantung yang lain" saat mendefinisikan tata bahasa di parser ...
LinearZoetrope
2
Beberapa bahasa tidak mendukung else if, melainkan elsif. Dalam bahasa tersebut, else ifbenar-benar satu kata kunci. Namun, bahasa berbasis C umumnya tidak, seperti yang dinyatakan dalam jawaban ini.
sfdcfox
1
Saya pikir @Krumia ingin melihat elsepernyataan terakhir . Saya akan menghargai ini juga.
Matthias
78

Secara sintaksis, ini bukan satu kata kunci; kata kunci tidak boleh berisi spasi. Secara logis, saat menulis daftar else if, mungkin lebih baik jika Anda melihatnya sebagai kata kunci tunggal, dan menulis:

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

Kompiler secara harfiah melihat ini sebagai:

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

tetapi kedua bentuk tersebut menghasilkan hal yang sama, dan yang pertama jauh lebih mudah dibaca.

James Kanze
sumber
1
Sebenarnya, kompilator tidak melihat secara harfiah elsediikuti oleh compound-statement. Setelah else, Ini mencari statement(yang mungkin seperti return;atau f()) atau compound-statement...
The Mask
@TheMask: Sesuai jawaban Shafik Yaghmour di atas, kompilator secara harfiah melihat satu pernyataan, tetapi berpura - pura melihat pernyataan majemuk.
Ilmari Karonen
Jawaban ini menentukan bagaimana parser mengekstrak token. Baik.
haccks
24

Tidak, bukan.
Mereka adalah dua kata kunci dan, terlebih lagi, yang kedua "jika" adalah substatement "di dalam" ruang lingkup yang ditentukan oleh pernyataan "lain" yang pertama.

pablo1977
sumber
2
Meskipun ini menjelaskan dengan baik apa yang sedang terjadi, Anda mungkin ingin menambahkan beberapa referensi untuk definisi bahasa yang sebenarnya untuk membuktikan lebih baik apa yang Anda katakan.
πάντα ῥεῖ
2
@ πάνταῥεῖ: Anda benar tentang referensi, tetapi pekerjaan ini telah dilakukan dengan baik oleh Shafik Yaghmour. Jawabannya adalah yang diterima dan saya juga telah memilih. Tugasku selesai disini.
pablo1977
16

Anda dapat melihat cakupan dengan menggunakan kurung kurawal:

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

Dan biasanya diterapkan dengan dua kata kunci berbeda, satu jika dan satu lagi .

rusa kutub
sumber
Jadi saya kira mereka yang bersikeras bahwa kurung kurawal harus digunakan di mana pun pernyataan majemuk diterima harus menulis semua persyaratan nontrivial mereka seperti ini, ya? :)
dlf
5
Saya pikir seseorang dapat melakukan apapun secara berlebihan, bahkan kawat gigi keriting yang kita cintai. Jangan Lakukan Ini Di Rumah.
rusa kutub
1
Semua bahasa berstruktur kurung kurawal (yang saya ketahui) yang memerlukan tanda kurung kurawal di sekitar semua substatement, meskipun terdiri dari satu pernyataan, memiliki kata kunci token tunggal dengan arti "lain jika". Saya pikir itu jitu.
zwol
@Zack: Swift adalah bahasa yang melanggar aturan Anda. Ini membutuhkan tanda kurung kurawal bahkan untuk blok kode pernyataan tunggal, tetapi tidak memiliki kata kunci "else if". Di sisi lain, tata bahasanya sangat berbeda dari C. An if-statementdiakhiri dengan opsional else-clause. An else-clauseadalah salah satu else code-block atau else if-statement. code-blocktermasuk kawat gigi wajib. Jadi elsekata kunci hanya dapat diikuti oleh {atau if.
GraniteRobert
@GraniteRobert Belum punya waktu untuk melihat Swift sama sekali, tapi itu poin data yang menarik; Saya berpikir bahwa tata bahasa seperti itu adalah sebuah kemungkinan tetapi belum pernah melihatnya dilakukan. Dan Anda akan melihat bahwa, juga, menghindari membuat orang menulis " else { if ... }".
zwol
10

Seperti yang sudah dijawab, tidak. Itu adalah dua kata kunci. Ini dimulai dari dua pernyataan yang satu mengikuti satu sama lain. Untuk mencoba membuatnya lebih jelas, berikut adalah tata bahasa BNF yang berhubungan dengan ifdan elsepernyataan dalam bahasa C ++.

 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

Perhatikan bahwa statementitu sendiri termasuk selection-statement. Jadi, kombinasi seperti:

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

dimungkinkan dan valid menurut standar / semantik C ++.

Catatan: Tata bahasa C ++ diambil dari halaman ini .

Topeng
sumber
1

else dan jika adalah dua kata kunci C ++ yang berbeda . Sebuah jika pernyataan dapat diikuti oleh opsional lain jika ... lain pernyataan. Sebuah jika pernyataan dapat memiliki nol atau lebih lain jika 's dan mereka harus datang sebelum yang lain .

Anda dapat menemukan sintaks dan contoh dalam tutorial pernyataan if ... else ini

clever_bassi
sumber
-1

Saya hanya ingin menambahkan sudut pandang saya pada semua penjelasan ini. Seperti yang saya lihat, jika Anda dapat menggunakan kata kunci ini secara terpisah, kata kunci tersebut harus DUA kata kunci. Mungkin Anda dapat melihat tata bahasa c ++, dari tautan ini di stackoverflow: Apakah ada tata bahasa C ++ standar?

Salam

Mengatasi masalah
sumber
-1

Pernyataan if dapat diikuti dengan pernyataan opsional else if ... else, yang sangat berguna untuk menguji berbagai kondisi menggunakan pernyataan if ... else if tunggal.

Saat menggunakan pernyataan if, else if, else ada beberapa hal yang perlu diingat.

Sebuah if dapat memiliki nol atau satu yang lain dan itu harus ada setelah yang lain jika.

Sebuah jika dapat memiliki nol hingga banyak lainnya jika dan mereka harus datang sebelum yang lain.

Sekali lagi jika berhasil, tidak ada dari dia yang tersisa jika's atau yang lain akan diuji.

lihat jika ... tutorial pernyataan lain .

KNOWME
sumber
2
Ini tidak sesuai dengan standar, dan terlebih lagi, berlebihan. Bahasa memiliki semua kekuatan ekspresif untuk mensimulasikan else ifseolah-olah itu adalah kata kunci, jadi tidak ada gunanya mendefinisikannya secara eksplisit.
Ruslan
1
Ini adalah penyederhanaan yang berguna bagi programmer. Tapi pertanyaannya bukan menanyakan bagaimana menggunakan pernyataan if.
Cruncher