Laden...

Einsteigerfragen zu Datentypen und Operatoren

Erstellt von Lalgeriano vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.646 Views
L
Lalgeriano Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren
Einsteigerfragen zu Datentypen und Operatoren

Ich mal wieder 😄 Und wie bereits vorgewarnt komme ich gleich mal mit ein paar Fragen auf euch zu, die sich beim Lesen des Buches "Schrödinger programmiert C#" gestellt haben.

Da ich denke, dass grad die Basics wichtig sind, mag ich dies auch gar nicht lange schleifen lassen und mal direkt die Profis fragen. Natürlich habe ich bereits vorher gegoogled, mir die Microsoft-Webseite zum Thema C# angeschaut etc, aber irgendwie ist der Groschen noch nicht ganz gefallen bzw. ich ein wenig verwirrt.

Also, mal zu den, wahrscheinlich recht einfach zu beantwortenden, fragen:

  1. Im Buch steht, dass die Datentypen byte, int und long sowie deren unsigned Variante für ganze Zahlen verwendet werden. Wie sieht es denn mit dem Datentyp short aus? Mit diesem lassen sich doch ebenfalls ganze Zahlen darstellen, nur etwas größere als byte, oder?

  2. In einem Beispiel im Buch wird für eine ganze Zahl der Datentyp float anstatt int verwendet, da der Compiler dies ja automatisch konvertiert?! Sollte man dies generell vorziehen oder wirklich nur, wenn man nicht hundert prozentig weiß, ob die variable mit dem Datentyp nie eine Fließkommazahl sein wird?

  3. Oft sehe ich, dass Zahlen wie zum Beispiel 24 in einem int gespeichert werden, wobei die Zahlen ja auch in kleineren Datentypen passen würden. Sollte man heutzutage generell eher int bevorzugen, falls man nicht ausschließen kann, dass die Zahlen mal irgendwann den Wertebereich des kleineren Datentyps übersteigt?

  4. Die Vergleichsoperatoren machen mir noch ein wenig zu schaffen. Grad || und |=
    Da blicke ich grad nicht mehr ganz durch!

Generell würde ich ein Programm doch so aufbauen:

bool sonntag = true;
bool samstag = false;

bool istWochenende = sonntag || samstag

Dann würde natürlich true rauskommen, da mein sonntag ja true ist. Oder?

Wie setze ich nun den |= Operator ein? Wenn ich dies im oberen Beispiel tun würde, käme doch das selbe Ergebnis raus und dem sonntag wird true zugewiesen, was ja aber eh true wäre?

Irgendwo hängt das grad bei mir ein wenig 😄

Über Hilfe wäre ich dankbar!

Lieben Gruß

2.298 Beiträge seit 2010
vor 8 Jahren

Hallo,

ich werde ma versuchen deine Fragen zu beantworten.

  1. Im Buch steht, dass die Datentypen byte, int und long sowie deren unsigned Variante für ganze Zahlen verwendet werden. Wie sieht es denn mit dem Datentyp short aus? Mit diesem lassen sich doch ebenfalls ganze Zahlen darstellen, nur etwas größere als byte, oder?

Ein Short ist im Prinzip nichts anderes als ein Int16. Ich gehe mal davon aus, dass in dem Buch nur die Basisdatentypen aufgegriffen wurden. Denn ansonsten würde Int64 ebenfalls fehlen.

  1. In einem Beispiel im Buch wird für eine ganze Zahl der Datentyp float anstatt int verwendet, da der Compiler dies ja automatisch konvertiert?! Sollte man dies generell vorziehen oder wirklich nur, wenn man nicht hundert prozentig weiß, ob die variable mit dem Datentyp nie eine Fließkommazahl sein wird?

Ich würde einen Float nur dann verwenden, wenn ich genau weiß das der Wert irgend wann einmal Nachkommastellen haben kann. - Und selbst dann nur in Spezialfällen, da ich in der Regel Double dafür verwende.

  1. Oft sehe ich, dass Zahlen wie zum Beispiel 24 in einem int gespeichert werden, wobei die Zahlen ja auch in kleineren Datentypen passen würden. Sollte man heutzutage generell eher int bevorzugen, falls man nicht ausschließen kann, dass die Zahlen mal irgendwann den Wertebereich des kleineren Datentyps übersteigt?

