Programm in C #:
short a, b;
a = 10;
b = 10;
a = a + b; // Error : Cannot implicitly convert type 'int' to 'short'.
// we can also write this code by using Arithmetic Assignment Operator as given below
a += b; // But this is running successfully, why?
Console.Write(a);
a += b
ist das gleiche wiea = (short)(a+b)
Antworten:
Hier gibt es zwei Fragen. Das erste ist "Warum ist kurz plus kurzes Ergebnis in int?"
Angenommen, kurz plus kurz war kurz und sehen, was passiert:
short[] prices = { 10000, 15000, 11000 }; short average = (prices[0] + prices[1] + prices[2]) / 3;
Und der Durchschnitt liegt natürlich bei -9845, wenn diese Berechnung in kurzen Abständen durchgeführt wird. Die Summe ist größer als der größtmögliche Short, daher wird sie negativ und Sie teilen die negative Zahl.
In einer Welt, in der sich ganzzahlige Arithmetik umgibt, ist es viel sinnvoller, alle Berechnungen in int durchzuführen, einem Typ, der wahrscheinlich genug Reichweite hat, damit typische Berechnungen nicht überlaufen.
Die zweite Frage lautet:
Die Frage hat eine falsche Prämisse; Die dritte Zeile oben ist falsch. Die C # -Spezifikation lautet in Abschnitt 7.17.2
Der Compiler fügt die Besetzung in Ihrem Namen ein. Die richtige Begründung lautet:
Wenn die Besetzung nicht für Sie eingefügt würde, wäre es unmöglich, die zusammengesetzte Zuweisung für viele Typen zu verwenden.
quelle
short
mitint
allem gut funktionieren, aber wenn wir größere Zahlen setzen (zu Summe macht größer als 2 ^ 31) wird es int Überlauf verursachen. Meine Frage ist warumshort + short = int
(und fürbyte
) undint + int = int
(nicht lange zum Beispiel).Nun, der
+=
Operator sagt, dass Sie den Wert vona
mit einem Kurzschluss erhöhen werden , während er=
sagt , dass Sie den Wert mit dem Ergebnis einer Operation überschreiben werden. Die Operationa + b
ergibt ein int, ohne zu wissen, dass dies anders möglich ist, und Sie versuchen, dieses int einem Kurzschluss zuzuweisen.quelle
+=
nur eine Abkürzung!=
Operator einen neuen Wert zuweist (in diesem Fall vom falschen Typ), aber der+=
verwendet eine andere Implementierung (dh er fügt hinzu, wie wir es erwarten).a+=b
= esa=a+b
sei denn, der Operator + = ist überladen, und es scheint, dass es für den Typshort
ist und es kein+
für gibtshort
,shortA + shortB
erweitert und wird(int)shortA + (int)shortB
.Sie müssen verwenden:
a = (short)(a + b);
Ich stelle mir vor, dass der Unterschied zwischen dem Verhalten der Zuweisung und der Hinzufügungszuweisung etwas damit zu tun hat (von msdn).
x+=y is equivalent to x = x + y except that x is only evaluated once. The meaning of the + operator is dependent on the types of x and y (addition for numeric operands, concatenation for string operands, and so forth).
Es ist jedoch etwas vage, so dass mabye jemand mit einem tieferen Verständnis kommentieren kann.
quelle
Dies geschieht, weil int der kleinste vorzeichenbehaftete Typ ist, für den
+
definiert ist. Alles, was kleiner ist, wird zuerst zu int befördert. Der+=
Operator wird in Bezug auf definiert+
, jedoch mit einer Sonderfallregel für die Behandlung von Ergebnissen, die nicht zum Ziel passen.quelle
Dies liegt daran, dass + = als überladene Funktion implementiert ist (eine davon ist eine kurze Funktion, und der Compiler wählt die spezifischste Überladung aus). Für den Ausdruck (a + b) erweitert der Compiler das Ergebnis vor dem Zuweisen standardmäßig auf ein int.
quelle