While schleife

Status
Nicht offen für weitere Antworten.
C

CN

Gast
Hi,

ich habe folgende Schleife

Code:
while ((iSumme != 1) || (iSumme != 4) )
{
...
}

eigentlich sollte er doch die Schleife verlassen, wenn iSumme 1 oder 4 ist.

Leider bricht er bei überhaupt keiner Zahl die Shcleife ab.
 

Anselmus

Bekanntes Mitglied
wenn iSumme 1 ist dann ist iSumme != 4 true

und false||true ist immer true...

in der informatik heißt "oder" wenn eins oder beide richtig sind; entgegen der deutschen umgangssprache da wird oder als "entweder oder" gedeutet (xor)
 
S

SlaterB

Gast
bei jeder Interpretation von 'oder' haut das nicht hin, oder? ;)
hier wird doch vielmehr ein 'und' benötigt
 

Anselmus

Bekanntes Mitglied
oder paßt hier wohl nicht richtig, dann müßt man die iSumme!= nochmal einzeln negieren

aber mit "und" würde es bei jeder zahl außer 1 und 4 abbrechen. ich denke er will das es tatsächlich bei 1 oder 4 abbricht
 
S

SlaterB

Gast
ja Java ist schon ein schwierige Sprache, vielleicht geht deutsch besser?

wiederhole aktion, solange i nicht 1 ist und i nicht 4 ist
=
breche bei 1 oder 4 ab
 

Yzebär

Bekanntes Mitglied
Wenn es geht verwende ich bei while-Schleifen immer folgendes Konstrukt:

Code:
while(true)
{
    // Abbruchbedingung für die Schleife
    if( iSumme == 1 || iSumme == 4 )
    {
        break; // Abbruch der Schleife
    }
    ...
}

Man kann sofort erkennen, unter welchen Bedingungen die Schleife abbricht und muß nicht raten, unter welcher Bedingung die Schleife fortgeführt wird (wie bei while(bedingung) ).
 

Wildcard

Top Contributor
Sorry das ich dir das sagen muss, aber das ist dämlich. Jeder der mehr als 2 Tage Programmiererfahrung hat versteht Schleifen und die Verwendung eines zusätzlichen if Konstrukts ist für niemanden nachvollziehbar :shock:
 

Yzebär

Bekanntes Mitglied
@Wildcard
Es mag nicht deinem Programmierstil entsprechen, aber dämlich ist deswegen noch lange nicht. Wenn du den Ausdruck des OPs besser lesen kannst, als den Ausdruck in meinem if, herzlichen Glückwunsch. Ich glaube, daß man meine Abbruchbedingung (die als solche auch sehr gut gekennzeichnet wurde) beim ersten Lesen verstehen kann, die originale Bedingung zur Fortsetzung der Schleife nicht.

Was glaubt ihr denn, wie der Compiler die Sachen übersetzt? Ich behaupte, daß im nativen Bytecode kein Unterschied zu sehen sein wird!
 

Wildcard

Top Contributor
Wie Slater schon schreibt hast du damit erfolgreich die while Schleife eliminiert.
Offensichtlich bist du es nicht gewöhnt im Team zu arbeiten, denn da sind solche Kunstgriffe überhaupt nicht gern gesehen.
Das Problem fängt schon an wenn du plötzlich merkst das du noch eine weitere Schleife um das while brauchst.
Dann musst du nämlich plötzlich Sprungmarken einführen, und dann wird's noch hässlicher.
Mit breaks spielt man nicht :noe:
 

Yzebär

Bekanntes Mitglied
Zeige mir doch mal bitte ein realistisches Beispiel, wo ich in der Anwendung meines Konstruktes Sprungmarken setzen muß.
 

Wildcard

Top Contributor
Nicht für den Programmfluss, sondern für den Benutzer.
Du wirst zugeben müssen das ein break in einer verschachtelten Schleifenstruktur kein selbsterklärendes Konstrukt ist.
 