Wenn es nicht für irgend eine Art von Schnittstelle wichtig ist, würde ich selbst die "1" in einem int (Int32) ablegen. Die 4 Byte die da verwendet werden, fallen heute nicht mehr ins Gewicht. Es ist nur wichtig, dass mein eben keinen Datentyp verwendet der zu klein ist für die Zahl.

  1. Die Vergleichsoperatoren machen mir noch ein wenig zu schaffen. Grad || und |=
    Da blicke ich grad nicht mehr ganz durch!

Bei |= handelt es sich keines Wegs um einen Vergleichsoperator. |= führt ieine Bitverknüpfung aus. Für einen Vergleich taugt das nicht. Das merkst du spätestens wenn du mit Integern arbeitest.

Mal ein Beispiel was passiert bei dem Operator:


var myVal = 1; // Bitwerte: 0000 0001
myVal |= 2; // myVal hat den Wert 3; Bitwerte: 0000 0011
myVal |= 4; // myVal hat den Wert 7; Bitwerte: 0000 0111
myVal |= 8; // myVal hat den Wert 15; Bitwerte: 0000 1111

Anhand der Bitwerte siehst du in dem Beispiel was der Operator macht. Falls nicht nochmal kurz detailliert:
1 hat die Bits 0000 0001; 2 hat die Bits 0000 0010, dies werden nun zu 0000 0011 verknüpft.

Meinst du eventuell den Operator != der dazu dient, ungleichheit zu prüfen? Wobei da in einem Beispiel auch true rauskommen würde, weil true nicht gleich false.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.003 Beiträge seit 2006
vor 8 Jahren

Ich mal wieder 😄 Und wie bereits vorgewarnt komme ich gleich mal mit ein paar Fragen auf euch zu, die sich beim Lesen des Buches "Schrödinger programmiert C#" gestellt haben.

[..]

  1. In einem Beispiel im Buch wird für eine ganze Zahl der Datentyp float anstatt int verwendet, da der Compiler dies ja automatisch konvertiert?! Sollte man dies generell vorziehen oder wirklich nur, wenn man nicht hundert prozentig weiß, ob die variable mit dem Datentyp nie eine Fließkommazahl sein wird?

Die nehmen ihren Buchtitel aber sehr ernst, oder? Der float-Typ als eine Art Box, in der die Zahl irgendwie gleichzeitig Fließkomma- und Ganzzahl ist, solang niemand reinschaut?

Die Datentypen gibt's schon nicht umsonst, und genauso wenig bist du ohne Grund über diese Eigenart gestolpert. Über den (Basis-)Typ einer Variablen sollte man sich nicht erst zur Laufzeit Gedanken machen. Wenn die Zahl ihrer Natur nach Kommastellen haben kann -> float, double und Konsorten. Wenn nicht -> die anderen.

Und wenn man sich wirklich über den Speicherbedarf Sorgen macht, nimmt man die kleinstmögliche und größtnötige und muss dann immer noch auf Überläufe prüfen.

Rest hat inflames2k ja schon erläutert 😃.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

189 Beiträge seit 2014
vor 8 Jahren

Hallo Lalgeriano,

ich möchte dir noch mit auf den Weg geben, das OpenBook Visual C# parallel zu lesen oder zumindest als Nachschlagwerk zu nutzen.
Da gibt es z.B. eine schöne Tabelle der einfachen Datentypen.

VG Ezio

P
1.090 Beiträge seit 2011
vor 8 Jahren

Bei Int und Double war es mal so, das das System und das Framework performanter damit gearbeiet haben.
stackoverflow:.NET Integer vs Int16?
Ob es noch so ist weiß ich ehrlich gesagt nicht.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

