Tutti hanno dimenticato Pascal?
1/6
rendimenti 0.1666666...
(a qualunque precisione sia supportata).
1 div 6
i rendimenti 0
È discutibile se la regola C sia un errore. Quasi tutti gli operatori aritmetici di C, in cui gli operandi sono dello stesso tipo, producono un risultato dello stesso tipo. C'è qualcosa da dire per coerenza.
Inoltre, poiché C è principalmente indirizzato al codice a livello di sistema, la maggior parte dei programmi C non utilizza affatto il virgola mobile. Una volta, l'aggiunta accidentale di codice in virgola mobile a un programma che altrimenti non ne aveva bisogno potrebbe essere un problema serio. Questo è probabilmente ancora il caso, per i piccoli sistemi embedded - che, ancora una volta, sono un obiettivo importante per C.
Nella maggior parte dei programmi C, troncare la divisione intera è probabilmente proprio quello che vuoi comunque.
Se ha 1 / 6
prodotto un risultato in virgola mobile in C, quindi:
- Sarebbe un'incoerenza nella lingua.
- Lo standard dovrebbe fare una scelta arbitraria di quale tipo a virgola mobile utilizzare per il risultato (
double
può sembrare la scelta naturale, ma potresti preferire la precisione extra di long double
)
- La lingua dovrebbe comunque avere un'operazione per la divisione di numeri interi; eseguire l'aggiunta in virgola mobile e quindi troncare non sarebbe probabilmente abbastanza buono.
C avrebbe potuto fornire operatori separati per i due tipi di divisione, ma si applicherebbe comunque il secondo punto precedente: quale dei tre tipi in virgola mobile sarebbe usato per il risultato? E dal momento che è abbastanza facile ottenere una divisione in virgola mobile se ne hai bisogno (usa una costante in virgola mobile per uno o entrambi gli operandi o esegui il cast di uno o entrambi gli operandi in un tipo in virgola mobile), a quanto pare non lo era considerato importante.
Nella versione del manuale C del 1974 (4 anni prima della pubblicazione della prima edizione di K&R), Ritchie non menziona nemmeno la possibile confusione:
Il binario / operatore indica la divisione. Si applicano le stesse considerazioni sul tipo della moltiplicazione
che dice che se entrambi gli operandi sono di tipo int
o char
, il risultato è di tipo int
.
Sì, è fonte di confusione per alcuni programmatori C, in particolare i principianti, ma C non è noto per essere molto adatto ai principianti.