c99/c++03
garantisce che &a+1 > &a
è sempre vero?"& a + 1> & a" causa un comportamento non definito
per esempio, c'è una (c-like) std::copy
, e
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
fa questo lavoro da sempre?
c99/c++03
garantisce che &a+1 > &a
è sempre vero?"& a + 1> & a" causa un comportamento non definito
per esempio, c'è una (c-like) std::copy
, e
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
fa questo lavoro da sempre?
Sì, C99 ha particolare formulazione a dire che quando si lavora con indirizzi, un dato oggetto a
agirà come un array di 1 articolo, in modo che &a+1
è valido (§6.5.6/7):
Per gli scopi di questi operatori, un puntatore a un oggetto che non è un elemento di un array si comporta come un puntatore al primo elemento di un array di lunghezza uno con il tipo dell'oggetto come tipo di elemento.
Sebbene il numero di sezione sia diverso (§6.3.6), C90 fornisce lo stesso requisito.
C++ ha lo stesso requisito in §5.7/4 (stesso numero di sezione in C++ 03 e C++ 11).
In C++, è possibile confrontare gli indirizzi di oggetti arbitrari (dello stesso tipo) utilizzando std::less
, anche se l'operatore <
integrato non produce risultati significativi (ad esempio, due oggetti che non fanno parte della stessa matrice) (§20.8.5/7):
per modelli
greater
,less
,greater_equal
eless_equal
, specializzazioni per qualsiasi tipo puntatore cedere un ordine totale, anche se gli operatori predefiniti <,>, < =, > = non farlo.
Si noti inoltre che anche se è possibile formare questi indirizzi, e possibile confrontare l'indirizzo di un oggetto, si non può dereference questi puntatori (beh, il compilatore probabilmente non si fermerà se si prova, ma il risultato sarà un comportamento indefinito).
Sì, ciò è garantito in C++ (non so su C). Lo specifico è che una variabile di tipo T è equivalente a un array di un singolo elemento dello stesso tipo e si può sempre ottenere un puntatore oltre la fine di un array.
se ha lo stesso prinicipe dell'oggetto array devi menzionare nella risposta quel parametro di deferencing del puntatore '& a + 1' è vietato – MOHAMED
@MOHAMED: beh, l'OP non lo dereferenzia, quindi non è molto rilevante per la risposta :) – jalf
So solo di fargli più attenzione quando si usa un comportamento del genere :-) – MOHAMED
può essere lo stesso di http://stackoverflow.com/questions/16233868/pointer-comparisons-with-one-past-the-last-element-of-an-array-object – MOHAMED
Sì, anche se la risposta @ MOHAMED è un riferimento per parlare di un array, è lo stesso principio per un oggetto semplice. –
@ MOHAMED, no non è lo stesso. Non c'è dubbio per il caso di un array, ma per una variabile non array deve esserci un testo speciale. – AProgrammer