C
2.121 Beiträge seit 2010
vor 8 Jahren
  1. In einem Beispiel im Buch wird für eine ganze Zahl der Datentyp float anstatt int verwendet, da der Compiler dies ja automatisch konvertiert?! Sollte man dies generell vorziehen oder wirklich nur, wenn man nicht hundert prozentig weiß, ob die variable mit dem Datentyp nie eine Fließkommazahl sein wird?

Das halte ich für eine falsche Aussage. Der Compiler konvertiert nicht automatisch float nach int wenn man eine Ganzzahl hinein steckt. Wäre übel wenn er das tun würde. Zum Beispiel hat die Division bei int und float eine andere Bedeutung. Du musst daher wissen was du nutzen willst, danach wählst du den passenden Datentyp.
In C# hast du den großen Vorteil der typisierten Daten. Da passiert nicht irgendwas, rate mal obs das ist was du haben willst oder nicht. Es passiert genau das was du definierst.

  1. Oft sehe ich, dass Zahlen wie zum Beispiel 24 in einem int gespeichert werden, wobei die Zahlen ja auch in kleineren Datentypen passen würden. Sollte man heutzutage generell eher int bevorzugen, falls man nicht ausschließen kann, dass die Zahlen mal irgendwann den Wertebereich des kleineren Datentyps übersteigt?

Zusätzlich zu den bisherigen Antworten, beachte dass du bei Zuweisungen zwischen den Zahlentypen evtl. casten musst, wenn du verschiedene Typen mischst und dann Zuweisungen von int nach etwas kleinerem hast. Bevor du da anfängst zu fluchen nimm lieber gleich immer int für Ganzzahlen 😃
Außer natürlich wenn du ausdrücklich haben willst dass eine Zahl genau 1 oder 2 Byte groß ist. Sowas kann man festlegen wollen wenn man Daten mit anderen DLL austauscht oder sie in einen Datenstrom einbaut wo sie eine feste Größe haben sollen.

L
Lalgeriano Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Hallo Leute,

danke für die zahlreichen Antworten und Tips!

  1. Um kurz nochmal zur Frage eins zu kommen. Müsste das short denn nicht trotzdem gelistet sein? Ein long ist ja auch ein int64, oder? Folglich müsste doch entweder auch long fehlen oder short dort stehen, oder?

  2. Heißt das, wenn ich zum Beispiel eine ganze Zahl, nehmen wir die 25 als Beispiel, in ein Float packe, hat das System im "Hinterkopf" quasi 25.00, zeigt die Nachkommastelle dort aber nicht an, weil sie quasi bei .00 keine Bedeutung hat? Im Buch gab es dazu ein Beispiel, indem man die Schuhgröße berechnet hat. Dort wurde erst eine Variable "Fusslänge" vom Typ float angelegt, in der die ganze Zahl 24 gespeichert wurde. Dies wurde dort dann gemacht, weil die Fusslänge ja auch Nachkommastellen habe kann und nicht nur aus ganzen Zahlen besteht. Folglich sollte ich mir als vorher einfach Gednaken machen, ob dort Fliesskommazahlen entstehen können, und wenn ja, direkt einen float verwenden, auch wenn dort (erst) mal ganze Zahlen drin stehen, ja?

  3. Alles klar, da hat sich die Frage dann erledigt. Dann werde ich das int nehmen, außer ich sollte mal eine größere Zahl brauchen (dann halt long) oder wirklich ganz spezifisch was kleineres haben wollen 😃

  4. Da bin ich leider immer noch ein wenig verwirrt, habe grad aber das Buch zur Hand, dass ich hier nochmal ein paar mehr Informationen geben kann.

Es wird erst einmal gesagt, dass man mit && bzw. || Ausdrücke verknüpfen kann. Sind bei && beide Ausdrücke wahr, ist das Ergebnis ebenfalls war. Ist bei || einer der beiden Ausdrücke wahr, ist das Ergebnis ebenfalls wahr. Das verstehe ich und ist logisch.

Hat man also Beispielsweise:

