signed index bei array

devDevil

Erfahrenes Mitglied
Also,

im allgemeinen gilt ja, dass
C++:
ptr_array[index]
// und
*(ptr_array + index)
das selbe bewirken. Wir gehhen jetzt einfach mal vom idealfall aus, das keiner der Operatoren überladen worden ist.

Dann müsste ja folglich auch gelten:
C++:
ptr_array[-index] 
// und
*(ptr_array - index)

oder hab ich da was falsch? :D

Aber ist nicht der operator[] als ehm folgendes definiert:
C++:
T operator[](const std::size_t index)
? ich hab es jetzt leider nicht ganz im Kopf und keinen Compiler da aber weiß einer genaueres und steht das im Std.?

Nja wäre ganz gut zu wissen beim Operatorüberladen ;) Und normal wird den meisten beigebracht das der Index nie negativ sein soll .... aber wie's oben steht wäre ja folgendes definiert:
C++:
char* ptr_array(new char[32]);
char* ptr_it(ptr_array + 5);
ptr_it[-5] = 0;
std::cout << ptr_array << std::endl;
delete [] ptr_array;
 
Der operator "[...]" gibt es ja bereits in C, deswegen kann es so nicht difiniert sein:
Code:
"T operator[](const std::size_t index)"
Es gibt ja kein std::size_t ; da es die std so noch nicht in C gab. Man wird dort bestimmt einen C-Datentyp finden, anscheinen ist es "int" (signed int)

Auf dem ersten Blick gibt es keinen Grund Negative Indexe zu benutzen, denn warum möchte man auf dem Speicher vor dem ersten Element zugreifen?

Es gibt natürlich Berreiche in dennen man mit negativen Indexen arbeiten könnte, ich denke auch das C das vorsieht, um einfach die Wahl beim Benutzer zu lassen. Da es aber so selten vorkommt, würde ich mir wirklich Gedanken machen ob es wirklich sein muss und wenn ja die Stelle gut zu kommentieren.

mfg
SGSSGene
 
Erstmal danke für die erste Antwort ;)

Der operator "[...]" gibt es ja bereits in C, deswegen kann es so nicht difiniert sein:
Blub. Es gab unter C schon struct (ohne c-tor), jetzt kann man in C++ einen nutzen ;)

Es gibt ja kein std::size_t ; da es die std so noch nicht in C gab. Man wird dort bestimmt einen C-Datentyp finden, anscheinen ist es "int" (signed int)
[korintenkack]Es gibt nur der std. (entweder der std-Namensraum o. der Std. (Standard))[/korintenkack]
A oui es gab aber den Datentyp size_t bzw. wird dieser zumindest bei den in den C++-Std. übernommenen C-Headern eingesetzt ;) (<cstddef> sollte aufklären).
Allgemein ist die Meinung, dass es ein unsigned-Wert wäre der von 0 bis size_array - 1 definiert ist. Es ist nur die Frage ob es in diesem Spezialfall nicht auch definiert ist ;) Zumindest sollte es wenn man die regeln der Zeigerarithmetik verwendet ;)

Auf dem ersten Blick gibt es keinen Grund Negative Indexe zu benutzen, denn warum möchte man auf dem Speicher vor dem ersten Element zugreifen?

Es gibt natürlich Berreiche in dennen man mit negativen Indexen arbeiten könnte, ich denke auch das C das vorsieht, um einfach die Wahl beim Benutzer zu lassen. Da es aber so selten vorkommt, würde ich mir wirklich Gedanken machen ob es wirklich sein muss und wenn ja die Stelle gut zu kommentieren.
Man spart einen Token ;)

Also wäre geil wenn's einer im Standard nachlesen könnte :)
 
Allgemein ist die Meinung, dass es ein unsigned-Wert wäre der von 0 bis size_array - 1 definiert ist. Es ist nur die Frage ob es in diesem Spezialfall nicht auch definiert ist ;) Zumindest sollte es wenn man die regeln der Zeigerarithmetik verwendet ;)
Zumindest nach dem C99-Standard ist E1[E2] identisch zu (*((E1) + (E2))), wobei E1 und E2 passende Ausdrücke sind. Ersetzt man also E1 und E2 durch konkrete Ausdrücke, dann ist die eine Form erlaubt genau dann wenn die andere erlaubt ist. Beispielsweise sind identisch:
C:
arr[42];
42[arr];
(arr+42)[0];
(arr+43)[-1];
-1[arr+43];
Insbesondere stellt es also kein Problem dar, wenn der Index negativ ist. Ich nehme an, dass es bei C++ ähnlich sein wird.

Grüße,
Matthias
 
Ahhja das is doch mal ne konkrete aussage :) Danke schonmal :)

wenn's noch einer für C++ kontrolliert wäre perfekt aber zumindest
C++:
arr[42];42[arr];
gilt meines Wissens nach auch in C++ :)

Daaaanke :) Frohe Weihnachten :)
 
Zurück