S

SlaterB

Gast
naja, das break springt ans Ende der Schleife,
das ist nicht unübersichtlicher als die Schleifenbedingung wenn man 1 Min. mal drüber nachdenkt

aber wozu, macht nur unnötige Mühe, bringt keinen Nutzen,
Fehler sind schwerer zu erkennen weil man umdenken muss,
gerade diese Umkehrung: statt ok-Bedingung nun Abbruch-Bedingung ist eine exteme Umstellung

die Verschiebung der Bedinung in das if (hoffentlich in die Zeile direkt dahinter!) ist ein zweiter, davon unabhängiger Punkt,
ist auch ungewöhnlich und damit ungünstig
 

Yzebär

Bekanntes Mitglied
Für Erklärungen gibt es Kommentare, unkommentierten Code einer komplexen Anwendung, ist ohnehin schwer verständlich. Ich wende mein Konstrukt immer dann an, wenn der Ausdruck nach dem if einfacher zu lesen ist, als er nach dem while zu lesen wäre. Ein while(iterator.hasnext()) z.B. braucht man nicht mehr zu vereinfachen. Wenn man neben dem Schleifenabbruch noch etwas anderes machen möchte (zB in ein Logfile schreiben), kommt man um das while(true) sowieso nicht mehr herum.
 

Wildcard

Top Contributor
Code sollte immer selbsterklärend sein (Kommentare gehören natürlich trotzdem dazu)
Yzebär hat gesagt.:
Wenn man neben dem Schleifenabbruch noch etwas anderes machen möchte (zB in ein Logfile schreiben), kommt man um das while(true) sowieso nicht mehr herum.
Das macht man direkt nach der Schleife. While(true) gibt fast nur bei Threads einen Sinn.
 

Yzebär

Bekanntes Mitglied
Code kann gar nicht immer selbsterklärend sein (vor der Realität verblasst so manche Theorie). while(true) macht an vielen Stellen Sinn, du solltest dich mal in der freien Welt umsehen, z.B. wenn erst nach einer Berechnung feststeht, ob die Schleife abgebrochen werden soll und man zwischendurch noch Daten von sonstwoher holen muß (Datenbank, Datei etc.).
 
L

Leroy42a

Gast
Yzebär hat gesagt.:
Ich wende mein Konstrukt immer dann an, wenn der Ausdruck nach dem if einfacher zu lesen ist, als er nach dem while zu lesen wäre.

Und wo bitte ist ein bool-Ausdruck im while schwieriger zu lesen?

while (a || b)

ist doch einfach zu lesen:


Tue etwas solange a gilt oder b gilt.

Von mir aus schnell andersrum interpretiert.

Hör auf sobald a nicht gilt und b nicht gilt.

Also wer seinen deMorgan nicht kennt hat in der Programmierung
von Haus aus nichts verloren.
 

Yzebär

Bekanntes Mitglied
Leroy42a hat gesagt.:
Und wo bitte ist ein bool-Ausdruck im while schwieriger zu lesen?

while (a || b)

ist doch einfach zu lesen:

Ähh... hallo?! Natürlich ist a || b sehr einfach, doch man sollte nicht vergessen, daß sich hinter a und b beliebig komplizierte Ausdrücke verbergen können, nicht wahr?

Code:
while( value != 1 && value != 4 )
{
    ...
}

ist für mich schwieriger zu lesen als

Code:
while( true )
{
    if( value == 1 || value == 4 )
       break;

    ...
}

zumal die Abbruchbedingung genau so da steht, wie sie ursprünglich lautete, ohne komplett negiert zu werden. Wenn ich "fremden" Code (also den meiner Kollegen) warten muß, bin ich dankbar für jeden Ausdruck, den ich nicht erst mühsam negieren muß, auch wenn diese Schreibweise einen kleinen "Stilbruch" darstellt. Ich möchte wetten, daß der erste Codeschnipsel beim ersten flüchtigen Hinsehen häufiger fehlinterpretiert wird, als der zweite.
 