bool fisch = true;
bool fleisch = false;
bool abendEssen = fisch || fleisch

-> Das Ergebnis bei abendEssen wäre also true, da fisch true ist. Soweit alles klar!

Ich zitiere: "Der Operatore |= verbindet eine ODER-Verknüpfung mit einer Zuweisung."

bool feiertag |= sonntag

"Damit enthält feiertag den Wert true, falls feiertag bereits diesen Wert hat oder sonntag den Wert true hat. Dies ist die Kurzform von: bool feiertag = feiertag | sonntag"

Irgendwie leuchtet mir dies noch nicht ganz ein. Anhand diesen Beispiels:

  1. Ich definiere für feiertag erst einmal true oder false.
  2. Das selbe tue ich für sonntag auch.
  3. Wenn eins der beiden true ist, wird das Ergebnis in feiertag gespeichert.
  4. Wenn keins der beiden wahr ist, enthält feiertag false?

Da ich die beiden Variablen oben ja aber bereits definiere, weiß ich ja schon, dass feiertag true sein wird, oder? Außerdem muss er doch nichts mehr in feiertag speichern, wenn diese Variable bereits vorher den Wert true enthält, oder?

-> Irgendwie habe ich da noch ein Problem mit, ich glaube, dass ich dort irgendwo noch etwas falsch nachvollziehe 😄 Über weitere Hilfe (gerne an einem eigenen Beispiel) wäre ich dankbar! 😃

Lieben Gruß
Lalgeriano

Und nochmal danke an Ezio für den Link zum OpenBook. Dies werde ich mir zu Herzen nehmen! 😃

2.298 Beiträge seit 2010
vor 8 Jahren

Ok, ich sehe in deinem Buch steht nicht das |= ein Vergleichsoperator ist. Sondern dort steht genau, wofür es da ist. Für die Verknüpfung der Werte.

Dass das Beispiel an den Haaren herbei gezogen ist, mag sein. Aber es zeigt zumindest die Grundlegende Verwendung des Operators.

Für einen Boolwert passiert bei der Bitverknüpfung folgendes:

true = 1
false = 0;

Verknüpfst du nun die Bitwerte false | true; erhältst du true, weil das Bit auf 1 gesetzt wird. Das trifft immer zu, wenn einer der Werte true ist. Sind alle Werte false, bleibt das Bit auf 0. Sind alle Werte true, ist das Bit 1. Da es ja in jedem Fall an war.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.696 Beiträge seit 2006
vor 8 Jahren

1. short ist nun mal in C# nicht als Begriff existent, warum das so ist? Darum! Finde dich damit ab, dass zwar long verfügbar aber short nicht!

  1. JA

  2. |= ist wie schon erklärt: Bitweise Or-Operation mit Zuseisung. Du kennst i += 2 => i = i + 2, und so ist es auch mit a |= b => a = a | b

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

L
Lalgeriano Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Alles klar, danke für die etwas tiefere Erklärung 😃

Kurz eine Frage zum Syntax bzgl. des |= Operators.

Wenn ich folgendes schreibe:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            bool feiertag = true;
            bool sonntag = false;
            bool feiertag |= sonntag;
            Console.WriteLine(feiertag);
            Console.ReadKey();
        }
    }
}

Bekomme ich Fehler. Sowohl das feiertag bereits als lokale Variable in diesem Bereich definiert ist, als auch, dass |= ein ungültiger Ausdruck ist.

Wenn ich im oberen Programmcode nun die erste Zeile entferne und dort die Variable feiertag nicht definiere, bekomme ich zwar die Meldung, dass ein Fehler beim Erstellen vorhanden ist, kann aber aus der Debug-Konsole nichts weiter auslesen.

-> Wie wäre der Syntax nun korrekt? Bzw. was mache ich konkret falsch?

Danke!

1.040 Beiträge seit 2007
vor 8 Jahren

Nimm das zweite "bool" vor feiertag weg.

L
Lalgeriano Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Ah, da sollte ich eigentlich auch selber drauf kommen 😄 Danke!

