1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • 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
  • freakjan
    7
    freakjan
    Mitglied
    Punkte
    450
    Beiträge
    64
    • 29. Dezember 2005 um 13:04
    • #1

    Hallo :grinning_squinting_face:

    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:

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    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.

    [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!

  • freakjan
    7
    freakjan
    Mitglied
    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]
     ..........

    Danke :thumb:
    ciao :zwinker:

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    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)

    [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!

  • freakjan
    7
    freakjan
    Mitglied
    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 :grinning_squinting_face:

    Danke :thumb:
    ciao :zwinker:

  • freakjan
    7
    freakjan
    Mitglied
    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;

    Danke :thumb:
    ciao :zwinker:

  • Paulchen
    1
    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
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    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..

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

  • lerod
    13
    lerod
    Mitglied
    Reaktionen
    5
    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 :tired_face: .. sobald dort ein parameter true ausgewertet wird, werden die restlichen parameter nicht mehr überprüft.

    lg

  • freakjan
    7
    freakjan
    Mitglied
    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:

    Danke :thumb:
    ciao :zwinker:

  • Wings-of-Glory
    28
    Wings-of-Glory
    Mitglied
    Reaktionen
    105
    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

    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

  • Paulchen
    1
    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
    7
    freakjan
    Mitglied
    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

    Danke :thumb:
    ciao :zwinker:

  • Paulchen
    1
    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
    10
    phudy
    Mitglied
    Reaktionen
    12
    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
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 17. April 2006 um 11:27
    • #16

    Natürlich hab ich (a :tired_face: 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:

  • beefy
    13
    beefy
    Mitglied
    Reaktionen
    18
    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
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    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) ...

    Dipper dipper dii dipper dii dipper dii duuu

  • mdk
    26
    mdk
    Emeritus
    Reaktionen
    130
    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
    13
    beefy
    Mitglied
    Reaktionen
    18
    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..?

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung