myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Einsteigerfragen zu Datentypen und Operatoren
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Einsteigerfragen zu Datentypen und Operatoren

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Lalgeriano
myCSharp.de-Mitglied

Dabei seit: 10.08.2015
Beiträge: 21


Lalgeriano ist offline

Einsteigerfragen zu Datentypen und Operatoren

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich mal wieder :-D 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 :-D

Über Hilfe wäre ich dankbar!

Lieben Gruß
19.08.2015 13:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.220
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich werde ma versuchen deine Fragen zu beantworten.

Zitat von Lalgeriano:
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.

Zitat von Lalgeriano:
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?

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.

Zitat von =Lalgeriano:
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?

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.

Zitat von Lalgeriano:
4. 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:

C#-Code:
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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von inflames2k am 19.08.2015 14:06.

19.08.2015 14:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.976
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Lalgeriano:
Ich mal wieder :-D 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.

[..]

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?

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
19.08.2015 14:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Ezio Ezio ist männlich
myCSharp.de-Mitglied

avatar-3575.png


Dabei seit: 28.08.2014
Beiträge: 189
Entwicklungsumgebung: VS 2013


Ezio ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ezio am 19.08.2015 14:51.

19.08.2015 14:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palin Palin ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.08.2011
Beiträge: 1.090
Entwicklungsumgebung: VB.net


Palin ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
19.08.2015 16:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.018


chilic ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
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?

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.

Zitat:
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?

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.
19.08.2015 17:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lalgeriano
myCSharp.de-Mitglied

Dabei seit: 10.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Lalgeriano

Lalgeriano ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Zitat:
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 :D Ü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! :-)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lalgeriano am 20.08.2015 11:49.

20.08.2015 11:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.220
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
20.08.2015 12:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
vbprogger vbprogger ist männlich
myCSharp.de-Poweruser/ Experte

avatar-1820.gif


Dabei seit: 16.01.2006
Beiträge: 1.692
Entwicklungsumgebung: Visual Studio 2012 Prof.
Herkunft: NRW/DE


vbprogger ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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!

2. JA

4. |= 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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von vbprogger am 20.08.2015 13:46.

20.08.2015 12:02 Beiträge des Benutzers | zu Buddylist hinzufügen
Lalgeriano
myCSharp.de-Mitglied

Dabei seit: 10.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Lalgeriano

Lalgeriano ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Alles klar, danke für die etwas tiefere Erklärung :-)

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

Wenn ich folgendes schreibe:

C#-Code:
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!
20.08.2015 12:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
p!lle
myCSharp.de-Mitglied

avatar-3556.jpg


Dabei seit: 22.02.2007
Beiträge: 1.012
Entwicklungsumgebung: Visual Studio (Community) 2017


p!lle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Nimm das zweite "bool" vor feiertag weg.
20.08.2015 12:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lalgeriano
myCSharp.de-Mitglied

Dabei seit: 10.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Lalgeriano

Lalgeriano ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ah, da sollte ich eigentlich auch selber drauf kommen :-D 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?
20.08.2015 12:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
p!lle
myCSharp.de-Mitglied

avatar-3556.jpg


Dabei seit: 22.02.2007
Beiträge: 1.012
Entwicklungsumgebung: Visual Studio (Community) 2017


p!lle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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. ;)
20.08.2015 12:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.976
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von vbprogger:
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
20.08.2015 13:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.220
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von vbprogger:
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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von inflames2k am 20.08.2015 13:18.

20.08.2015 13:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
vbprogger vbprogger ist männlich
myCSharp.de-Poweruser/ Experte

avatar-1820.gif


Dabei seit: 16.01.2006
Beiträge: 1.692
Entwicklungsumgebung: Visual Studio 2012 Prof.
Herkunft: NRW/DE


vbprogger ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von inflames2k:
Zitat von vbprogger:
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.
20.08.2015 13:44 Beiträge des Benutzers | zu Buddylist hinzufügen
Lalgeriano
myCSharp.de-Mitglied

Dabei seit: 10.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Lalgeriano

Lalgeriano ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von p!lle:
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 :-D

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

C#-Code:
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ß
20.08.2015 14:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.220
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
20.08.2015 14:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.976
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
20.08.2015 14:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
OlafSt OlafSt ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.05.2011
Beiträge: 63
Entwicklungsumgebung: VS 2015 Community
Herkunft: HH


OlafSt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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

C#-Code:
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.
20.08.2015 15:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Daniel83 Daniel83 ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.02.2008
Beiträge: 171
Entwicklungsumgebung: Visual Studio 2005
Herkunft: Bielefeld Deutschland


Daniel83 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
20.08.2015 15:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lalgeriano
myCSharp.de-Mitglied

Dabei seit: 10.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Lalgeriano

Lalgeriano ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
23.08.2015 11:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.816


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@OlafSt:

Zitat:
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.
23.08.2015 12:35 Beiträge des Benutzers | zu Buddylist hinzufügen
Talon
myCSharp.de-Mitglied

Dabei seit: 22.04.2010
Beiträge: 67
Entwicklungsumgebung: VS2008


Talon ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Lalgeriano:
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 :D Über weitere Hilfe (gerne an einem eigenen Beispiel) wäre ich dankbar! :-)

Vielleicht hilft dir das weiter.
 && Operator (C# Reference) und  || Operator (C# Reference).
24.08.2015 07:56 Beiträge des Benutzers | zu Buddylist hinzufügen
Lalgeriano
myCSharp.de-Mitglied

Dabei seit: 10.08.2015
Beiträge: 21

Themenstarter Thema begonnen von Lalgeriano

Lalgeriano ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Talon:
Zitat von Lalgeriano:
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 großes Grinsen Über weitere Hilfe (gerne an einem eigenen Beispiel) wäre ich dankbar! :-)

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

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:

C#-Code:
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 großes Grinsen ) 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?
24.08.2015 10:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.220
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Lalgeriano:
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.

Zitat von Lalgeriano:
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 :D ) 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.
24.08.2015 11:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 09.12.2019 05:42