Mich verwirrt nur, wieso im Buch explizit "bool feiertag |= sonntag" geschrieben wurde, wohl nur zur Veranschaulichung?

Selbiges bei: bool feiertag = feiertag | sonntag;

Würde so ja auch zu keinem Ergebnis führen, wenn ich vorher nicht explizit feiertag und sonntag definiere. Sonst kommt ja wieder der Fehler, dass eine der beiden Variablen vorher nicht definiert wurden. Folglich wäre das bool an der Stelle ja Fehl am Platze, soll es nicht zur reinen Veranschaulichung dienen, oder?

1.040 Beiträge seit 2007
vor 8 Jahren

Ab und zu gibt es in Büchern (oder auch in Beispielen der MSDN) syntaktische Fehler.
Warum das so ist, kann man nur mutmaßen, ich vermute einfach nachträgliches Hinzufügen oder 'blindes' Programmieren. 😉

3.003 Beiträge seit 2006
vor 8 Jahren
  1. short ist nun mal in C# nicht als Begriff existent, warum das so ist? Darum! Finde dich damit ab, dass zwar long verfügbar aber short nicht!

Wie meinen?

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

2.298 Beiträge seit 2010
vor 8 Jahren
  1. short ist nun mal in C# nicht als Begriff existent, warum das so ist? Darum! Finde dich damit ab, dass zwar long verfügbar aber short nicht!

Wo nimmst du denn die Behauptung her? Natürlich gibt es das Schlüsselwort short in C#. Ist zwar nur eine andere Benennung für Int16 aber als Schlüsselwort durchaus vorhanden. Genau wie long nur ein zusätzliches Schlüsselwort für Int64 ist.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.696 Beiträge seit 2006
vor 8 Jahren
  1. short ist nun mal in C# nicht als Begriff existent, warum das so ist? Darum! Finde dich damit ab, dass zwar long verfügbar aber short nicht!

Wo nimmst du denn die Behauptung her? Natürlich gibt es das Schlüsselwort short in C#. Ist zwar nur eine andere Benennung für Int16 aber als Schlüsselwort durchaus vorhanden. Genau wie long nur ein zusätzliches Schlüsselwort für Int64 ist.

Sorry, mein Fehler.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

L
Lalgeriano Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Ab und zu gibt es in Büchern (oder auch in Beispielen der MSDN) syntaktische Fehler.
Warum das so ist, kann man nur mutmaßen, ich vermute einfach nachträgliches Hinzufügen oder 'blindes' Programmieren. 😉

Alles klar, dann kommt nun so langsam die Verständnis 😄

Der Folgende Code wäre dann für dieses Beispiel auch der einzig, syntaktisch richtige, nehme ich an:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            bool feiertag = true;
            bool sonntag = false;
            feiertag |= sonntag;   //Alternativ feiertag = feiertag | sonntag
            Console.WriteLine(feiertag);
            Console.ReadKey();
        }
    }
}

-> Wenn dem so ist, gibt es eventuell ein konkretes Beispiel, wann man eher || und wann | nutzt? inflames2k hat ja für | schon ein Beispiel genannt, mich würde eher interessieren, wann (in der Praxis) eben dieser Operator und wann eher der || Operator gebraucht wird 😃

Nochmals Danke für die Antworten und danke im Voraus! 😃

Lieben Gruß

2.298 Beiträge seit 2010
vor 8 Jahren

In der Praxis wirst du den |-Operator sehr selten brauchen. Bei uns im Unternehmen werden die meißtens nur benutzt um (enum-)Flags zusammenzufügen. In der Regel brauchst du das nicht.

Mir fallen sonst wirklich ganz wenige Anwendungsfälle für ein logisches (bitweises) oder ein. Zu beachten ist, dass dieses soweit ich mich erinnere nur für Zahlen-Typen, enums und Byte gültig ist.

In der Regel verwendet man für vergleiche aber den bedingten OR-Operator ||. Das hat den Hintergrund, dass beim bedingten OR bereits abgebrochen wird, wenn der Teil vor || true ist. Beim logisch OR werden beide Seiten ausgewertet.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.003 Beiträge seit 2006
vor 8 Jahren