L

Leroy42a

Gast
Und warum meinst du negieren zu müssen?

Was ist an

Solange value ungleich 1 und ungleich 4...

denn schwieriger zu verstehen als

Wenn value gleich 1 oder 4 brich ab :shock:

Es sei denn du suchst immer nach der Abbruchbedingung :autsch:

In dem Fall müßten for-Schleifen ja ein Graus für dich sein,
do dort ebenfalls ein "Solange gilt: ..."-Bedingung gecodet wird.

Aber egal, ich denke es ist müßig über persönliche Vorlieben zu diskutieren.
 

Yzebär

Bekanntes Mitglied
Wie gesagt, ich mache es nur, wenn ich der Meinung bin, daß es die Lesbarkeit erhöht (diese Einschätzung ist natürlich subejktiv). Das hat nichts mit Vorliebe zu tun, denn ich schreibe gewöhnlich den Code nicht für mich selbst und kann auch nicht davon ausgehen, daß nur ich für Änderungen an diesem Code zuständig bin.
 

Ark

Top Contributor
Code:
while(true){
    //irgendetwas
    if(abbruchbedingung) break;
}
ist gleichbedeutend mit
Code:
do{
    //irgendetwas
} while(!abbruchbedingung);
Die while-Schleife wird im allgemeinen verwendet, wenn etwas ausgeführt werden soll, solange sich die Maschine in einem bestimmten Zustand befindet. Dieser Zustand kann sogar vor Eintritt in die Schleife nicht erreicht sein. Das Abbrechen mit if ist, wie eben gezeigt, einfach eine do-while-, oder besser gesagt, eine repeat-until-Schleife: Man macht irgendetwas und erst hinterher guckt man mal nach, ob der Zustand dieser Maschine überhaupt zulässig war.

Man sollte sich wohl besser mit Begriffen wie Definitionsbereich und Wertebereich auseinandersetzen. Denn diese if-Konstrukte haben starke Ähnlichkeiten mit folgendem „Programmierstil“:

Code:
public int div(int a, int b){
    int e=a/b;
    if(b==0) throw new IllegalArgumentException(
        "Wozu ist eine ArithmeticException da?");
    else return e;//wozu ist das else da?
}
Hier ist genau das gleiche Problem: Wir müssen vorher absichern, dass sich die Maschine in einem Zustand befindet, für den unsere nächste Aktion definiert ist (und nicht hinterher :roll: ).

In Java sollte man das Prüfen auf erfüllte Abbruchbedingungen umgehen und stattdessen auf erfüllte Laufbedingungen setzen. Kein einziges Konstrukt in Java möchte wissen, wann es etwas nicht tun soll, sondern wann es etwas tun soll! Jedes if, assert, while, do while usw. will wissen, ob etwas getan werden soll, und nicht, ob etwas nicht getan werden soll.

MfG
Ark
 

Yzebär

Bekanntes Mitglied
Ark hat gesagt.:
Das Abbrechen mit if ist, wie eben gezeigt, einfach eine do-while-, oder besser gesagt, eine repeat-until-Schleife
Das ist nicht ganz richtig. Denn ich kann vor UND nach dem if etwas machen. Ich kann sogar etwas machen, prüfen, machen, prüfen...

Deine Aussagen bezüglich der Methode div sind sicher nicht verkehrt, doch nehmen wir mal ein anderes Beispiel. Wir haben ein String, der als Connectionstring zur Herstellung einer Verbindung zur Datenbank benutzt wird. Wie willst vor dem Aufruf der Methode connect(String connectionstring) feststellen, ob der Connectionstring gültig ist? Du kannst prüfen, ob er null ist oder leer, aber du kannst nicht feststellen, ob er mir ermöglicht eine Verbindung zur Datenbank herzustellen.

Zwei kleine Beispiele aus der weiten quelloffenen Javawelt, die zeigen, daß while(true) durchaus sinnvoll ist:

Code:
while (true) {
    final int data = super.read();
    final char ch = (char) (data & 0xff);

    if (data == -1) {
        break;
    }
    nread++;

    if (ch == '\n') {
        break;
    }
http://www.kaffe.org/ftp/pub/kaffe/v1.0.x-production/kaffe-1.0.b3.zip
DataInputStream.java, Auszug aus der Methode: final public String readLine()

Code:
public static boolean isDescendingFrom(Component a, Component b)
  {
    while (true)
      {
        if (a == null || b == null)
          return false;
        if (a == b)
          return true;
        a = a.getParent();
      }
  }
ftp://ftp.gnu.org/gnu/classpath/classpath-0.18.tar.gz
SwingUtilities.java
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Erste Schritte While-Schleife Java Basics - Anfänger-Themen 3
M While-Schleife mit Wartezeit Java Basics - Anfänger-Themen 15
Ranger229 Endless loop in while Schleife Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
Ostkreuz While Schleife neustarten Java Basics - Anfänger-Themen 20
S Erste Schritte do-while Schleife Münzwurf Java Basics - Anfänger-Themen 1
S while Schleife Taschenrechner Java Basics - Anfänger-Themen 1
P Best Practice While loop schleife Java Basics - Anfänger-Themen 5
A Erste Schritte Aufgabe mit while Schleife Java Basics - Anfänger-Themen 11
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
G Return in While Schleife Java Basics - Anfänger-Themen 6
M Erste Schritte While Schleife / Ausgabe von buchstabe & ASCII Wert Java Basics - Anfänger-Themen 4
J do..while Schleife Java Basics - Anfänger-Themen 14
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
JavaBeginner22 Würfeln bis 6 while Schleife Java Basics - Anfänger-Themen 13
L while Schleife mit 2 Bedingung endet nicht Java Basics - Anfänger-Themen 3
D Array mit while-schleife Java Basics - Anfänger-Themen 12
B do while Schleife Java Basics - Anfänger-Themen 3
SergioCK Do while Schleife wiederholen Java Basics - Anfänger-Themen 14
Informatikf Methoden While Schleife Java Basics - Anfänger-Themen 3
M While Schleife? Java Basics - Anfänger-Themen 4
Poppigescorn Quersumme Berechnen mit einer While Schleife Java Basics - Anfänger-Themen 13
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
A Wie schaffe ich das eine while Schleife addiert danach subtrahirt? Java Basics - Anfänger-Themen 1
J for /while Schleife Java Basics - Anfänger-Themen 5
A While Schleife - buubelsort methode Java Basics - Anfänger-Themen 2
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
S Do-While-Schleife Java Basics - Anfänger-Themen 2
S While Schleife Java Basics - Anfänger-Themen 4
S Do-While Schleife Java Basics - Anfänger-Themen 6
L String in Do-While-Schleife Abbruchkriterium Java Basics - Anfänger-Themen 1
CptK Methoden While-Schleife so lange ausführen, wie Methode etwas zurückgibt Java Basics - Anfänger-Themen 2
B Verschachtelung von For-Schleife in While Schleife Java Basics - Anfänger-Themen 14
G while schleife Java Basics - Anfänger-Themen 11
G while schleife mit array Java Basics - Anfänger-Themen 12
L Scanner schließen in While-Schleife? Java Basics - Anfänger-Themen 2
G While schleife Java Basics - Anfänger-Themen 2
mor16Euro Erste Schritte Wie nennt man eine While oder For schleife die nie Ausgeführt wird Java Basics - Anfänger-Themen 5
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
B OOP While Schleife läuft Endlos durch externen aufruf Java Basics - Anfänger-Themen 2
N while Schleife wird nicht beendet, obwohl Sie hätte breaken sollen Java Basics - Anfänger-Themen 4
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
D While Schleife bei Bedarf durch Eingabe stoppen Java Basics - Anfänger-Themen 15
A Erste Schritte while-Schleife Java Basics - Anfänger-Themen 38
X While Do schleife funtioniert nicht Java Basics - Anfänger-Themen 5
J 2 "while"-Anweisungen in einer do-Schleife? Java Basics - Anfänger-Themen 4
W while Schleife und Bedingung Java Basics - Anfänger-Themen 11
T While Schleife funktioniert nicht Java Basics - Anfänger-Themen 14
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
S Try-Catch in Verwendung einer while Schleife Java Basics - Anfänger-Themen 2
P a cannot be resolved bei einer do while Schleife Java Basics - Anfänger-Themen 1
J While Schleife Java Basics - Anfänger-Themen 19
Z Return in While-Schleife Java Basics - Anfänger-Themen 7
N Methode mit While-Schleife und If-Bedingung und Array-Initialisierung Java Basics - Anfänger-Themen 4
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
helldunkel While Schleife trotz false Java Basics - Anfänger-Themen 4
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
R While-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 24
b1ck while-Schleife Java Basics - Anfänger-Themen 10
b1ck Integer initialisieren bei do-while-Schleife Java Basics - Anfänger-Themen 11
kilopack15 DoWhile-Schleife als While-Schleife darstellen Java Basics - Anfänger-Themen 9
A While-Schleife funktioniert nicht! Java Basics - Anfänger-Themen 33
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
E Alphabet mit einer while Schleife ausgeben Java Basics - Anfänger-Themen 3
T while schleife starten , beeneden und wieder Starten Java Basics - Anfänger-Themen 8
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
$ Multiplikations-Rechner mit while Schleife Java Basics - Anfänger-Themen 8
T Variablen Var aus While-Schleife abfragen -.-' Java Basics - Anfänger-Themen 9
snipesss Schlüsselworte While Schleife Java Basics - Anfänger-Themen 3
snipesss While Schleife Java Basics - Anfänger-Themen 6
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
K For Schleife in While Schleife umwandeln Java Basics - Anfänger-Themen 5
Ste3et_C0st Dynamische While/For Schleife Java Basics - Anfänger-Themen 7
L do-while-Schleife läuft doppelt, try catch fehler Java Basics - Anfänger-Themen 12
A While und For Schleife Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur do while- und while-Schleife Java Basics - Anfänger-Themen 4
C Do-While Schleife (Fehler bei der Klammerung?) Java Basics - Anfänger-Themen 8
C while-Schleife wird zuoft durchgeführt Java Basics - Anfänger-Themen 2
F Problem do while Schleife und Scanner Java Basics - Anfänger-Themen 2
F Programm bricht While Schleife nicht ab Java Basics - Anfänger-Themen 4
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
C Erste Schritte Warum ist die While Schleife so schnell? Java Basics - Anfänger-Themen 5
A was wird in der while schleife gemacht Java Basics - Anfänger-Themen 3
A Kleines Abbruch-Problem mit Do-While-Schleife Java Basics - Anfänger-Themen 4
Z Logikfehler do-while Schleife Java Basics - Anfänger-Themen 4
E While-Schleife Java Basics - Anfänger-Themen 6
D Textfield im Game ,Problem: while-Schleife Java Basics - Anfänger-Themen 1
A Probleme mit While Schleife Java Basics - Anfänger-Themen 10
M Fibonacci-Folge mit while-Schleife Java Basics - Anfänger-Themen 4
B Summe aller Zahlen von 1 bis zu dieser Zahl (ohne while oder for schleife) Java Basics - Anfänger-Themen 4
LangUndBreit Erste Schritte 100% cpu auslastung (evtl unendliche while schleife?) Java Basics - Anfänger-Themen 1
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
T while Schleife Java Basics - Anfänger-Themen 22
N While Schleife Erklärung Bitte Java Basics - Anfänger-Themen 3
F Problem mit der While schleife und dem Scanner Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben