2016-09-16 2 views
-5

I den folgenden Code in Turbo C kompilierten CompilerUnexpected Ausgabe von C++ Programm

void main() 
{ 
    int i =400*400/400; 

    if(i==400) 
    cout<<"Filibusters"; 
    else 
    cout<<"Sea ghirkins"; 
} 

I den Wert von erwarteten 'i' und damit zu sein, sollte der Ausgang Verzögerungspolitiken sein. Die Ausgabe, die ich bekam, ist jedoch Sea Ghirkins. Wie ist das möglich?

+2

Es sollte "int main" für einen Start sein –

+4

Ausdruck 'i' und sehen, ob es Ihren Erwartungen entspricht. –

+0

Was gibt 'sizeof (int)' zurück? – rainer

Antwort

5

Du überquell Ihre int Typ: das Verhalten auf, das zu tun ist undefined.

Der Bereich von int kann so klein wie -32767 bis +32767 sein. Überprüfen Sie den Wert sizeof int. Wenn es 2 ist, kann es 400 * 400 nicht darstellen. Sie können auch die Werte von INT_MAX und INT_MIN überprüfen.

Verwenden Sie stattdessen eine long, die mindestens 32 Bit haben muss. Und vielleicht gönnen Sie sich dieses Wochenende einen neuen Compiler?

+0

Die Frage wurde ursprünglich in Turbo gestellt, und wer nicht über C++ 14 weiß. Ich wollte nur die Ausgabe in Turbo wissen. –

+1

Wie kam es in den großen Googly Mooglies zu C++ 14? Dies ist seit jeher Gesetz. 400 * 400 entspricht wahrscheinlich 28928 (0x7100) aufgrund von 16-Bit-Überlauf. 28928/400 = 72. – user4581301

+0

@ user4581301 Wenn die Größe von Integer 4 Bytes ist, dann würde es wie erwartet laufen, die Erwähnung von C++ 14 bedeutet nur, dass die Frage speziell in Turbo kompiliert wurde! –

3

Blick auf Betreiber associativity: * und / sind linksassoziativ, das bedeutet, die Formel in dieser Reihenfolge berechnet: (400*400)/400

400*400=160000. Computerarithmetik ist endlich. Sie verwenden einen 16-Bit-Compiler, wobei int in 16 Bits passt und nur Werte aus dem Bereich -32768 ... 32767 (why -32768?) Enthalten kann. 160000 passt offensichtlich nicht in diesen Bereich und wird getrimmt (integer overflow tritt auf). Dann teilen Sie den getrimmten Wert um 400 und erhalten etwas unerwartetes. Compiler der Vergangenheit waren recht einfach, also würde ich erwarten, dass etwas wie 72 in i gespeichert wird.

Die oben bedeutet, dass Sie entweder einen größeren Integer-Typen verwenden können - long die in der Lage ist 160000 zu speichern oder assiciativity manuell ändern parenthesses mit: 400*(400/400).

+1

"Sie verwenden 16-Bit-Compiler" nicht unbedingt: Ein 128-Bit-Compiler kann immer noch einen 16-Bit-Int haben. Auch das untere Limit von -32768 gilt nur für das 2er Komplement int. Abgesehen davon ist diese Antwort süß. – Bathsheba