In der Praxis? Du kannst jahrelang programmieren, ohne einmal eine Bitoperation zu brauchen.
In der Kryptographie sind sie ganz nützlich, zB.

Genauso lang zu programmieren, ohne eine logische Verknüpfung (&&, ||) zu nutzen, wird schon schwieriger.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

O
79 Beiträge seit 2011
vor 8 Jahren

bei stackoverlow gibts da eine schöne Erklärung:

Ursprünglich waren "&&" und "||" rein logische Operatoren, während "&" und "|" rein binäre Operatoren waren. Irgendwann hat man die Sprachen dahingehend erweitert, das die Benutzung von "&" und "|" in rein logischem Kontext zur vollständigen Auswertung des Ausdrucks führt, wärend "&&" und "||" auf "Kurzschluß-Verfahren" umgemünzt wurden.

So ist es nun absolut möglich, solche Konstrukte zu bauen:


a=null;
if ((a != null) && (a > 4)) { ... }

Ist einer der Vergleiche in einem AND-Ausdruck false, ist das gesamte Ergebnis false. Da "a != null" bereits false ist, wird "a > 4" gar nicht erst geprüft - das Ergbniss kann eh nicht mehr true werden 😉 Dies ist die "short curcuit evaluation".

Benutzt man dagegen

a=null;
if ((a != null) & (a > 4)) { ... }

und a ist tatsächlich null, dann knallts, denn der Ausdruck "a > 4" wird, obwohl das Ergebnis bereits feststeht, dennoch ausgewertet.

Das gleiche funktioniert mit dem "||" bzw. "|" ganz genau so.

Benutzt man "&" und "|" dagegen nicht in einem Logik-Kontext, dann wird das ganze als binärer Operator betrachtet. so kann man z.B. sehr einfach das Bit 4 in einem Integer setzen: i = i | (1 << 3) oder kürzer i = i | 8 oder noch kürzer i |= 8.

D
171 Beiträge seit 2008
vor 8 Jahren

Hallo,

wir arbeiten gerne mal mit Embedded Hardware und "lansamen" aber zeitkritischen Übertragungen, die war in C# visualisieren oder dort einstellungen treffen.
Im Embedded Bereich hat man gerne mal nur wenige kByte Ram. Um dort "aufwändige" Datenstrukturen halten zu können muss man schon mal Bits schubsen und wenn ich einen Rechner habe, der das rückwärts im schlaf kann, dann mache ich das Bit Schubsen natürlich auf dem PC und nicht auf dem embedded Controler.
Das gibt es damit also durchaus auch in der Praxis aber der regelfall wird das wohl eher nicht sein.

L
Lalgeriano Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Hallo Leute,

danke für eure super Hilfe! Nun ist das Verständnis endlich da. Ebenfalls danke für die Beispiele und an OlafSt für das noch ganz konkrete Beispiel bzgl. & und && bzw. | und ||

Vielen, vielen Dank dafür! 😃

Lieben Gruß und einen schönen Sonntag!

Lalgeriano

F
10.010 Beiträge seit 2004
vor 8 Jahren

@OlafSt:

Irgendwann hat man die Sprachen dahingehend erweitert, das die Benutzung von "&" und "|" in rein logischem Kontext zur vollständigen Auswertung des Ausdrucks führt, wärend "&&" und "||" auf "Kurzschluß-Verfahren" umgemünzt wurden.

Auch wenn es das selbe Ergebnis hat, ist deine Erklärung nicht wirklich richtig.

&& und || sind Logische Operatoren, & und | arithmetische ( nicht binäre ).
Und deren Verhalten ist in C ähnlichen Sprachen schon seit Anbeginn so.

Lediglich in VB.NET musste ein ORELSE/ANDELSE eingeführt werden um dieses Verhalten auch zu haben.

T
67 Beiträge seit 2010
vor 8 Jahren

