Hat jeder Pascal vergessen?
1/6Ausbeuten 0.1666666...(mit welcher Genauigkeit auch immer unterstützt wird).
1 div 6 ergibt 0
Es ist fraglich, ob die C-Regel ein Fehler ist. Fast alle arithmetischen Operatoren von C, bei denen die Operanden vom gleichen Typ sind, ergeben ein Ergebnis vom gleichen Typ. Es gibt etwas zu sagen für die Konsistenz.
Da C hauptsächlich auf Code auf Systemebene abzielt, verwenden die meisten C-Programme überhaupt kein Gleitkomma. Zu einer Zeit könnte das versehentliche Hinzufügen von Gleitkomma-Code zu einem Programm, das es sonst nicht benötigte, ein ernstes Problem sein. Dies ist wahrscheinlich immer noch der Fall für kleine eingebettete Systeme - die wiederum ein Hauptziel für C sind.
In den meisten C-Programmen ist das Abschneiden der Ganzzahldivision wahrscheinlich genau das, was Sie sowieso wollen.
Wenn 1 / 6ein Gleitkomma-Ergebnis in C erhalten wird, dann:
- Es wäre eine Inkonsistenz in der Sprache.
- Der Standard müsste eine willkürliche Auswahl treffen, welcher Gleitkommatyp für das Ergebnis verwendet werden soll (
doublemag wie die natürliche Wahl erscheinen, aber Sie bevorzugen möglicherweise die zusätzliche Genauigkeit von long double).
- Die Sprache müsste noch eine Operation für die Ganzzahldivision haben; Das Durchführen einer Gleitkommaaddition und anschließendes Abschneiden wäre wahrscheinlich nicht gut genug.
C hätte getrennte Operatoren für die beiden Arten der Division bereitstellen können, aber der zweite Punkt oben würde immer noch gelten: Welcher der drei Gleitkommatypen würde für das Ergebnis verwendet? Und da es einfach genug ist, eine Gleitkommadivision zu erhalten, wenn Sie sie benötigen (verwenden Sie eine Gleitkommakonstante für einen oder beide Operanden oder wandeln Sie einen oder beide Operanden in einen Gleitkommatyp um), war dies anscheinend nicht der Fall. Ich hielt das nicht für wichtig.
In der 1974er Version des C-Handbuchs (das ist 4 Jahre vor der Veröffentlichung der ersten Ausgabe von K & R) erwähnt Ritchie nicht einmal die mögliche Verwirrung:
Der Binär / Operator zeigt die Division an. Es gelten die gleichen Typüberlegungen wie für die Multiplikation
Das heißt, wenn beide Operanden vom Typ intoder sind char, ist das Ergebnis vom Typ int.
Ja, es ist eine Quelle der Verwirrung für einige C-Programmierer, insbesondere für Anfänger - aber C ist nicht als sehr unerfahren bekannt.