Någon som vet vad 2 ;; betyder i Java. Ex:
For (;;) {
bla...
bla...
bla...
Tacksam för svar....
// Stefan
18 svar · 501 visningar · startad av swange
Någon som vet vad 2 ;; betyder i Java. Ex:
For (;;) {
bla...
bla...
bla...
Tacksam för svar....
// Stefan
; är satsavgränsare.
Man kan skriva ett helt program på en rad, men för att göra det lite enklare att läsa brukar man dela upp det på lite fler rader.
Jo, visst, Det är en satsavgränsare men det verkar som om man kan använda två stycken på rad i en forloop (;;), och då blir det någon slags operator eller Statement??
Eller?
Nej, for-loopen tar tre satser.
for(start statement; test statement; increase statement)
Du kan utelämna något av dessa, men du kan inte utlämna sats-avgränsarna. Därför är det godkänt, men inte rekommenderat, att använda for(;;).
Detta gäller för samtliga C-liknande språk (Java, C, C++, PHP etc.).
Så med andra ord så kommer denna forloop bara köra och köra??!!
Japp, precis som while(true).
swange skrev:
Så med andra ord så kommer denna forloop bara köra och köra??!!
Fotnot: Ibland är det praktiskt att ha sådana loopar som man i stället avbryter med break. Så den _behöver_ inte snurra på för evigt.
spango, när är det bättre att köra en for(;;) iställer för en
boolean bolCheck = true;
while(bolCheck)
...
Eftersom att båda är loopar som rullar ända tills man manuellt avbryter dem ( Med break eller return ), så bör det inte vara någon skillnad på dem. Därmot kan du ju med for-loopen deklarera variabler som bara finns inom loopen ( I init-delen av for ) - och sedan tas bort efter loopen är klar.
for( String str = "SPiN"; ; ) {
System.out.println( str );
if( LALA == 1 )
break;
}
Strängen str kommer efter att loopen avbrutits att tömmas från minnet. Tror jag, åtminstone - eftersom att den är en lokal variabel, som endast kan användas inom for-blocket.
Brimba skrev:
spango, när är det bättre att köra en for(;;) iställer för en
boolean bolCheck = true;
while(bolCheck)
...
Well... en del menar att det aldrig är bättre. Men ett exempel skulle kunna vara om det inte är helt praktiskt, logiskt eller snyggt att avbryta mellan två iterationer, ungefär så här:
FooServer server = new FooServer();
// Rulla på i all evighet och hämta in förfrågningar
for (;;){
try {
FooRequest request = server.fetchRequest();
request.makeItHappen();
request.finish();
addLogEntry("Request served successfully: " + request);
} catch (FatalFooBarException e){
// rapportera fel, sluta snurra
addLogEntry("PEBKAC error: " + e);
break;
}
}
Man kan ju förstås skriva om det så att man slipper break, men personligen tycker jag att det är krångligare att läsa:
FooServer server = new FooServer();
boolean everythingIsOk = true;
// Rulla på i all evighet och hämta in förfrågningar
while (everythingIsOk){
try {
FooRequest request = server.fetchRequest();
request.makeItHappen();
request.finish();
addLogEntry("Request served successfully: " + request);
} catch (FatalFooBarException e){
// rapportera fel, sluta snurra
addLogEntry("PEBKAC error: " + e);
everythingIsOk = false;
}
}
Annars kan man kasta om det lite.
try {
for (;;){
FooRequest request = server.fetchRequest();
request.makeItHappen();
request.finish();
addLogEntry("Request served successfully: " + request);
}
} catch (FatalFooBarException e){
// rapportera fel, sluta snurra
addLogEntry("PEBKAC error: " + e);
}
personligen tycker jag att en forloop som bygger på break borde vara förbjuden ;)
Att den sedan kan användas och även vara användbar är en helt annan sak, men lösningen i sig borde förbjudas :D
Brimba skrev:
personligen tycker jag att en forloop som bygger på break borde vara förbjuden ;)
Att den sedan kan användas och även vara användbar är en helt annan sak, men lösningen i sig borde förbjudas :D
Håller med Brimba ;)
Finns en längre diskussion om detta här ...
Men OK. Poängen är att man ska undvika break i loopar.. och för det mesta går det att bygga programstrukturen på ett renare sätt. Speciellt om man nästlar iterationer och kanske ställer svaga villkor på break. Anledningen är helt enkelt att det lätt blir svårt att avlusa logiska fel i stora programkonstruktioner.
Hittade en liten kodsnutt som innehöll lite programerarhumor för någon dag sedan... Riktigt torrt. Om man tar två sådana här kodstycken och gnuggar mot varandra så kan man göra upp eld med dom. Frystorkade skämt.
#define ever ;;
...
for (ever) {
...
}
Barndvarning, Motorgåsen, brandvarning. ;)
För övrigt håller jag med Brimba. Man ska naturligtvis använda while (true) i stället!
All användning av break och att kasta exceptions där det inte är nödvändigt bör undvikas enligt mig... break och framför allt continue är ju ett steg tillbaka mot GW Basics orginella kod:
10 if a > 5 goto 40
20 a = a + 1
30 goto 10
40 a = 100
= dålig programstil :D
När vi ändå pratar gammal BASIC... låt mig ta en nubbevisa jag hörde härom helgen...
Melodi: Mors lilla olle
10 LET oss nu fatta i våra glas
20 INPUT en klunk utav det som där has
30 IF du fått nog THEN till 50 min vän
40 ELSE GOTO-baka till 10 igen
50 END
Det var bara jag och några andra datanissar som tyckte den var rolig iofs, men men :e
Har sjungit den snapsvisan förut. Tyvärr är det en evighetsloop, och tack vare att den inte har någon som helst felhantering så upptäcker den inte när någon stackars student fått för mycket och däckar. Därför: använd vettig felhantering så minskar vi alkoholrelaterade problem här i samhället.