Kompletter anfänger hat eine Frage



  • In den Klammern nach dem if steht eine (logische) Bedingung die kann unwahr oder wahr sein

    In C wird 0 als UNWAHR oder FALSCH angesehen. alles andere ist WAHR .

    Du hast eine ODER-Verknüpfung ||.
    Die ist dann wahr, wenn einer der Operanden wahr ist. Die Auswertung erfolgt von links nach rechts.

    i = 0; j = 2;
    (i++ || j++)
    Du hast da erstmal i++. Da i 0 ist, ist das unwahr.
    Jetzt wird j++ geprüft. J ist 2, damit wahr. Also ist auch die ODER-Verknüpfung wahr.
    Spätestens jetzt werd i und j inkrementiert (kann auch schon fürher sein)
    Dann ist i = 1 und j = 3.

    Da die Bedingung vom if wahr ergeben hat, wird der if-Zweig ausgeführt. i wird inkrementiert.
    Damit hat i jetzt den Wert 2.

    Das Ganze sieht aber bei (j++ || i++) anders aus.



  • manni66 schrieb:

    Griffn schrieb:

    Ich habe vor 2-3 im imformatikkurz gelernt das es heißt wenn > dann

    Wo bei if hört wenn auf und fängt dann an?
    Woraus besteht in deinem Beispiel wenn?
    Welchen Wert hat es?

    Ich verstehe es so.
    1. Ab in der Klammer oder? also wenn ( das das und wahr ist )
    2. Wenn i++ wahr ist ODER j++ wahr ist
    3. i++ ist i um 1 erhöht also 1, also 1?



  • Griffn schrieb:

    Ich verstehe es so.
    1. Ab in der Klammer oder? also wenn ( das das und wahr ist )
    2. Wenn i++ wahr ist ODER j++ wahr ist

    ja.
    i++ ist dann wahr, wenn vor dieser anweisung i != 0 ist.

    3. i++ ist i um 1 erhöht also 1, also 1?

    nein, i++ heißt: der wert ist "i". ++ wird erst "später" (sozusagen "nach der klammer") ausgeführt.



  • Zu 3.
    i++ ist das Postinkrement.
    Der Wert von i wird für die weitere Berechnung genommen, bevor i erhöht wird.
    Also der aktuelle Wert.

    Das Preinkrement wäre ++i.



  • if (i++ || j++)
            i++;
    

    Davon abgesehen, würde keiner sowas coden.
    Eher dann so:

    if (i || j)
        {
            if (!i)
                j++;
            i++;
        }
        else
            j++;
        i++;
    

    Verhält sich wie (vermutlich) gewünscht. Sieht schlimmer aus, aber ist wenigstens deterministisch.



  • DirkB schrieb:

    Zu 3.
    i++ ist das Postinkrement.
    Der Wert von i wird für die weitere Berechnung genommen, bevor i erhöht wird.
    Also der aktuelle Wert.

    Das Preinkrement wäre ++i.

    Gut, das wusste ich nicht, aber ich verstehe immernoch nicht warum das ergebnis rauskommt

    also if ( i++ || j++ ) i++;
    heißt also wenn ich alles was ich jetzt weiß einbeziehe
    Von links nach rechts

    i++ ist unwahr also nix || j++ ist doch auch unwahr ?!?
    vieleicht blockt mir da was anderes vor undzwar

    1. i++ = postinkrement heißt also wird nach der aufgabe berechnet, aber wie wird das gehandhabt? Schließlich verstehe ich nicht wie das programm nachprüfen soll ob es schonmal erhört worden ist.
    2. Hier im buch ist die abbildung für if so :
    if -> ( BEDINGUNG ) > Anweisung oder Block ->
    Natürlich noch mit else aber das wird hier aber nicht gebraucht schätze ich.
    Nach der abbildung heißt es für mich das keine bedingung in der klammer erfühlt wurde also theroetisch nix mit den zahlen passieren sollte oder?

    Ist vieleicht viel verlangt aber kann mir das einer "wördlich" erklären nach dem motto schrittweise wie eine anweisung (1. er prüfft das 2. dann das 3. dann macht er das...)?



  • Griffn schrieb:

    i++ ist unwahr also nix || j++ ist doch auch unwahr ?!?

    Was ist denn für dich nix?
    Wie ist die Wahrheitstabelle für ODER?
    Welchen Wert hat j?

    Griffn schrieb:

    Ist vieleicht viel verlangt aber kann mir das einer "wördlich" erklären nach dem motto schrittweise wie eine anweisung (1. er prüfft das 2. dann das 3. dann macht er das...)?

    Habe ich doch schon gemacht (oke ohne 1. 2. 3., aber das kannst du dir vor jeder ZEile denken):

    DirkB schrieb:

    Du hast eine ODER-Verknüpfung ||.
    Die ist dann wahr, wenn einer der Operanden wahr ist. Die Auswertung erfolgt von links nach rechts.

    i = 0; j = 2;
    (i++ || j++)
    Du hast da erstmal i++. Da i 0 ist, ist das unwahr.
    Jetzt wird j++ geprüft. j ist 2, damit wahr. Also ist auch die ODER-Verknüpfung wahr.
    Spätestens jetzt werden i und j inkrementiert (kann auch schon früher sein)
    Dann ist i = 1 und j = 3.

    Da die Bedingung vom if wahr ergeben hat, wird der if-Zweig ausgeführt. i wird inkrementiert.
    Damit hat i jetzt den Wert 2.

    Das Ganze sieht aber bei (j++ || i++) anders aus.

    Griffn schrieb:

    Schließlich verstehe ich nicht wie das programm nachprüfen soll ob es schonmal erhört worden ist.

    Das braucht es nicht prüfen,das wird gemacht. Es gibt Prozessoren, die machen das in einem Befehl.



  • DirkB schrieb:

    Griffn schrieb:

    i++ ist unwahr also nix || j++ ist doch auch unwahr ?!?

    Was ist denn für dich nix?
    Wie ist die Wahrheitstabelle für ODER?
    Welchen Wert hat j?

    Griffn schrieb:

    Ist vieleicht viel verlangt aber kann mir das einer "wördlich" erklären nach dem motto schrittweise wie eine anweisung (1. er prüfft das 2. dann das 3. dann macht er das...)?

    Habe ich doch schon gemacht (oke ohne 1. 2. 3., aber das kannst du dir vor jeder ZEile denken):

    DirkB schrieb:

    Du hast eine ODER-Verknüpfung ||.
    Die ist dann wahr, wenn einer der Operanden wahr ist. Die Auswertung erfolgt von links nach rechts.

    i = 0; j = 2;
    (i++ || j++)
    Du hast da erstmal i++. Da i 0 ist, ist das unwahr.
    Jetzt wird j++ geprüft. j ist 2, damit wahr. Also ist auch die ODER-Verknüpfung wahr.
    Spätestens jetzt werden i und j inkrementiert (kann auch schon früher sein)
    Dann ist i = 1 und j = 3.

    Da die Bedingung vom if wahr ergeben hat, wird der if-Zweig ausgeführt. i wird inkrementiert.
    Damit hat i jetzt den Wert 2.

    Das Ganze sieht aber bei (j++ || i++) anders aus.

    Griffn schrieb:

    Schließlich verstehe ich nicht wie das programm nachprüfen soll ob es schonmal erhört worden ist.

    Das braucht es nicht prüfen,das wird gemacht. Es gibt Prozessoren, die machen das in einem Befehl.

    Nix = Unwahr
    Wenn a oder b wahr ist wird ausgeführt
    j hat den wert 2

    Warum ist j denn Wahr? es wurde doch nicht erhöht?



  • Griffn schrieb:

    Warum ist j denn Wahr? es wurde doch nicht erhöht?

    Wenn j einen Wert !=0 hat, ist j "wahr". Das ist halt in C so festgelegt.



  • Also praktisch wird überhaubt nicht gefragt ob i oder j erhöht wurden sondern ob sie 0 < also wahr sind? das würde es erklähren. Jetzt bleibt für mich nurnoch offen warum i 2 mal erhöht wurde, kann es sein das die bedingung 2 mal gecheckt wird falls etwas geregelt wurde?

    also?:

    1
    if ( i++ || j++ ) i++;
    false true
    i++ wird ausgeführt
    2. if ( i++ || j++ ) i++;
    true
    da i ja erhöht wurde und somit true ist
    i++ wird ausgeführt

    stimmt das so?



  • Griffn schrieb:

    Also praktisch wird überhaubt nicht gefragt ob i oder j erhöht wurden sondern ob sie 0 < also wahr sind? das würde es erklähren.

    Richtig, das if interessiert sich nicht für die Nebeneffekte, sondern nur für das Ergebnis der Bedingung.

    Jetzt bleibt für mich nurnoch offen warum i 2 mal erhöht wurde, kann es sein das die bedingung 2 mal gecheckt wird falls etwas geregelt wurde?

    Nein! Die Bedingung wird genau 1x geprüft.

    Lies dir doch bitte die gefühlten 100 Erklärungen nochmals durch!

    1
    if ( i++ || j++ ) i++;
    false true
    i++ wird ausgeführt

    Genau, das sind doch schon 2 i++.

    false || true ergibt true. Die Bedingung ist doch wahr!

    2. if ( i++ || j++ ) i++;
    true
    da i ja erhöht wurde und somit true ist
    i++ wird ausgeführt

    Nein!



  • Griffn schrieb:

    Jetzt bleibt für mich nurnoch offen warum i 2 mal erhöht wurde, k

    Wenn die Bedingung beim if wahr ist, wird der if-Zweig ausgeführt. Und da steht noch ein i++

    if ( i++ || j++ ) 
      { 
        i++;
      }
    

    so besser? Ist kein Unterschied zu dem Einzeiler.


Anmelden zum Antworten