2015-12-18 6 views
5

Warum ich einen Compiler-Fehler hier:Integer Überlauf Ausnahme

int a = 2147483647 + 10; 

und nicht hier, wenn ich die gleiche Operation bin ausführen:

int ten = 10; 
int b = 2147483647 + ten; 

ich die Verwendung von Lernen geprüft und die MSDN-Website wird nicht klar, warum die OverflowException im ersten Codeausschnitt ausgelöst wird:

Von de Fehler, ein Ausdruck, der nur konstante Werte enthält, verursacht einen Compilerfehler , wenn der Ausdruck einen Wert außerhalb des Bereichs des Zieltyps erzeugt. Wenn der Ausdruck einen oder mehrere nicht konstante Werte enthält, erkennt der Compiler den Überlauf nicht.

Es erklärt nur das Verhalten, aber nicht die Gründe für dieses Verhalten. Ich würde gerne wissen, was unter der Haube passiert.

+1

Sie erhalten einen Compilerfehler, im ersten Fall keine Ausnahme. – CodesInChaos

Antwort

9

Der Grund dafür ist, wenn Sie int a = 2147483647 + 10; Compiler kann das Ergebnis der Anweisung (a) vorhersagen und es wird wissen, dass es Überlauf verursacht, weil beide und Konstanten sind und ihre Werte werden zum Zeitpunkt der Kompilierung bekannt. Aber

wenn Sie

int ten = 10; 
int b = 2147483647 + ten; 

einigen anderen Thread (oder etwas anderes, vielleicht ein Zauberer, vielleicht eine Gefahr im Speicher ...) den Wert von ten vor int b = 2147483647 + ten; Ausführung der Anweisung ändern kann und die Überlauf kann zur Kompilierzeit nicht vorhergesagt werden.

+1

30 Sekunden gewonnen ... du bist schnell. +1 –

+0

ok, dann beschwert sich der Compiler, wenn er beide Zahlen auswertet, aber nicht, wenn er die Zahl und die Variable "zehn" auswertet. Sie sind gezwungen, checked zu verwenden, um den Überlauf in diesem Fall zu erkennen. Es ist ein bisschen Inkohärenz, oder? – Rober

+1

Wenn Sie das gleiche Verhalten (zur Laufzeit) wollen, aktivieren Sie einfach das Kontrollkästchen in den Projekteinstellungen, um es standardmäßig "aktiviert" anstatt "deaktiviert", oder den Code in einen überprüften Block "checked" {int ten = 10; int b = 2147483647 + zehn; } ', das wird auch den gleichen Fehler zur Laufzeit werfen. Sie können das Verhalten nicht zur Kompilierzeit erhalten. –