Warum geht das und was macht es?
-
Warum kann der folgende Code compiliert und exekutiert werden?
int main(int argc, char** argv) { int wert=12; int x; printf("hallo\n"); x=wert["0"]; // kein Fehler !!! // x=wert[0]; // Fehler, ist ja logisch printf("%d\n",x); return (EXIT_SUCCESS); }
Bite um Antwort
Walter
-
Also ich kann das nich kompilieren, aber um deine frage zu beantworten:
Sei
ptr
ein Zeiger irgendeines Typs und zeige auf ausreichend allokierten Speicher. Die schreibweise
ptr[index]
ist das selbe wie
*(ptr + index)
(Zeigerarithmetik) und konsequenterweise (da Addition kommutativ) das selbe wie
*(index + ptr)
und folgerichtig das selbe wie
index[ptr]
Wenn man jetze noch hinzunimmt das so ein Stringliteral auch als Zeiger auf das selbe zu verwenden ist, sollte der Code klar sein.
-
wert["0"] entspricht (wert + "0") oder ("0" + wert). "0" ist ein Zeiger. Der gcc in Version 4.6.1 kompiliert es.
-
ich kanns auch nicht compilieren.
meyer.c: In function 'main':
meyer.c:5: warning: incompatible implicit declaration of built-in function 'printf'
meyer.c:9: error: 'EXIT_SUCCESS' undeclared (first use in this function)
meyer.c:9: error: (Each undeclared identifier is reported only once
meyer.c:9: error: for each function it appears in.)
-
pferdefreund schrieb:
ich kanns auch nicht compilieren.
meyer.c: In function 'main':
meyer.c:5: warning: incompatible implicit declaration of built-in function 'printf'
meyer.c:9: error: 'EXIT_SUCCESS' undeclared (first use in this function)
meyer.c:9: error: (Each undeclared identifier is reported only once
meyer.c:9: error: for each function it appears in.)int main() { int wert = 12; int x; printf("hallo\n"); x=wert["0"]; // kein Fehler !!! // x=wert[0]; // Fehler, ist ja logisch printf("%d\n", x); return 0; }
So kannst du's kompilieren.
-
@ScottZhang:
Danke für die verstänliche Erklärung.
Du solltest Lehrer werden.lg
Walter
-
Hihi, das wusste ich auch noch nicht:
char a[] = ".2."; int b[] = { 1, 42, 1 }; int i = b[0][a]; // == a[b[0]]
Der Subscript-Operator benötigt einen Pointer und ein Integer, egal was vor und was in den Klammern steht.
In dem Fall oben ist b[0] ein int und dieser wird als index für das Array a verwendet. i bekommt also den Wert '2' oder 50 (Ansi).
Nicht gerade das, was man intuitiv erwarten würde.
Fallen euch noch andere Konstruktionen ein, die kurios sind?
-
ghs999 schrieb:
Warum kann der folgende Code compiliert und exekutiert werden?
Exekutiert wird höchstens der, der solchen Code ernsthaft verwendet. Code wird ausgeführt.