Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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:

Falsch...

Die Funktion erfüllt schon einen Zweck nur würde man es so nie schreiben.

Jan

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:

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.

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

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

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

Die Funktion gibt die Anzahl der Elemente vom Array zurück.

Argh! Stimmt es wird ja inkrementiert bzw. dekrementiert ...

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.



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:D

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. :D

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

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

Original geschrieben von Jaraz

Wenn du den Thread gelesen hättest, wüsstest du das das nicht stimmt. :D

Nun beruhige Dich, ich hab ihn ja gelesen. (Compilieren ist uebrigens feige.) :D

Aber nettes Beispiel fuer wild optimierende Compiler. ;)

Original geschrieben von gaiusjUlius

(Compilieren ist uebrigens feige.) :D

Selbstredend erst nachher geprüft, :) nur leider war ich zu langsam. (siehe Klotzkopp)

Gruß Jaraz

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:

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.