2011-12-23 13 views
6

Ho notato alcune modifiche alla sezione 5.6 per C++ 11. (Sto guardando la bozza standard C++ N3242, datata 2011-02-28.) Il nuovo standard (bozza) include la frase:Divisione intera in C++ 11

"Per gli operandi integrali l'operatore/restituisce il quoziente algebrico con qualsiasi parte frazionaria scartata ;"

Questa dichiarazione non è in 5,6 dello standard 03 (ISO-IEC-14882-2003), ma non penso che questo sia un cambiamento, vero? Questo è il modo in cui C e C++ ha funzionato per anni, a meno che non abbia perso la testa (cosa che potrebbe essere comunque accaduta).

risposta

9

Non stai diventando matto.

Una nota a 5.6/4 detto:

[C++03 footnote 74]: Secondo lavorare corso verso la revisione di ISO C, l'algoritmo preferito per divisione intera segue le regole definite nello standard ISO Fortran, ISO/IEC 1539 : 1991, in cui il quoziente è sempre arrotondato verso zero.

In C++ 11 questo comportamento è richiesto esplicitamente anziché essere "preferito"; la modifica viene elencato nella sezione compatibilità:

[C++11: C.2.2]:
Cambio: Specifica arrotondamento dei risultati degli interi / e %
Rationale: aumentare la portabilità, compatibilità C99.
Effetto sulla funzione originale: valido codice C++ 2003 che utilizza divisione intera arrotonda il risultato verso 0 o verso l'infinito negativo, che la presente norma internazionale arrotonda sempre il risultato verso 0.

1

Quasi. In C++ 03 il segno del resto per % (in cui sono stati specificati entrambi i termini) non è stato specificato, in quanto tale arrotondamento potrebbe andare anche da zero in determinate situazioni. Confrontare con il C++ 03 nota:

Secondo lavori in corso verso la revisione della norma ISO C, il preferito algoritmo per la divisione intera segue le regole definite dallo standard ISO Fortran , ISO/IEC 1539: 1991 , in cui il quoziente è sempre arrotondato a zero.

In pratica, tuttavia, questo quasi mai ha fatto alcuna differenza.

+0

Questo renderà un grande diverso nel mio codice. Questo significa che anche il segno del risultato di '%' è definito ora? – ThomasMcLeod

+1

@ThomasMcLeod: Sì, l'intera cosa '/'/'%' è ora definita per comportarsi allo stesso modo ovunque. Sei sicuro che faccia la differenza nel tuo codice? La tua implementazione è una delle poche che non sta già troncando? – PlasmaHH

+1

Esistono almeno due modi per interpretare un operatore modulo. Il modo più comune è semplicemente il resto della divisione. In questo caso, il segno del risultato è uguale al segno del quoziente. Ad es., '-5% -4 == 1 && -5% 4 == -1'. Un altro modo è il modo algebrico, in cui l'operatore mod restituisce la classe congruence dell'operando.In questo caso, 'a% m == b' se e solo se' m' divide '(b - a)' ed è definito dove 'm' è positivo. Qui. 'b' è un non negativo strettamente inferiore a' m', e quindi '-5% 4 == 3'. – ThomasMcLeod