Autor Beitrag
GamerIII
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 02.12.12 02:27 
Hallo! :welcome:

habe schon länger gesucht bin aber nicht fündig geworden.
Und zwar will ich einen If-Befehl machen bei dem eine INT Variable mit mindestens einer anderen übereinstimmt.
Habe dafür Or | genommen aber wie ich es auch versuche es will einfach nicht was mache ich falsch?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        private void btnControl_Click(object sender, EventArgs e)
        {
            if (Zeile == 1)
            {
                if (Farbe2 | Farbe3 | Farbe4 == Feld1)
                {
                   Label1.BackColor = Color.Red;
                }
            }
        }



Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am So 02.12.2012 um 10:43
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 02.12.12 04:06 
Du kannst mit dem OR-Operator | nur für komplette Vergleiche eine OR-Berechnung durchführen lassen.
Es werden also die Ergebnisse von mehreren Vergleichen aneinander gehängt und wenn min. eines davon true ist, ist das Gesamt-Ergebnis ebenfalls true.

Bei dir würde das dann so aussehen:

ausblenden C#-Quelltext
1:
2:
3:
4:
if (Farbe2 == Feld1 | Farbe3 == Feld1 | Farbe4 == Feld1)
{
    /* ... */
}

Für diesen Beitrag haben gedankt: GamerIII
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 02.12.12 11:47 
Hallo ihr beiden,

für Vergleiche sollte aber das logische Oder ||, anstatt das binäre Oder | verwendet werden.
ausblenden C#-Quelltext
1:
2:
3:
4:
if (Farbe2 == Feld1 || Farbe3 == Feld1 || Farbe4 == Feld1)
{
    /* ... */
}

Stichworte: Short-Circuit Evaluation (bzw. auf deutsch Kurzschlussauswertung) sowie C# Operatorpräzedenzen.

Für diesen Beitrag haben gedankt: GamerIII
GamerIII Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 02.12.12 16:51 
Danke :)
es geht jetzt alles :)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 02.12.12 17:17 
Wenns mehr als 3 Werte werden und damit der Vergleich potentiell unleserlich kann man sich mal kurz mit einer Liste und den entsprechenden LINQ Methoden behelfen.

ausblenden C#-Quelltext
1:
2:
3:
4:
if ((new[] { Farbe2, Farbe3, Farbe4 }).Contains(Farbe4))
{
    //...
}

Für diesen Beitrag haben gedankt: Christoph1972
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 02.12.12 17:18 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Wenns mehr als 3 Werte werden und damit der Vergleich potentiell unleserlich kann man sich mal kurz mit einer Liste und den entsprechenden LINQ Methoden behelfen.

ausblenden C#-Quelltext
1:
2:
3:
4:
if ((new[] { Farbe2, Farbe3, Farbe4 }).Contains(Farbe1))
{
    //...
}
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 02.12.12 17:45 
Ralf, da hat sich dein Beitrag wohl selber zitiert ^^



Zum binären und logischen Oder:

Stimmt, aber gab es da nicht auch die Regel, dass beim binären Oder nur so lange verglichen wird, bis es true ergibt und folgende Vergleiche danach ignoriert werden?
Irgendwo hab ich das mal gelesen und immer, wenn ich es versucht hab, hat es nicht geklappt :D
Wäre nämlich ganz sinnvoll, dann kann man die Überprüfung, ob ein Objekt instanziiert ist, in der selben if-Abfrage lassen und muss es nicht so schreiben:

ausblenden C#-Quelltext
1:
2:
3:
if (person != null)
    if (person.Alter >= 18)
        { /* Do something */ }
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 02.12.12 17:54 
Zitat:
Ralf, da hat sich dein Beitrag wohl selber zitiert ^^


Such den Unterschied ;) Ich werde das mit dem Bearbeiten von Beiträgen nochmal üben.

Zitat:
Wäre nämlich ganz sinnvoll, dann kann man die Überprüfung, ob ein Objekt instanziiert ist, in der selben if-Abfrage lassen und muss es nicht so schreiben:


Musst du auch nicht. Die logischen Operatoren benutzen die Kurzschlussauswertung (Klingt in deutsch irgendwie bescheiden)
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 02.12.12 18:54 
Also wenn es da einen Unterschied gibt, finde ich ihn nicht. :gruebel:



Also kann ich theoretisch einfach so schreiben:

ausblenden C#-Quelltext
1:
2:
if (person != null && person.Alter >= 18)
        { /* Do something */ }


Gut, das ist jetzt kein OR, aber auch hier hab ich das gleiche gelesen, dass bei && alles verglichen wird, egal ob davor schon eines false war. Bei einem einzelnen &, wenn es irgendwo false ergibt, wird dann abgebrochen und nicht weiter geprüft, allerdings hat das bei mir nie funktioniert, immer der gleiche Fehler, wenn person nicht instanziiert ist.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 02.12.12 19:07 
Nicht nur theoretisch sondern auch ganz praktisch. Wenn das bei dir nicht geht solltest du uns mal ein kompilierbares Beispiel zeigen das das falsche Verhalten zeigt und knallt.

Das folgende knallt definitiv nicht.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
class Person { public int Alter { get; set; } }
    
class Program
{
    static void Main(string[] args)
    {
        Person p = null;

        if (p != null && p.Alter >= 18)
        {/*nop*/}
        else
            Console.Write("funzt");
    }
}
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 02.12.12 20:39 
Hallo Palladin700,

ich glaube, du hast jetzt die beiden Operatorarten (logisch und binär) verwechselt.
Und nur bei den logischen Operatoren macht die Kurzschlußauswertung (short-cicuit evaluation) auch Sinn. Bei den binären Operatoren wäre es ziemlich blöd, wenn das Ergebnis plötzlich einige Bits verschlucken würde.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 02.12.12 22:05 
Naja, ich meine eigentlich genau das, was Ralf Jansen in seinem Beispiel gezeigt hat.

Ich probiere bei Zeiten mal rum und wenn ich den Fehler wieder bekomme, dann poste ich den Code hier. ^^
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 02.12.12 23:14 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Wenns mehr als 3 Werte werden und damit der Vergleich potentiell unleserlich kann man sich mal kurz mit einer Liste und den entsprechenden LINQ Methoden behelfen.

ausblenden C#-Quelltext
1:
2:
3:
4:
if ((new[] { Farbe2, Farbe3, Farbe4 }).Contains(Farbe4))
{
    //...
}


Gute Idee, gefällt mir sehr gut!

_________________
Gruß
Christoph