Bu konuda kafam karıştı. Birçoğumuza Java'da herhangi bir goto ifadesi olmadığı söylendi.
Ama Java anahtar kelimelerden biri olduğunu buldum. Nerede kullanılabilir? Kullanılamıyorsa, neden Java'ya anahtar kelime olarak dahil edildi?
Bu konuda kafam karıştı. Birçoğumuza Java'da herhangi bir goto ifadesi olmadığı söylendi.
Ama Java anahtar kelimelerden biri olduğunu buldum. Nerede kullanılabilir? Kullanılamıyorsa, neden Java'ya anahtar kelime olarak dahil edildi?
Yanıtlar:
Java'nın anahtar kelime listesi belirten gotoanahtar kelimeyi, ancak "kullanılmıyor" olarak işaretlenir.
Orijinal JVM'deydi ( @VitaliiFedorenko'nun cevabına bakınız ), ancak daha sonra kaldırıldı. Java'nın sonraki bir sürümüne eklenmesi durumunda büyük olasılıkla ayrılmış bir anahtar kelime olarak tutuldu.
Listede gotodeğilse ve daha sonra dile eklenirse, sözcüğü gototanımlayıcı olarak kullanan değişken kod (değişken adı, yöntem adı vb.) Bozulur. Ancak gotobir anahtar kelime olduğu için, bu tür kodlar günümüzde bile derlenmeyecektir ve mevcut kodu bozmadan daha sonra bir şeyler yapması mümkün olmaya devam etmektedir.
This was probably done in case it were to be added to a later version of Java.Aslında, ana neden biraz farklı (aşağıdaki cevabım bakınız)
James Gosling orijinal JVM'yi goto ifadeleri , ancak daha sonra bu özelliği gereksiz olarak kaldırdı. Ana neden gotogereksizdir, genellikle daha okunabilir ifadelerle (örneğin break/continue) veya bir yönteme bir parça kod çıkartılarak değiştirilebilmesidir.
goto olan başka bir şey haline zorlayarak perforce yani şey ifade etmek en readyble ve net şekilde, daha az okunabilir .
Anahtar kelime var, ancak uygulanmıyor.
Düşünebileceğim goto kullanmanın tek iyi nedeni şudur:
for (int i = 0; i < MAX_I; i++) {
for (int j = 0; j < MAX_J; j++) {
// do stuff
goto outsideloops; // to break out of both loops
}
}
outsideloops:
Java'da bunu şu şekilde yapabilirsiniz:
loops:
for (int i = 0; i < MAX_I; i++) {
for (int j = 0; j < MAX_J; j++) {
// do stuff
break loops;
}
}
break loops"denilen döngüden kopar" anlamına gelir loops. Belki geçmişe dönük olarak etiket için daha iyi bir isim olabilirdi outer.
while (true) {... kullanmak }aşırıya kaçıyor. GOTO, yanlış kullanımları nedeniyle sık sık damgalanmaktadır, ancak boole değişmezleriyle yapılan gereksiz karşılaştırmaların GOTO'dan daha kötü olduğunu iddia ediyorum.
continue LABEL;ifade ile birlikte çok yararlı olduğunu keşfettim . Böylece bir dış yalan döngüsüne devam edebilirsiniz.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
"Const ve goto anahtar kelimeleri şu anda kullanılmasalar bile ayrılmıştır."
Yani bir gün dil tasarımcıları ihtiyacı hissederse kullanılabilirler.
Ayrıca, bu anahtar kelimelere (örn. C, C ++) sahip dillerden programcılar bunları yanlışlıkla kullanıyorsa, Java derleyicisi yararlı bir hata mesajı verebilir.
Ya da sadece programcıları goto kullanarak durdurmaktı :)
gotove constC / C ++ mirasını yansıtır, ancak uygulanmazlar (ikincisinin uygulanmasıyla ilgili tartışmalar olmasına rağmen). Daha fazla gibi bir çift assertve enumbaşlangıçta belki ayrılmış, ancak değil, yapılmış, uygulanmış oldukları vermeliydim. Ama gez harika bir şey.
İleride kullanılmak üzere ayrılmıştır (bakınız: Java Dili Anahtar Kelimeleri )
Const ve goto anahtar kelimeleri şu anda kullanılmasalar bile ayrılmıştır.
Sebebi neden Java hiçbir git ifadesi yoktur "bulunabilir Java Dil Çevre ":
Java'nın goto ifadesi yok. Çalışmalar, goto'nun sadece "çünkü" değil, daha sık kullanıldığını gösterdi. Goto'yu ortadan kaldırmak dilin basitleştirilmesine yol açtı - örneğin, bir gotonun for for ifadesinin ortasına etkileri hakkında herhangi bir kural yoktur. Yaklaşık 100.000 C kodu satırı üzerinde yapılan çalışmalar, goto ifadelerinin kabaca yüzde 90'ının yalnızca iç içe döngülerin kırılma etkisini elde etmek için kullanıldığını tespit etti. Yukarıda belirtildiği gibi, çok seviyeli kopma ve devam etme, goto ifadeleri ihtiyacının çoğunu ortadan kaldırır.
gotoayrılmış, ancak ileride kullanılmak üzere değil.
Java'da "devam" etiketlerinin nasıl kullanılacağına bir örnek:
public class Label {
public static void main(String[] args) {
int temp = 0;
out: // label
for (int i = 0; i < 3; ++i) {
System.out.println("I am here");
for (int j = 0; j < 20; ++j) {
if(temp==0) {
System.out.println("j: " + j);
if (j == 1) {
temp = j;
continue out; // goto label "out"
}
}
}
}
System.out.println("temp = " + temp);
}
}
Sonuçlar:
I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1
gotoYapının, makine kodunda ve montaj dilinde programcıların programladığı günlerden kalma olduğunu anlamak önemlidir . Bu diller çok basit olduğu için (her talimatta olduğu gibi, sadece bir şey yapar), program kontrol akışı tamamen gotoifadelerle yapılır (ancak montaj dilinde bunlar atlama veya dal talimatları olarak adlandırılır ).
Şimdi, C dili oldukça düşük seviyeli olmasına rağmen, çok yüksek seviyeli bir montaj dili olarak düşünülebilir - C'deki her ifade ve işlev, montaj dili talimatlarına kolayca ayrılabilir. C, günümüzde bilgisayarları programlamak için ana dil olmasa da, gömülü sistemler gibi düşük seviyeli uygulamalarda hala yoğun olarak kullanılmaktadır. C'nin işlevi, montaj dilinin işlevini çok yakından yansıttığından, yalnızca gotoC'de bulunan mantıklıdır .
Java'nın C / C ++ 'ın bir evrimi olduğu açıktır. Java, C'nin birçok özelliğini paylaşır, ancak çok daha fazla ayrıntıyı özetler ve bu nedenle basitçe farklı şekilde yazılır. Java çok yüksek seviyeli bir dildir, bu yüzden gotoher biri için fonksiyonlar gibi daha yüksek seviyeli yapılar olduğunda ve döngüler program kontrol akışını yaparken olduğu gibi düşük seviyeli özelliklere sahip olmak gerekli değildir . gotoBir işlevdeyseniz ve başka bir işleve bir etikette etiket uyguladıysanız düşünün . Diğer işlev geri döndüğünde ne olur? Bu fikir saçma.
Bu, Java'nın gotoifadeyi neden içerdiğini , ancak derlemesine izin vermediğini mutlaka yanıtlamaz , ancak neden gotoilk etapta, alt düzey uygulamalarda kullanıldığını ve neden olması mantıklı olmadığını bilmek önemlidir. Java ile kullanılır.
Hayır, gotokullanılmaz, ancak etiketleri tanımlayabilir ve bir döngüyü etikete kadar bırakabilirsiniz. Etiketi kullanabilir breakveya continuetakip edebilirsiniz . Böylece birden fazla döngü seviyesinden atlayabilirsiniz. Göz at öğretici .
Hayır, şükürler olsun ki goto Java'da yok.
gotoAnahtar kelime sadece ayrılmış, ancak (Aynı şey kullanılmaz const).
Çünkü desteklenmiyor ve neden bir goto hiçbir şey yapmayan anahtar kelimeyi veyagoto ?
Her ne kadar etkili bir şekilde yapmak için break label;ve continue label;ifadeleri kullanabilirsiniz goto. Ama bunu tavsiye etmem.
public static void main(String [] args) {
boolean t = true;
first: {
second: {
third: {
System.out.println("Before the break");
if (t) {
break second;
}
System.out.println("Not executed");
}
System.out.println("Not executed - end of second block");
}
System.out.println("End of third block");
}
}
The keywords const and goto are reserved, even though they are not currently used. This may allow a Java compiler to produce better error messages if these C++ keywords incorrectly appear in programs.Bu, "Bunu kullanmıyoruz, bu yüzden bir C ++ arka planından geliyorsanız, onu hiç kullanmanıza izin vermeyeceğiz." Anlamına gelir. 2) gotokorkunç bir yöntem adıdır. Afedersiniz. 3) mola ve devam et önerilir, ancak burada kullanılan şekilde değildir . 4) "büyük olasılıkla" [alıntı gerekli].
Hayır, gotoayrılmış bir kelime olmasına rağmen Java'da kullanılmaz. Aynı şey için de geçerlidir const. Bunların her ikisi de büyük olasılıkla ayrılmış olmalarının nedeni olan C ++ 'da kullanılır; amaç büyük olasılıkla Java'ya geçiş yapan C ++ programcılarının kafasını karıştırmamak ve belki de bunları daha sonraki Java sürümlerinde kullanma seçeneğini korumaktı.
gotoen azından yakın gelecekte desteklenmez;)
Goto'nun iyi huylu kullanımlarının çoğunu
dönüş
mola
etiketi kır
try-catch-nihayet içine atmak
return
Belirtildiği gibi, gotoJava'da yok , ancak Sun'ın gotobir gün Java'ya eklemek istemesi durumunda anahtar kelime ayrıldı . Çok fazla kod kırmadan ekleyebilmek istediler, bu yüzden anahtar kelimeyi ayırdılar. Java 5 ile enumanahtar kelimeyi eklediklerini ve bu kadar kod kırmadığını unutmayın.
Java hiçbir olmasına rağmen goto, bazı yapıları vardır bazı kullanımlar için hangi tekabül gotoyani edememek, breakve continueadlandırılmış döngüler ile. Ayrıca, finallybir çeşit bükülmüş olarak düşünülebilir goto.
Aynı ada sahip değişkenlerin beyanlarını yasaklamak.
Örneğin
int i = 0, goto;
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
Java'da bir goto ifadesi olmadığı söylendiğinde aldanıyorsunuz. Aslında, Java iki "kaynak" kodu katmanından oluşur.
Aşağıdaki bağlantıya bakın, java ayrılmış tüm kelimeleri gösterir ve hangi sürümleri eklediklerini söyler.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
goto ayrılmış, şu anda kullanılmasa bile, asla asla deme :)
Hayranı değilim goto genellikle , genellikle kodu daha az okunabilir yapar. Bununla birlikte, bu kuralın istisnaları olduğuna inanıyorum (özellikle söz konusu sözcükler ve ayrıştırıcılar söz konusu olduğunda!)
Tabii ki programınızı her zaman montajcı benzeri bir şeye çevirerek Kleene Normalform'a getirebilir ve daha sonra
int line = 1;
boolean running = true;
while(running)
{
switch(line++)
{
case 1: /* line 1 */
break;
case 2: /* line 2 */
break;
...
case 42: line = 1337; // goto 1337
break;
...
default: running = false;
break;
}
}
(Yani temelde ikili kodunuzu yürüten bir VM yazıyorsunuz ... line yönerge işaretçisine karşılık gelir)
Bu, kullanılan koddan çok daha okunabilir gotodeğil mi?
Tabii ki anahtar kelime, ancak kaynak kodu düzeyinde kullanılmıyor.
Ancak jasmin veya bayt koduna dönüştürülen başka bir alt düzey dil kullanıyorsanız, "git"
Çünkü Java dili bunu kullanmasa da, JVM bayt kodu kullanır.
loadanahtar kelimesi yok?
goto Java'da değil
GOTO kullanmak zorunda Ama doğru çalışmıyor. anahtar java kelime kullanılmaz. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
public static void main(String[] args) {
GOTO me;
//code;
me:
//code;
}
}