Orffi Geschrieben 12. Juni 2002 Teilen Geschrieben 12. Juni 2002 Hallo zusammen! Eigentlich könnte das folgende Rätsel auch in das Java-Forum passen, aber da es nicht ernst gemeint ist, habe ich es hier gepostet. Was macht folgende Funktion: protected static int function ( int v[] ) { int I = 0, l = v.length - 1; for(;!(v[I]>=v[l--]&&++l==I++); return v[l]; }[/code] Aber nicht einfach in den Compiler stopfen und schauen, was passiert... Viel Spaß Jan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MarcG Geschrieben 12. Juni 2002 Teilen Geschrieben 12. Juni 2002 Original geschrieben von Orffi protected static int function ( int v[] ) { int I = 0, l = v.length - 1; for(;!(v[I]>=v[l--]&&++l==I++); return v[l]; }[/code] [/b] Hab von Java nicht viel Ahnung und C hab ich auch ne Weile nicht mehr gesehen, aber ich tipp mal die Funktion liefert den letzten Wert aus dem Array V zurück !? Da die For Schleife nicht viel tut(wenn überhaupt) :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Orffi Geschrieben 12. Juni 2002 Autor Teilen Geschrieben 12. Juni 2002 Falsch... Die Funktion erfüllt schon einen Zweck nur würde man es so nie schreiben. Jan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Containy Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Ich habe es in den Compiler gestopft und nichts ist passiert???:confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MarcG Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 ich kannte eine for-Schleife immer als (z.B.) for(x; x<5;x++) aber x und x++ fehlen doch hier und das Semikolon am Ende ? Steht das nicht am Ende der Schleife? ... naja, wie gesagt kenne ich Java nicht wirklich... moment, ich glaub das mit der Schleife hab ich jetzt kapiert da passiert das eigentliche ... nur was :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MarcG Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 also ich hab das ganze jetzt mal in Delphi umgesetzt, wenn ich es richtig gemacht hab liefert die Funktion den letzten Wert des Arrays zurück. Merk gerade, das hatte ich ja schonmal getippt ... nur das in der Schleife halt was passiert, nicht wie oben gesagt, aber dennoch liefert meine Schleife den letzten Wert zurück. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Original geschrieben von Orffi Was macht folgende Funktion: Gibt sie das kleinste Element des Arrays zurück? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 also ich denke, die schleife liefert keinen wert. sie läuft zwar ohne fehler durch, da alle variablen passen, aber der schleifenrumpf ist leer. also wird bei return nur der letzte wert des arrays zurückgegeben. ich lass mich aber gerne eines besseren belehren. k.o.b Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Original geschrieben von Klotzkopp Gibt sie das kleinste Element des Arrays zurück? Wäre auch meine Lösung... Zur Bestätigung: import java.sql.*; import java.io.*; public class Test1{ static int n[] = {11,3,5,2,7,9}; public static void main(String args[]){ System.out.println(function(n)); } protected static int function ( int v[] ) { int I = 0, l = v.length - 1; for(;!(v[I]>=v[l--]&&++l==I++) ; ) { System.out.println("I: "+I); System.out.println("l: "+l); }; return v[l]; } }[/PHP] liefert als Ausgabe: I: 1 l: 5 I: 1 l: 4 I: 1 l: 3 I: 2 l: 3 I: 3 l: 3 2 Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 sorry, blöder fehler!!!! ich hab nicht realisiert, das die Schleife trotzdem ausgeführt wird, es passiert halt nix. ist aber eine witzige funktion! k.o.b Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
node Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Die Funktion gibt die Anzahl der Elemente vom Array zurück. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
node Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Argh! Stimmt es wird ja inkrementiert bzw. dekrementiert ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MarcG Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Original geschrieben von Orffi Die Funktion erfüllt schon einen Zweck nur würde man es so nie schreiben. Der zweck wir wohl sein, Hochzählen von I bis zur letzten Position. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gajUli Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 protected static int function ( int v[] ) { int I = 0, l = v.length - 1; for(;!(v[I]>=v[l--]&&++l==I++) ; ) ; return v[l]; } [/PHP] Meine Meinung ist, die Schleife ist nur elendes Blendwerk. Faengt schon damit an, dass die for-Schleife eigentlich eine while-Schleife ist. Dann hat der Schleifenkopf Nebeneffekte auf l und I. I waechst nach jedem Schleifendurchlauf um 1, l alterniert zwischen length-1 und length -2, also dem letzten und vorletzten Glied des Arrays. Da die Schleife mit ";" abeschlossen ist, bleibt I irgendwo stehen (wo, das kann man sich mit Hilfe der Bedingung ueberlegen oder kann es auch genauso gut sein lassen), waehrend l immer noch gleich length-1 ist. Zum Schluss gibt die Funktion einfach das letzte Element des Arrays zurueck, was sie ebenso gut taete, wenn man die Schleife auskommentieren wuerde. Dummerweise passt das ganz und gar nicht zu Jaraz Listing. :D Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Original geschrieben von gaiusjUlius Da die Schleife mit ";" abeschlossen ist, bleibt I irgendwo stehen (wo, das kann man sich mit Hilfe der Bedingung ueberlegen oder kann es auch genauso gut sein lassen), waehrend l immer noch gleich length-1 ist. Zum Schluss gibt die Funktion einfach das letzte Element des Arrays zurueck, was sie ebenso gut taete, wenn man die Schleife auskommentieren wuerde. Wenn du den Thread gelesen hättest, wüsstest du das das nicht stimmt. I bleibt genau dann stehen, wenn es gleich l ist und l den Wert im Array liefert, der am kleinsten ist. Sollte das Array zwei kleinste Werte haben, wird der Wert des höheren Indexes ausgegeben. Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Orffi Geschrieben 13. Juni 2002 Autor Teilen Geschrieben 13. Juni 2002 Einige haben es ja schon herausbekommen: die Funktion liefert das kleinste Element in einem Array zurück. Es stimmt, die for-Schleife ist in Wahrheit eine while-Schleife, aber sie hätte bei weitem nicht so verwirrt. Die Funktionsweise beruht darauf, daß bei einer &&-Verknüpfung der 2. Teil nicht mehr ausgeführt wird, wenn der erste Teil schon false ist, da bei && ja beide Teile true sein müssen, daß mit insgesamt true herauskommt. Wenn der erste Teil schon false ist, barucht man den 2. Teil nict mehr: es kommt auf jeden Fall false heraus. Deswegen wird auch das ganze Array durchgearbeitet. Jan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gajUli Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Original geschrieben von Jaraz Wenn du den Thread gelesen hättest, wüsstest du das das nicht stimmt. Nun beruhige Dich, ich hab ihn ja gelesen. (Compilieren ist uebrigens feige.) Aber nettes Beispiel fuer wild optimierende Compiler. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Original geschrieben von gaiusjUlius (Compilieren ist uebrigens feige.) Selbstredend erst nachher geprüft, nur leider war ich zu langsam. (siehe Klotzkopp) Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gajUli Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Joo, war auch zu langsam, wollte noch die Stelle aus der Sprachdefinition raussuchen, dann kam schon Orffi... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
EvilInside Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Original geschrieben von gaiusjUlius Aber nettes Beispiel fuer wild optimierende Compiler. Mmh - es ist vielleicht kleinlich, aber es ist sicherlich nicht eine wilde Optimierung des Compilers, sondern eher ein Feature der Sprache. Das Ganze nennt sich "Short-Circuiting", eben weil vorher abgebrochen wird und nicht der Rest noch evaluiert wird. Man kann entweder mit '&' verküpfen, dann wird alles ausgewertet, oder '&&', dann wird bei einem vorderen Teil, der bereits false ist, abgebrochen. Man kann sich also durchaus darauf verlassen, daß bei der Verwendung von && auch wirklich "Short Circuiting" verwendet wird - man ist nicht auf eine spezielle (und evtl. nicht-standardkonforme) Compiler-Implementation angewiesen. Evil :cool: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
gajUli Geschrieben 13. Juni 2002 Teilen Geschrieben 13. Juni 2002 Hm, ich denke nicht, dass Short-Circuing eine typische Spracheigenschaft ist, denn es kommt ja erst beim Maschinen- bzw. Bytecode zum tragen. Ist ja ein technisches Bonbon zur Rechenzeitoptimierung. Die Sprachdefinition muss nur festlegen, ob so etwas stattfindet oder nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
EvilInside Geschrieben 14. Juni 2002 Teilen Geschrieben 14. Juni 2002 Hm, ich denke nicht, dass Short-Circuing eine typische Spracheigenschaft ist, denn es kommt ja erst beim Maschinen- bzw. Bytecode zum tragen. Ist ja ein technisches Bonbon zur Rechenzeitoptimierung. Ja, das ist schon klar -- insofern ist es auch ungenau, Short-Circuiting als Sprach-Feature zu bezeichnen. Mir ging es nur darum, klarzustellen, daß es sich dabei nicht um ein Compilerspezifisches Verhalten handelt. Es ist eben schon von der Sprache her vorgesehen und nicht einfach ein nettes Feature eines bestimmten Compilers :-)) Die Sprachdefinition muss nur festlegen, ob so etwas stattfindet oder nicht. Genau - und in diesem Fall ist es festgelegt. evil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.