Autor |
Beitrag |
GamerIII
Hält's aus hier
Beiträge: 8
|
Verfasst: So 02.12.12 02:27
Hallo!
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?
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 Christian S.: Topic aus WinForms verschoben am So 02.12.2012 um 10:43
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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:
C#-Quelltext 1: 2: 3: 4:
| if (Farbe2 == Feld1 | Farbe3 == Feld1 | Farbe4 == Feld1) { } |
Für diesen Beitrag haben gedankt: GamerIII
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 02.12.12 11:47
Hallo ihr beiden,
für Vergleiche sollte aber das logische Oder ||, anstatt das binäre Oder | verwendet werden.
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
Hält's aus hier
Beiträge: 8
|
Verfasst: So 02.12.12 16:51
Danke
es geht jetzt alles
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
C#-Quelltext 1: 2: 3: 4:
| if ((new[] { Farbe2, Farbe3, Farbe4 }).Contains(Farbe4)) { } |
Für diesen Beitrag haben gedankt: Christoph1972
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 02.12.12 17:18
Ralf Jansen hat folgendes geschrieben : | 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.
C#-Quelltext 1: 2: 3: 4:
| if ((new[] { Farbe2, Farbe3, Farbe4 }).Contains(Farbe1)) { } | |
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
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:
C#-Quelltext 1: 2: 3:
| if (person != null) if (person.Alter >= 18) { } |
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: So 02.12.12 18:54
Also wenn es da einen Unterschied gibt, finde ich ihn nicht.
Also kann ich theoretisch einfach so schreiben:
C#-Quelltext 1: 2:
| if (person != null && person.Alter >= 18) { } |
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
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
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) {} else Console.Write("funzt"); } } |
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: So 02.12.12 23:14
_________________ Gruß
Christoph
|
|