none
Verbundzuweisung &= RRS feed

  • Frage

  • Hallo zusammen, 

    kann mir jemand bitte erklären, wofür das hier steht "&=".

    Warum heißt es nicht: 

    enterLong = rsi[bar] < 70;

    private bool enterLong;
     enterLong &= rsi[bar] < 70;

    Sonntag, 1. Dezember 2019 18:52

Antworten

  • Hi,
    das Ampersand (&) ist ein logisches UND und für die Anweisung "enterLong &= rsi[bar] < 70;" bedeutet das: neuer Wert "enterLong" ergibt sich aus altem Wert "enterLong" UND "rsi[bar] < 70". Das ergibt die folgende Zustandstabelle:

    neuer Wert "enterLong"   alter Wert "enterLong"   Wert rsi[bar]

    false                                  false                                 egal

    false                                  true                                  70 und größer

    true                                   true                                  kleiner 70


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Montag, 2. Dezember 2019 00:11
  • Hallo,

    &= ist eigentlich ein Bit-weiser Operator, der eher zur Bit-weisen Verbindung zweier Zahlwerte, z.B. Integer, verwendet wird. Er wird immer ausgeführt. Das heißt, wenn der rechte Operand eine Methode ist, die einen bool zurück gibt, wird diese zuerst ausgeführt.

    bool ist eigentlich nur ein 1-Bit-Wert. Aber auch hier wird der rechte Operand ausgewertet, selbst dann, wenn der linke Operand bereits false ist. 

    bool b = false; // Methode wird immer ausgeführt! b &= LangDauerndeMethodeMitBool(); b = false; // Methode wird nicht ausgeführt, da b bereits false ist. if (b && LangDauerndeMethodeMitBool()) { // b = true;. // b bleibt true. }
    else b = false; b = false; if (b) { // Performant, weil Methode auch nur ausgeführt wird, wenn b vorher true war. b = LangDauerndeMethodeMitBool(); }

    Das sollte man in Erinnerung behalten, und &= für bool-Werte nur verwenden, wenn der rechte Ausdruck nicht erst noch ausgeführt werden muss, sondern einfach nur eine bool-Variable ist. 

    Gruß

    Heiko

    Dienstag, 3. Dezember 2019 23:44
  • Der Vollständigkeit halber noch eine Variante:

    bool b = false;
    
    // Leider gibt es im C# keinen &&= Operator.
    // Der könnte folgendes verkürzen:
    // Die Methode wird hier auch nur ausgeführt, wenn b zuvor true war.
    b = b && LangDauerndeMethode();
    Mittwoch, 4. Dezember 2019 11:52

Alle Antworten

  • Hi,
    das Ampersand (&) ist ein logisches UND und für die Anweisung "enterLong &= rsi[bar] < 70;" bedeutet das: neuer Wert "enterLong" ergibt sich aus altem Wert "enterLong" UND "rsi[bar] < 70". Das ergibt die folgende Zustandstabelle:

    neuer Wert "enterLong"   alter Wert "enterLong"   Wert rsi[bar]

    false                                  false                                 egal

    false                                  true                                  70 und größer

    true                                   true                                  kleiner 70


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Montag, 2. Dezember 2019 00:11
  • Hi, 

    zum Verständnis, das heißt, ich erspar mir eine weitere if-Anweisung!

    BuyAtMarktet wir erst ausgeführt, wenn beide enterLong "true" sind?

    Ist das korrekt?

     enterLong = CrossOver(bar, emaFast, emaSlow);
     enterLong &= rsi[bar] < rsiLevel;
    …
    …
    if (enterLong)
                            
                   {
                     BuyAtMarket(bar + 1, "Entry Long");
                   }


    • Bearbeitet midatra Montag, 2. Dezember 2019 19:37
    Montag, 2. Dezember 2019 19:36
  • Hallo,

    &= ist eigentlich ein Bit-weiser Operator, der eher zur Bit-weisen Verbindung zweier Zahlwerte, z.B. Integer, verwendet wird. Er wird immer ausgeführt. Das heißt, wenn der rechte Operand eine Methode ist, die einen bool zurück gibt, wird diese zuerst ausgeführt.

    bool ist eigentlich nur ein 1-Bit-Wert. Aber auch hier wird der rechte Operand ausgewertet, selbst dann, wenn der linke Operand bereits false ist. 

    bool b = false; // Methode wird immer ausgeführt! b &= LangDauerndeMethodeMitBool(); b = false; // Methode wird nicht ausgeführt, da b bereits false ist. if (b && LangDauerndeMethodeMitBool()) { // b = true;. // b bleibt true. }
    else b = false; b = false; if (b) { // Performant, weil Methode auch nur ausgeführt wird, wenn b vorher true war. b = LangDauerndeMethodeMitBool(); }

    Das sollte man in Erinnerung behalten, und &= für bool-Werte nur verwenden, wenn der rechte Ausdruck nicht erst noch ausgeführt werden muss, sondern einfach nur eine bool-Variable ist. 

    Gruß

    Heiko

    Dienstag, 3. Dezember 2019 23:44
  • Der Vollständigkeit halber noch eine Variante:

    bool b = false;
    
    // Leider gibt es im C# keinen &&= Operator.
    // Der könnte folgendes verkürzen:
    // Die Methode wird hier auch nur ausgeführt, wenn b zuvor true war.
    b = b && LangDauerndeMethode();
    Mittwoch, 4. Dezember 2019 11:52
  • Hallo Heiko, 

    vielen Dank. 

    Grüße Midatra

    Donnerstag, 5. Dezember 2019 15:29