1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

die Selektion-if mit & ohne die geschweifelten Klammern

    • Frage
  • freakjan
  • 29. Dezember 2005 um 13:04
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • freakjan
    Punkte
    450
    Beiträge
    64
    • 29. Dezember 2005 um 13:04
    • #1

    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 {
    .....
  • hal
    Punkte
    11.122
    Beiträge
    2.208
    • 29. Dezember 2005 um 13:12
    • #2

    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.

  • freakjan
    Punkte
    450
    Beiträge
    64
    • 29. Dezember 2005 um 13:22
    • #3

    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]
     ..........
  • hal
    Punkte
    11.122
    Beiträge
    2.208
    • 29. Dezember 2005 um 13:53
    • #4
    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)

  • freakjan
    Punkte
    450
    Beiträge
    64
    • 29. Dezember 2005 um 14:09
    • #5

    ich bedanke mich herzlich :thumb: :thumb: :thumb:
    Hier kriegt man nur tolle Antworten, also sehr empfehlenswert :D

  • freakjan
    Punkte
    450
    Beiträge
    64
    • 16. April 2006 um 21:14
    • #6

    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;
  • Paulchen
    Gast
    • 16. April 2006 um 21:57
    • #7

    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.

  • Swoncen
    Punkte
    5.331
    Beiträge
    993
    • 16. April 2006 um 22:25
    • #8

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

  • lerod
    Punkte
    1.620
    Beiträge
    315
    • 16. April 2006 um 22:48
    • #9

    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

  • freakjan
    Punkte
    450
    Beiträge
    64
    • 16. April 2006 um 22:49
    • #10

    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:

  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 16. April 2006 um 22:52
    • #11

    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.

    PHP
    <script language="JavaScript" type="text/JavaScript">
    if(foo()||bar()) {/*nix*/};
    
    
    function foo() {
    alert ('foo');
    return true;
    }
    function bar() {
    alert ('bar');
    return true;
    }
    
    
    </script>
    Alles anzeigen
  • Paulchen
    Gast
    • 16. April 2006 um 23:18
    • #12
    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)
  • freakjan
    Punkte
    450
    Beiträge
    64
    • 17. April 2006 um 00:00
    • #13

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

  • Paulchen
    Gast
    • 17. April 2006 um 00:11
    • #14
    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.

  • phudy
    Punkte
    1.087
    Beiträge
    182
    • 17. April 2006 um 01:36
    • #15

    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) {
        ...
    }
  • Swoncen
    Punkte
    5.331
    Beiträge
    993
    • 17. April 2006 um 11:27
    • #16

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

  • beefy
    Punkte
    1.683
    Beiträge
    304
    • 17. April 2006 um 14:04
    • #17
    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.

  • sauzachn
    Punkte
    3.101
    Beiträge
    606
    • 17. April 2006 um 21:34
    • #18

    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) ...

  • mdk
    Punkte
    7.120
    Beiträge
    1.390
    • 17. April 2006 um 22:42
    • #19

    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.

  • beefy
    Punkte
    1.683
    Beiträge
    304
    • 18. April 2006 um 00:10
    • #20
    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..?

  1. Datenschutzerklärung
  2. Impressum