Saya menulis sebuah program yang melibatkan penggunaan pernyataan switch ... Namun pada kompilasi itu menunjukkan:
Kesalahan: Lompat ke label kasus.
Kenapa bisa begitu?
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;
class contact
{
public:
string name;
int phonenumber;
string address;
contact() {
name= "Noname";
phonenumber= 0;
address= "Noaddress";
}
};
int main() {
contact *d;
d = new contact[200];
string name,add;
int choice,modchoice,t;//Variable for switch statement
int phno,phno1;
int i=0;
int initsize=0, i1=0;//i is declared as a static int variable
bool flag=false,flag_no_blank=false;
//TAKE DATA FROM FILES.....
//We create 3 files names, phone numbers, Address and then abstract the data from these files first!
fstream f1;
fstream f2;
fstream f3;
string file_input_name;
string file_input_address;
int file_input_number;
f1.open("./names");
while(f1>>file_input_name){
d[i].name=file_input_name;
i++;
}
initsize=i;
f2.open("./numbers");
while(f2>>file_input_number){
d[i1].phonenumber=file_input_number;
i1++;
}
i1=0;
f3.open("./address");
while(f3>>file_input_address){
d[i1].address=file_input_address;
i1++;
}
cout<<"\tWelcome to the phone Directory\n";//Welcome Message
do{
//do-While Loop Starts
cout<<"Select :\n1.Add New Contact\n2.Update Existing Contact\n3.Display All Contacts\n4.Search for a Contact\n5.Delete a Contact\n6.Exit PhoneBook\n\n\n";//Display all options
cin>>choice;//Input Choice from user
switch(choice){//Switch Loop Starts
case 1:
i++;//increment i so that values are now taken from the program and stored as different variables
i1++;
do{
cout<<"\nEnter The Name\n";
cin>>name;
if(name==" "){cout<<"Blank Entries are not allowed";
flag_no_blank=true;
}
}while(flag_no_blank==true);
flag_no_blank=false;
d[i].name=name;
cout<<"\nEnter the Phone Number\n";
cin>>phno;
d[i1].phonenumber=phno;
cout<<"\nEnter the address\n";
cin>>add;
d[i1].address=add;
i1++;
i++;
break;//Exit Case 1 to the main menu
case 2:
cout<<"\nEnter the name\n";//Here it is assumed that no two contacts can have same contact number or address but may have the same name.
cin>>name;
int k=0,val;
cout<<"\n\nSearching.........\n\n";
for(int j=0;j<=i;j++){
if(d[j].name==name){
k++;
cout<<k<<".\t"<<d[j].name<<"\t"<<d[j].phonenumber<<"\t"<<d[j].address<<"\n\n";
val=j;
}
}
char ch;
cout<<"\nTotal of "<<k<<" Entries were found....Do you wish to edit?\n";
string staticname;
staticname=d[val].name;
cin>>ch;
if(ch=='y'|| ch=='Y'){
cout<<"Which entry do you wish to modify ?(enter the old telephone number)\n";
cin>>phno;
for(int j=0;j<=i;j++){
if(d[j].phonenumber==phno && staticname==d[j].name){
cout<<"Do you wish to change the name?\n";
cin>>ch;
if(ch=='y'||ch=='Y'){
cout<<"Enter new name\n";
cin>>name;
d[j].name=name;
}
cout<<"Do you wish to change the number?\n";
cin>>ch;
if(ch=='y'||ch=='Y'){
cout<<"Enter the new number\n";
cin>>phno1;
d[j].phonenumber=phno1;
}
cout<<"Do you wish to change the address?\n";
cin>>ch;
if(ch=='y'||ch=='Y'){
cout<<"Enter the new address\n";
cin>>add;
d[j].address=add;
}
}
}
}
break;
case 3 : {
cout<<"\n\tContents of PhoneBook:\n\n\tNames\tPhone-Numbers\tAddresses";
for(int t=0;t<=i;t++){
cout<<t+1<<".\t"<<d[t].name<<"\t"<<d[t].phonenumber<<"\t"<<d[t].address;
}
break;
}
}
}
while(flag==false);
return 0;
}
case
blok di kawat gigi?Jawaban:
Masalahnya adalah bahwa variabel yang dideklarasikan dalam satu
case
masih terlihat dicase
s berikutnya kecuali jika{ }
blok eksplisit digunakan, tetapi mereka tidak akan diinisialisasi karena kode inisialisasi milik yang laincase
.Dalam kode berikut, jika
foo
sama dengan 1, semuanya baik-baik saja, tetapi jika sama dengan 2, kita akan secara tidak sengaja menggunakani
variabel yang ada tetapi mungkin mengandung sampah.Membungkus kasing dalam blok eksplisit memecahkan masalah:
Edit
Lebih jauh,
switch
pernyataan hanya merupakan jenis yang sangat mewahgoto
. Berikut adalah sepotong kode analog yang menunjukkan masalah yang sama tetapi menggunakangoto
bukanswitch
:sumber
Deklarasi variabel baru dalam pernyataan kasus adalah apa yang menyebabkan masalah. Menutup semua
case
pernyataan dalam{}
akan membatasi ruang lingkup variabel yang baru dideklarasikan pada kasus yang sedang dieksekusi yang memecahkan masalah.sumber
Standar C ++ 11 untuk melompati beberapa inisialisasi
JohannesD memberikan penjelasan, sekarang untuk standar.
The C ++ 11 N3337 standar rancangan 6,7 "pernyataan Deklarasi" mengatakan:
Pada GCC 5.2, pesan kesalahan sekarang mengatakan:
C
C memungkinkan: c99 melewati inisialisasi
The C99 N1256 standar rancangan Annex I "peringatan umum" mengatakan:
sumber
Jawaban JohannesD benar, tetapi saya merasa itu tidak sepenuhnya jelas pada aspek masalah.
Contoh yang dia berikan menyatakan dan menginisialisasi variabel
i
dalam kasus 1, dan kemudian mencoba menggunakannya dalam kasus 2. Argumennya adalah bahwa jika saklar langsung ke kasus 2,i
akan digunakan tanpa diinisialisasi, dan inilah mengapa ada kompilasi kesalahan. Pada titik ini, orang bisa berpikir bahwa tidak akan ada masalah jika variabel yang dinyatakan dalam suatu kasus tidak pernah digunakan dalam kasus lain. Sebagai contoh:Orang bisa mengharapkan program ini untuk dikompilasi, karena keduanya
i
danj
hanya digunakan di dalam kasus yang menyatakannya. Sayangnya, dalam C ++ ini tidak dapat dikompilasi: seperti yang dijelaskan Ciro Santilli 包子 露 宪 六四 事件 , kami tidak dapat langsung melompatcase 2:
, karena ini akan melewatkan deklarasi dengan inisialisasii
, dan meskipuncase 2
tidak digunakani
sama sekali, ini masih dilarang di C ++.Menariknya, dengan beberapa penyesuaian (a
#ifdef
ke#include
header yang sesuai, dan titik koma setelah label, karena label hanya dapat diikuti oleh pernyataan, dan deklarasi tidak dihitung sebagai pernyataan dalam C ), program ini dikompilasi sebagai C:Berkat kompiler online seperti http://rextester.com Anda dapat dengan cepat mencoba mengkompilasinya sebagai C atau C ++, menggunakan MSVC, GCC atau Dentang. Karena C selalu berfungsi (hanya ingat untuk mengatur STDIN!), Karena C ++ tidak ada kompiler yang menerimanya.
sumber