Tutti hanno dimenticato Pascal?
1/6
produce 0.1666666...
(a qualsiasi precisione è supportata).
1 div 6
produce 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 mirato al codice a livello di sistema, la maggior parte dei programmi C non usa affatto il floating-point. Un tempo, aggiungere accidentalmente un codice in virgola mobile a un programma che altrimenti non avrebbe avuto 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 di interi è probabilmente solo quello che vuoi comunque.
Se 1 / 6
ha prodotto un risultato a virgola mobile in C, quindi:
- Sarebbe un'incongruenza nella lingua.
- Lo standard dovrebbe fare una scelta arbitraria di tipo quale a virgola mobile da utilizzare per il risultato (
double
può sembrare la scelta naturale, ma potresti preferire la precisione extra di long double
)
- La lingua ancora deve avere un'operazione per la divisione di interi; eseguire l'aggiunta a virgola mobile e quindi troncare probabilmente non sarebbe sufficiente.
C potrebbe aver fornito operatori separati per i due tipi di divisione, ma il secondo punto sopra sarebbe ancora valido: quale dei tre tipi a virgola mobile verrebbe utilizzato per il risultato? E poiché è abbastanza facile ottenere una divisione in virgola mobile se ne hai bisogno (usa una costante a virgola mobile per uno o entrambi gli operandi, o lancia uno o entrambi gli operandi su un tipo a virgola mobile), apparentemente non era t considerato importante.
Nella versione del 1974 del manuale C (che è 4 anni prima della pubblicazione della prima edizione di K & R), Ritchie non menziona nemmeno l'eventuale confusione:
The binary / operator indicates division. The same type considerations as for multiplication apply
che dice che se entrambi gli operandi sono di tipo int
o char
, il risultato è di tipo int
.
Sì, è una fonte di confusione per alcuni programmatori C, specialmente per i principianti, ma C non è noto per essere molto amichevole ai novizi.