Czy wszyscy zapomnieli o Pascalu?
1/6
daje 0.1666666...
(z dowolną obsługiwaną precyzją).
1 div 6
daje 0
Jest dyskusyjne, czy reguła C jest błędem. Prawie wszystkie operatory arytmetyczne C, w których operandy są tego samego typu, dają wynik tego samego typu. Można powiedzieć coś o spójności.
Ponadto, ponieważ C jest głównie ukierunkowany na kod na poziomie systemu, większość programów C wcale nie używa zmiennoprzecinkowych. Pewnego razu przypadkowe dodanie kodu zmiennoprzecinkowego do programu, który inaczej nie potrzebowałby, może być poważnym problemem. Prawdopodobnie nadal tak jest w przypadku małych systemów wbudowanych - które znów są głównym celem dla C.
W większości programów typu C skrócenie podziału liczb całkowitych jest prawdopodobnie tym, czego chcesz.
Jeśli 1 / 6
uzyskano wynik zmiennoprzecinkowy w C, to:
- Byłaby to niespójność w języku.
- Norma musiałaby dokonać arbitralnego wyboru, którego typu zmiennoprzecinkowego użyć w wyniku (
double
może to wydawać się naturalnym wyborem, ale możesz preferować dodatkową precyzję long double
)
- Język musiałby jeszcze mieć operację dzielenia liczb całkowitych; wykonanie dodawania zmiennoprzecinkowego, a następnie obcięcie prawdopodobnie nie byłoby wystarczająco dobre.
C mógł zapewnić osobne operatory dla dwóch rodzajów podziału, ale drugi punkt powyżej nadal miałby zastosowanie: który z trzech typów zmiennoprzecinkowych byłby zastosowany do wyniku? A ponieważ łatwo jest uzyskać podział zmiennoprzecinkowy, jeśli go potrzebujesz (użyj stałej zmiennoprzecinkowej dla jednego lub obu operandów lub rzutuj jeden lub oba operandy na typ zmiennoprzecinkowy), najwyraźniej nie było uważałem to za ważne.
W wersji podręcznika C z 1974 r. (Czyli 4 lata przed publikacją pierwszego wydania K&R) Ritchie nawet nie wspomina o możliwym zamieszaniu:
Binarny / operator wskazuje podział. Obowiązują te same uwagi co do mnożenia
co mówi, że jeśli oba operandy są typu int
lub char
, wynikiem jest typ int
.
Tak, jest to źródłem zamieszania dla niektórych programistów C, szczególnie początkujących - ale C nie jest znane z tego, że jest bardzo przyjazne początkującym.