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 goto
anahtar 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 goto
değilse ve daha sonra dile eklenirse, sözcüğü goto
tanımlayıcı olarak kullanan değişken kod (değişken adı, yöntem adı vb.) Bozulur. Ancak goto
bir 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 goto
gereksizdir, 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ı :)
goto
ve const
C / C ++ mirasını yansıtır, ancak uygulanmazlar (ikincisinin uygulanmasıyla ilgili tartışmalar olmasına rağmen). Daha fazla gibi bir çift assert
ve enum
baş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.
goto
ayrı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
goto
Yapı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 goto
ifadelerle 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 goto
C'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 goto
her 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 . goto
Bir 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 goto
ifadeyi neden içerdiğini , ancak derlemesine izin vermediğini mutlaka yanıtlamaz , ancak neden goto
ilk etapta, alt düzey uygulamalarda kullanıldığını ve neden olması mantıklı olmadığını bilmek önemlidir. Java ile kullanılır.
Hayır, goto
kullanılmaz, ancak etiketleri tanımlayabilir ve bir döngüyü etikete kadar bırakabilirsiniz. Etiketi kullanabilir break
veya continue
takip edebilirsiniz . Böylece birden fazla döngü seviyesinden atlayabilirsiniz. Göz at öğretici .
Hayır, şükürler olsun ki goto
Java'da yok.
goto
Anahtar 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) goto
korkunç 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, goto
ayrı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ı.
goto
en 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, goto
Java'da yok , ancak Sun'ın goto
bir 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 enum
anahtar 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 goto
yani edememek, break
ve continue
adlandırılmış döngüler ile. Ayrıca, finally
bir ç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 goto
değ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.
load
anahtar 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;
}
}