C++ Programming Language 3rd edition przez Stroustrup mówi, żeCzy porównanie wskaźników jest niezdefiniowane lub nieokreślone w C++?
odejmowanie wskaźników jest zdefiniowany tylko wtedy, gdy oba wskaźniki wskazują na elementami tej samej tablicy (choć język ma szybki sposób zapewniając, że jest walizka). Odejmując jeden wskaźnik od drugiego, wynikiem jest liczba elementów tablicy między dwoma wskaźnikami (liczba całkowita). Można dodać liczbę całkowitą do wskaźnika lub odjąć liczbę całkowitą od wskaźnika; w obu przypadkach wynikiem jest wartość wskaźnika. Jeśli ta wartość nie wskazuje na element tej samej tablicy co oryginalny wskaźnik lub poza nią, wynikiem użycia tej wartości jest niezdefiniowana wartość .
Na przykład:
void f()
{
int v1 [10];
int v2 [10];
int i1 = &v1[5] - &v1[3]; // i1 = 2
int i2 = &v1[5] - &v2[3]; // result undefined
}
czytałem o unspecified behavior na Wikipedia. Mówi, że w C i C++ porównanie wskaźników do obiektów jest ściśle określone, jeśli wskaźniki wskazują na elementy tego samego obiektu lub elementy tej samej tablicy.
Przykład:
int main(void)
{
int a = 0;
int b = 0;
return &a < &b; /* unspecified behavior in C++, undefined in C */
}
Tak, jestem zdezorientowany. Który jest prawidłowy? Wikipedia czy książka Stroustrupa? Co mówi o tym standard C++?
Popraw mnie Jeśli coś nie rozumiem.
Nie widzę 2 fragmentów jako sprzeczne. Czy możesz wyjaśnić swoje zamieszanie? – Amit
Stroustrup odnosi się do wskaźnika * odejmowanie * (zwanego także wskaźnikiem * różnicowanie *), a przykład pokazuje obliczenie różnicy. Artykuł, który cytujesz z Wiki, odnosi się do wskaźnika logicznego * porównanie *. – WhozCraig