Es wird erst einmal gesagt, dass man mit && bzw. || Ausdrücke verknüpfen kann. Sind bei && beide Ausdrücke wahr, ist das Ergebnis ebenfalls war. Ist bei || einer der beiden Ausdrücke wahr, ist das Ergebnis ebenfalls wahr. Das verstehe ich und ist logisch.
-> Irgendwie habe ich da noch ein Problem mit, ich glaube, dass ich dort irgendwo noch etwas falsch nachvollziehe 😄 Über weitere Hilfe (gerne an einem eigenen Beispiel) wäre ich dankbar! 😃

Vielleicht hilft dir das weiter.
&& Operator (C# Reference) und || Operator (C# Reference).

L
Lalgeriano Themenstarter:in
21 Beiträge seit 2015
vor 8 Jahren

Es wird erst einmal gesagt, dass man mit && bzw. || Ausdrücke verknüpfen kann. Sind bei && beide Ausdrücke wahr, ist das Ergebnis ebenfalls war. Ist bei || einer der beiden Ausdrücke wahr, ist das Ergebnis ebenfalls wahr. Das verstehe ich und ist logisch.
-> Irgendwie habe ich da noch ein Problem mit, ich glaube, dass ich dort irgendwo noch etwas falsch nachvollziehe 😁 Über weitere Hilfe (gerne an einem eigenen Beispiel) wäre ich dankbar! 🙂
Vielleicht hilft dir das weiter.

>
und
>
.

Danke! Auch dies werde ich mir genauer zu Gemüte führen 🙂
Laut dieser Beschreibung entspricht && aber dem &, nur das bei & beide ausgewertet werden, auch wenn das Ergebnis schon vorher feststeht?

Darüber hinaus noch eine kurze Frage die mir an dem unteren Beispiel gekommen ist:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            bool feiertag = true;
            bool sonntag = false;
            feiertag |= sonntag;   //Alternativ feiertag = feiertag | sonntag
            Console.WriteLine(feiertag);
            Console.ReadKey();
        }
    }
}

Er speichert also das Ergebnis in feiertag, wenn feiertag oder sonntag wahr ist. Soweit nun alles verstanden. Mir fehlt grad nur ein klein wenig das Verständnis (eventuell weil ich kein Konkreten Fall im Kopf habe 😁 ) wo dies nützlich ist, SOFERN feiertag in dem Beispiel eh schon true als Ausgangswert hat. Bei komplexeren Strukturen wird dies gewiss Sinn machen, da eventuell durch verschiedene Operationen das Ergebnis nicht zwingend mehr den Ausgangswert hat nehme ich an, oder?

2.298 Beiträge seit 2010
vor 8 Jahren

Laut dieser Beschreibung entspricht && aber dem &, nur das bei & beide ausgewertet werden, auch wenn das Ergebnis schon vorher feststeht?

Im Grunde stimmt das, ist aber etwas zu einfach gedacht, da man genau wissen muss wann man das logische und wann das arythemtische Und verwendet. Wie in dem weiter oben genannten Beispiel kann das nämlich ganz schnell nach hinten losgehen, wenn man das falsche verwendet. In der Praxis wird auch das arythmetische Und aus meiner Sicht nur in Ausnahmefällen verwendet.

Er speichert also das Ergebnis in feiertag, wenn feiertag oder sonntag wahr ist. Soweit nun alles verstanden. Mir fehlt grad nur ein klein wenig das Verständnis (eventuell weil ich kein Konkreten Fall im Kopf habe 😄 ) wo dies nützlich ist, SOFERN feiertag in dem Beispiel eh schon true als Ausgangswert hat. Bei komplexeren Strukturen wird dies gewiss Sinn machen, da eventuell durch verschiedene Operationen das Ergebnis nicht zwingend mehr den Ausgangswert hat nehme ich an, oder?

Beispiele haben es so an sich, etwas auf einfachste Weise darzustellen. In der Praxis werden einelne Variablen natürlich nie den Ausgangswert behalten. - Dann könnte man sich die ja fast sparen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |