die Selektion-if mit & ohne die geschweifelten Klammern

  • Hallo :D

    wenn man bei der Selektion, nach if mehrere Anweisungen hat, werden die alle hintereinander ausgeführt, weil die Anweisungen in einem Block bzw. in den geschweifelten Klammern sind!

    Code
    ....
    if (x<1) {
      x= x+1;
      x= x-1;
      x= x+2;
      summe = summe*n;
      usw... ;
    }
    else {
    .....




    Aber die Frage ist, was wenn wir keine geschweifelten Klammern sitzen???
    Was wird denn nach der Überprüfung des Ausdrucks (wenn true) ausgeführt?? alle Anweisungen?? oder nur die erste??.. wenn nur die erste, was ist dann mit dem Rest?? oder gibt der Compiler einen Error aus??

    Code
    .....
    if (x<1) 
      x= x+1;
      x= x-1;
      x= x+2;
      summe = summe*n;
      usw... ;
    else {
    .....

    Danke :thumb:
    ciao :zwinker:

  • Die Einrückung ist da fehlleitend. Richtig isses so:

    Code
    .....
    if (x<1) 
      x= x+1;
    x= x-1;
    x= x+2;
    summe = summe*n;
    usw... ;
    else { // <-- FEHLER: else ohne if
    .....

    was du machen kannst ist, alles mit Beistrichen zu machen:

    Code
    if(x<1) x = x+1, x = x-1, x = x+2, summe = summe*n;
    else {...}

    das macht aber niemand (außer als 3. Argument beim for()).

    EDIT: Es gibt allerdings Sprachen, wo die Blockstruktur durch die Einrückung definiert wird (Python und Haskell fallen mir dazu ein), aber bei diesen gibts auch keine geschweiften Klammern.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Danke :thumb:
    Aber mein else hat doch einen if??

    Zitat von hal


    Die Einrückung ist da fehlleitend. Richtig isses so:

    Code
    .....
    if (x<1) 
      x= x+1;
    x= x-1;
    x= x+2;
    summe = summe*n;
    usw... ;
    else { // <-- FEHLER: else ohne if     [B][COLOR=red]<== warum das denn? ... da oben ist doch ein if?      [/COLOR][/B]
     ..........

    Danke :thumb:
    ciao :zwinker:

  • Zitat von freakjan

    Aber mein else hat doch einen if??

    Die richtige Syntax ist:

    if(<cond>) <block> else <block>

    Zwischen dem Block und dem else darf nichts sein! (abgesehen von Preprocessor-Befehlen, aber das ist eine andere Geschichte)

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Hallo,

    da wir schon hier einen "if-else" Thread haben, werde keine neuen öffnen :ausheck:

    Versteh ich das richtig??

    der Ausdruck (a) wird bewertet und wenn true dann if³, sonst hinter dem else unten wieter machen!
    Der else gehört zu dem if³.
    Wenn (b) true s1 ausführen, sonst s2

    PHP
    if² (a)
    if³ (b)
    s1;
    else
    s2;

    Danke :thumb:
    ciao :zwinker:

  • das ist das sogenannte Dangling Else Problem. es gibt hierbei zwei interpretationsmöglichkeiten, und zwar

    PHP
    if(a) {
        if(b) {
            s1;
        }
        else {
            s2;
        }
    }

    bzw.

    PHP
    if(a) {
        if(b) {
            s1;
        }
    }
    else {
        s2;
    }

    ich hab keine ahnung, welcher compiler diese konstruktion wie interpretiert, soviel ich weiß, kann das von compiler zu compiler variieren. eine derartige konstruktion ist daher unbedingt zu vermeiden.

  • Warum nicht

    if(a && b)
    ..
    else..

    ?

    Eine Frage hab ich aber auch dazu: Wenn ich

    if(a && b)

    habe, wird dann eigentlich überprüft ob b true ist, wenn schon a true war? Das wäre nämlich unter bestimmten Bedingungen ein Zeitverlust..

    640K ought to be enough for anybody. :eek2:

  • natürlich müssen bei einem && alle parameter überprüft werden, was hätte das ansonsten für einen sinn, wenn beim ersten parameter schon entschieden wird, nur weil es true oder false ist? ...

    deine frage bezieht sich eher auf das || .. sobald dort ein parameter true ausgewertet wird, werden die restlichen parameter nicht mehr überprüft.

    lg

  • mmhh..... :confused:

    was wenn wir mehr als 2 if-else Anweisungen haben, also mehrere in einander geschachtelt??
    dann geht das mit dem if (a && b) nicht mehr ganz Fehlerfrei :shinner:

    Danke :thumb:
    ciao :zwinker:

  • muss er ja, oder?
    du sagst nämlich: wenn (a==true und b==true) dann...
    somit muss er trotzdem fortfahren, auch wenn a true ist, denn die obige bedingung trifft ja nur zu, wenn a und b true sind.

    edit: lerods aussage über den fall mit a||b lässt sich mit einem script belegen:
    sollte nach foo auch bar ausgewertet werden, müßte die message 'bar' ausgegeben werden.

    Otto: Apes don't read philosophy. - Wanda: Yes they do, Otto, they just don't understand
    Beleidigungen sind Argumente jener, die über keine Argumente verfügen.
    «Signanz braucht keine Worte.» | «Signanz gibts nur im Traum.» 

    Das neue MTB-Projekt (PO, Wiki, Mitschriften, Ausarbeitungen, Folien, ...) ist online
    http://mtb-projekt.at

  • Zitat von Swoncen

    Eine Frage hab ich aber auch dazu: Wenn ich

    if(a && b)

    habe, wird dann eigentlich überprüft ob b true ist, wenn schon a true war? Das wäre nämlich unter bestimmten Bedingungen ein Zeitverlust..

    hier ist nur sinnvoll, b nicht auszuwerten, wenn a bereits zu false evaluiert, da die konjunktion dann nicht mehr true werden kann. in vielen programmiersprachen ist das auch so umgesetzt und ich nehme auch an, das war das, was du eigentlich gemeint hast. ist interessant in konstruktionen solchen wie z. B. folgender in php:

    PHP
    if(isset($bla) and $bla==5)
  • .... Als Java Anfänger versteh ich nur Bhf :confused:
    kann mir bitte jem. die ursprungliche Frage für einen Anfänger erklären?? ... Ihr könnt dann weiter darüber disskutieren :p

    Danke :thumb:
    ciao :zwinker:

  • Zitat von freakjan

    .... Als Java Anfänger versteh ich nur Bhf :confused:
    kann mir bitte jem. die ursprungliche Frage für einen Anfänger erklären?? ... Ihr könnt dann weiter darüber disskutieren :p

    die antwort ist kurz und bündig, dass die zugehörigkeit des else in deinem fall nicht eindeutig ist. sicher gibt es regelungen für JAVA, C, etc., die festlegen, wie ein solches else handzuhaben ist. trotzdem ist es das beste, eine solche konstruktion einfach zu vermeiden.

  • meistens wirds (IMHO) so aufgefasst...

    Code
    if(a) { 
        if(b) { 
            s1; 
        } 
        else { 
            s2; 
        } 
    }

    ... als anders rum. einem else ist immer das zuletzt vorhergende if zugeordnet. ist meiner meinung nach auch am intuitivsten (naja, solala halt....).

    Zitat von Swoncen

    Eine Frage hab ich aber auch dazu: Wenn ich
    if(a && b)
    habe, wird dann eigentlich überprüft ob b true ist, wenn schon a true war?

    wenn a schon falsch ist, wird b eigentlich (in den meisten sprachen) nicht ausgewertet -> "short-circuit-evaluation" nennt sich das dann.
    um es trotzdem zu erwingen (wenn zb a und b return-werte von 2 funktionen sind, die einen seiteneffekt (apropos "bar" message ausgeben) haben) gibt es soetwas wie & (vorausgesetzt es handelt sich wirklich um boolesche werte und nicht etwa einen integer, dann bedeutet dieser operater die bitweise-verknuepfung). selbiges fürs oder |.
    damit erspart man sich allerdings nur das setzen von zwei zwischenwerte ("flags") - was die einzige möglichkeit wäre um auch wirklich beide ausdrücke zu evaluieren.

    Code
    boolean flag1 = getSomeBoolean1();
    boolean flag2 = getSomeBoolean2();
    if(flag1 && flag2) {
        ...
    }
  • Natürlich hab ich (a || b) gemeint. Hab mich in der Eile nur vertan.

    @ phudy: Danke für die Erklärung, aber ich weiß was binäre Operatoren sind..

    640K ought to be enough for anybody. :eek2:

  • Zitat von Paulchen

    das ist das sogenannte Dangling Else Problem. (...) ich hab keine ahnung, welcher compiler diese konstruktion wie interpretiert, soviel ich weiß, kann das von compiler zu compiler variieren. eine derartige konstruktion ist daher unbedingt zu vermeiden.

    Mir ist noch nie ein Compiler/Interpreter für eine der bekannteren Sprachen untergekommen der das dangling else nicht zum nächststehenden/innersten if zurechnet. Aber im Zweifelsfall halt immer Klammern setzen.

  • Ich glaub mich zu erinnern, dass das dangling-else-Problem sogar das einzige shift-reduce-Problem ist, warum man C nicht so ohne weiteres mit LR(1) (also z.b. dem yacc) parsen kann.

    Wollt nur noch hinzufügen: Es gibt auch Sprachen (z.B. perl), wo die Blockklammern _immer_ geschrieben werden müssen.

    In Eiffel gibt es übrigens von den "and" und "or" zwei Varianten:
    a and b linke und rechte Seite wird immer ausgewertet
    a and then b wie in C++ lazy
    a or b wieder alles ausgewertet
    a or else b wie in C++ lazy

    Diese explizite Schreibweise gefällt mir etwas besser:
    if a /= Void and then a.value = 3 then .... end
    als in C++:
    if(a && a->value == 3) ...

    Dipper dipper dii dipper dii dipper dii duuu

  • juhu, endlich mal etwas wo visual basic die nase vorn hat:D

    bei

    Code
    If a = 2 Then
    If b = 4 Then
    Else
    End If
    End If


    bezieht sich das else auf b, und bei:

    Code
    If a = 2 Then
    If b = 4 Then
    End If
    Else
    End If


    auf a.

  • Zitat von mdk

    juhu, endlich mal etwas wo visual basic die nase vorn hat:D

    Also wenn du "then" durch "{" ersetzt, "else" durch "} else {" und "end if" durch "}", dann kommt folgender äquivalenter Code heraus:

    bei

    Code
    If a = 2 {
      If b = 4 {
      } else {
      }
    }


    bezieht sich das else auf b, und bei:

    Code
    If a = 2 {
      If b = 4 {
      }
    } else {
    }


    auf a.

    Also mächtiger ist VB da sicher auch nicht... Oder meintest du nur daß diese Sache einfacher auszudrücken ist..?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!