C++ Operator: Unterschied zwischen "|" und "||"



  • Hallo liebe c-plusplus Community !

    Ich habe mal eine kurze Frage:

    Und zwar, ob mir jemand den Unterschied zwischen dem Operator "|" und "||" erläutern könnte.
    Ich nutze den Operator "|" in einer While-Schleife und habe als Hinweis bekommen doch lieber "||" zu nutzen.
    Wenn ich mich im Netz umschaue wird mir der Unterschied nicht sehr deutlich 😞
    Ich habe c Programmierung jetzt seit knapp einem Jahr in der Schule.
    Falls ihr mehr Infos zu der Benutzung braucht stehe ich selbstverständlich zur Verfügung.

    Ich bedanke mich im voraus bei allen, die mir bei meinem Problem weiterhelfen können.



  • f()||g()
    ruft g() nicht auf, wenn f() schon true ergab, weil unabhängig davon, was g() ergäbe, das Ergebnis des || eh nur noch true sein kann.

    ALso || hat die Tendenz, schneller zu sein.



  • Danke !

    D.h. der Operator "|" geht alle Bedingungen durch?
    Meine Schleife sieht folgendermaßen aus:

    while (werte[0]%2!=0 | werte[2] == werte[1] | werte[2]==5 )

    Wenn ich jetzt "||" nutzen würde und die erste Bedingung true sein würde, würden die anderen Bedingungen durch den Operator "||" nicht geprüft werden?



  • Sven95 schrieb:

    Danke !

    D.h. der Operator "|" geht alle Bedingungen durch?
    Meine Schleife sieht folgendermaßen aus:

    while (werte[0]%2!=0 | werte[2] == werte[1] | werte[2]==5 )

    Wenn ich jetzt "||" nutzen würde und die erste Bedingung true sein würde, würden die anderen Bedingungen durch den Operator "||" nicht geprüft werden?

    Ja. So ist es.



  • Alles klar.

    Danke dir für deine schnelle Hilfe :))



  • | macht eigentlich etwas ganz anderes, nämlich das bitweise Oder, während || logisches Oder heisst. Kann zu seltsamen Verhalten führen:

    int main()
    {
      std::cout <<  ((2 |  3)== true) << '\n'; // Gibt 0 aus
      std::cout <<  ((2 || 3)== true) << '\n'; // Gibt 1 aus
    }
    

    Deshalb 2 Regeln:
    - nie ==true oder ==false schreiben
    - Immer || verwenden, wenn man die logische Verknüpfung meint.



  • Du hast schon gelesen, dass | das "bit-wise"-Oder und || das "logical"-Oder ist.
    Das Ergebnis des bit-wise-or ist die Veroderung der beiden Operanden auf Bitebene.
    Z.B.

    b00 | b01 = b01 
    b11 | b00 = b00
    b01 | b10 = b11
    

    Das Ergebnis der logischen veroderung ist, nachdem der linke und der rechte Opernad in einen bool umgewandelt worden sind "wahr", wenn einer der beiden "wahr" ist, "falsch" sonst.



  • @volkard Was ist denn bei dir los?
    @Sven95 Das sind grundverschiedene Operatoren. Die Shortcut-Auswertung ist weder der einzige, noch der wichtigste Unterschied. || macht quasi auf logischer Ebene, was | auf binärer Ebene macht. https://de.wikipedia.org/wiki/Bitweiser_Operator



  • cooky451 schrieb:

    @volkard Was ist denn bei dir los?

    volkard hat doch alles richtig gemacht. Das Argument der Geschwindigkeit ist immer das überzeugendste. Wenn | aus irgend einem Grund schneller wäre, würde niemand || benutzen.



  • oderhüter schrieb:

    volkard hat doch alles richtig gemacht.

    Nein.

    oderhüter schrieb:

    Das Argument der Geschwindigkeit ist immer das überzeugendste.

    Eher das Argument, dass das Programm hinterher auch macht, was man will. Und jemandem, der den Unterschied zwischen | und || nicht kennt, mit Geschwindigkeit zu kommen, ist einfach nur schwachsinnig.



  • Kann ich mit Ihnen kurz Privat über mein eigentliches Problem in meinem Programm sprechen?

    Ich erkenne nicht, warum ich den Operator "||" nutzen sollte.
    Ich verwende (auch in der Schule) den Dev-C++ Compiler, und dort läuft mein Programm einwandfrei. Ich bekam die Empfehlung Microsoft Visual C++ 2010 zu nutzen, und plötzlich treten Probleme auf.



  • Der überzeugende Grund ist die Geschwindigkeit und der *wichtigste* Unterschied ist die Shortcut-Auswertung.

    cooky451 schrieb:

    Die Shortcut-Auswertung ist weder der einzige, noch der wichtigste Unterschied.

    if (vec.empty() || vec[0] == 5) // geht nur dank Shortcut
    

    Es ist schon ziemlich schwierig ein Beispiel zu konstruieren, in dem Shortcut nicht der einzige Unterschied ist (siehe meinen Beitrag, wenn man ==true weglässt, fällt mir nichts ein).

    Bei & und && ist das dagegen wichtiger. 1&2 und 1&&2 ergeben völlig andere Resultate.



  • @Sven95 Lies dir doch einfach den verlinkten Wikipedia-Artikel durch.



  • cooky451 schrieb:

    @volkard Was ist denn bei dir los?

    Hatte schon wesentlich mehr da stehen.
    Aber das war hier nicht angemessen, finde ich.



  • Bei der Erklärung versteht er aber 1. den fundamentalen Unterschied nicht, und 2. wundert er sich dann bald was denn mit & los ist.



  • volkard schrieb:

    cooky451 schrieb:

    @volkard Was ist denn bei dir los?

    Hatte schon wesentlich mehr da stehen.
    Aber das war hier nicht angemessen, finde ich.

    Ich denke, da sind alle einer Meinung, dass keine Hilfe immer noch besser als schlechte Hilfe ist.



  • Sven95 schrieb:

    Kann ich mit Ihnen kurz Privat über mein eigentliches Problem in meinem Programm sprechen?

    Ich erkenne nicht, warum ich den Operator "||" nutzen sollte.

    Weil er der richtige ist zwischen Bedingungen.
    Er nimmt zwei bool-Werte und berechnet daraus das ODER.
    Das passt genau.
    Der andere, der | ist eigentlich für was Anderes da und hier zweckentfremdet.

    Statt

    while(a%2==0 || b==5)
    

    könntest Du auch schreiben

    while((a%2==0) + (b==5))
    

    . Aber ob das angemessen ist?
    Hübsch wäre

    while(a%2==0 or b==5)
    

    Sven95 schrieb:

    Ich verwende (auch in der Schule) den Dev-C++ Compiler, und dort läuft mein Programm einwandfrei. Ich bekam die Empfehlung Microsoft Visual C++ 2010 zu nutzen, und plötzlich treten Probleme auf.

    Dann ist das Programm von Dir vermutlich fehlerhaft und hat nur zufällig mit Dev-C++ funktioniert.
    Übrigens ist Dev-C++ echt zum Heulen schlecht. MSVC ist schon viel besser, besonders für Anfänger.
    Du müßtest vermurlich das ganze Programm zeigen, wenn es nicht zu riesig ist. Und möglichst genau beschreiben, wo die Probleme liegen.



  • [Rewind] schrieb:

    Ich denke, da sind alle einer Meinung, dass keine Hilfe immer noch besser als schlechte Hilfe ist.

    Laßt mal gut sein, Kinderchen. Ich passe meine Antworten gerne an den Fragesteller an. Daran wirst Du nichts ändern.



  • volkard schrieb:

    Laßt mal gut sein, Kinderchen. Ich passe meine Antworten gerne an den Fragesteller an. Daran wirst Du nichts ändern.

    Das lasse ich gerne stehen.


Anmelden zum Antworten