2016-09-28 5 views
3

Absolute Anfänger Programmierer und fragte mich, ob Sie mir helfen könnten, einige Ergebnisse und Begriffe zu verstehen. Ich versuche, der Programmlogik zu folgen und bestimmte Werte auszuarbeiten. Der folgende Fall ist ein Beispiel, um diese Konzepte zu verstehen.Understanding Doppel-und Ganzzahlen

#include <stdio.h> 
void main() 
{ 
    int inum = 11; 
    double dnum = 2.56; 

    double dec_result; 
    int int_result; 

    dec_result = inum/4 + (3.0 * inum)/5; 
    printf("value in dec_result is %.2f\n", dec_result); 

    dec_result = (double) inum/4 + (3 * inum)/5; 
    printf("value in dec_result is %.2f\n", dec_result); 

    int_result = (int) dnum * 10 + 1; 
    printf("value in int_result is %d\n", int_result); 

    int_result = (int) (dnum * 10 + 1); 
    printf("value in int_result is %d\n", int_result); 

} 

Ich kenne die Ergebnisse, wie ich es durch Visual Basic ausgeführt habe. Woran ich zu kämpfen habe, ist, wie es funktioniert.

Meine Arbeiten:
inum und dnum ich sind davon ausgehen, Namen für Werte 'und austauschbar mit x oder y sagen verwendet werden könnten. Gleiches mit int_result und dec_result.

Erst dec_result ist 8,60

dec_result = inum/4 + (3.0 * inum)/5; 
     11 (an integer)/4 + (3.0 * 11)/5 
     11 (an integer)/4 + (33.0)/5 

Dann bin ich ein wenig verloren ... 2.75 + 6.6?

Da inum eine ganze Zahl ist, wird der Wert abgeschnitten, wenn er als Bruch geschrieben wird. Aber wie in den Klammern verbleibenden inum wird zuerst multipliziert, dann wird es eine Dezimalstelle Nummer?

Es wird als Dezimalstellen angezeigt, wie vom Platzhalter angegeben und vom Datentyp double angegeben.

Zweite dec_result ist 8,75

dec_result = (double) inum/4 + (3 * inum)/5; 
     = as double is a cast operator you change inum from int to double, so therefore: 

     = (double) inum/4 + (33)/5; 
Then = inum/4 becomes 2.75 + 33/5 

Warum das 33/5 Bit 6 werden? Es wird als Dezimalstellen angezeigt, wie vom Platzhalter angegeben und vom Datentyp double angegeben.

int_result = (int) dnum * 10 + 1; 
     = cast operator alters dnum a double to integer so 2.56 becomes 2 

     = 2 * 10 + 1 
     = 20 + 1 
     = 21 

sollte eine ganze Zahl, wie vor der Klammer angegeben und auch %d Platzhalter ist der Wert, Zahl ohne Dezimalpunkt bereitzustellen.

int_result = (int) (dnum * 10 + 1); 

Ich habe: = (int) (2,56 * 10 + 1) = (int) (25,6 + 1) = (int) (26,6) = 26

weil der Wert sollte eine Ganzzahl sein, wie vor der Klammer angegeben und auch %d Platzhalter bedeutet, den Wert als Zahl ohne Dezimalpunkt bereitzustellen.

Ist meine Logik korrekt?

Antwort

3

Der C-Compiler wird Integer-Arithmetik nur dann ausführen, wenn beide Operanden Ganzzahlen (Integer/Integer, Integer + Integer usw.) sind, ansonsten Gleitkommaarithmetik (Double/Integer, Double + Integer usw.)

erstes Ergebnis:

11 (an integer)/4 + (33.0)/5 

der erste Teil (11/4) mit ganzzahliger Arithmetik berechnet wird, so ist die Antwort 2 der zweite Teil (33,0/5) mit Gleitkommaarithmetik berechnet, so dass die Die Antwort ist 6,6 und die Summe ist 8.6

zweites Ergebnis:

(double) inum/4 + (33)/5; 

"(double) inum/4" berechnet Gleitkommaarithmetik verwendet wird, so ist die Antwort 2.75. "33/5" wird unter Verwendung von Integer-Arithmetik berechnet wird, so ist die Antwort 6, und die Summe ist 8,75

In der folgenden:

int_result = (int) dnum * 10 + 1; 

Die Variable dnum ist erster Guss auf eine ganze Zahl, so integer Arithmetik verwendet wird: 2 * 10 + 1 == 21

Und schließlich:

int_result = (int) (dnum * 10 + 1); 

In diesem Fall wird "dnum * 10 + 1" zuerst berechnet wird, die schwimmenden p durchgeführt wird unter Verwendung von Arithmetik: 2.56 * 10 + 1 == 26.6. Dann wird die gegossene - (int) - kürzt 26.

2

zu geben, wenn ein arithmetischer Operator zwei Integer-Argumente gegeben wird, ist das Ergebnis ein integers, so any fraction is discarded. So 11/4 2.75`. Wenn Sie eine Ganzzahl mit einem Gleitkomma kombinieren, wird die Ganzzahl zuerst in Gleitkommazahl konvertiert und ein Gleitkommaergebnis wird zurückgegeben.

Als Ergebnis:

dec_result = inum/4 + (3.0 * inum)/5; 
      = 11 /4 + (3.0 * 11) /5 
      = 11 /4 + (3.0 * 11.0)/5 
      =  2 + 33.0 /5 
      =  2 +   6.6 
      =   8.6 
+0

Danke beide, ich war wirklich kämpfen, um die Logik zu verstehen, aber ich denke, es jetzt haben! – Newtoprogram