Was bedeutet ein Ausdruck wie arr[”hi there”] implizieren?

Lesezeit: 5 Minuten

Benutzer-Avatar
Sonne

Wenn a=3 und b=5, was bedeutet das?

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);

ich weiß das arr[4] meint *(arr+4) Also muss ich wissen, wie ein Ausdruck aussieht "hi there" implizieren?

EDIT – Frage in wahrscheinlich klareren Worten:

Wenn eine Zeichenfolge als Array-Index verwendet wird, welchen Wert übermittelt sie?

Warum ist die Ausgabe von oben Hello! how is this? super ?

  • fragen Sie, was Sie bekommen würden, wenn Sie a verwenden[3] und B[2] als Array-Positionen?

    Benutzer195488

    20. Juli 2011 um 19:29 Uhr

  • Ich hoffe ernsthaft, dass das nur ein “akademisches” Code-Snippet ist und nicht etwas, das tatsächlich in der Produktion verwendet wird.

    – In silico

    20. Juli 2011 um 19:31 Uhr


  • Ich weiß nicht einmal, was du mit “Hallo” meinst?

    Benutzer195488

    20. Juli 2011 um 19:31 Uhr

  • Es impliziert, Code sofort zu fliehen. Wenn dies von einem Professor stammt, bedeutet dies, dass der Professor nicht weiß, wann er ein Beispiel als schlecht markieren soll. Wenn dies aus dem Produktionscode stammt, bedeutet dies, dass Sie bei der falschen Firma angestellt sind.

    – Lee Louviere

    20. Juli 2011 um 19:40 Uhr

  • Interessant. Anscheinend wollte jemand einen konstanten String indizieren und war nicht bereit, ihn einer Variablen zuzuweisen. Auf Kosten der Verwirrung aller, die danach kamen…

    – Markieren Sie Lösegeld

    20. Juli 2011 um 19:40 Uhr

Benutzer-Avatar
Nawaz

Das bedeutet, dass printf dem entspricht:

printf("Hello! how is this? %s\n", "super");

was drucken wird:

Hello! how is this? super

Online-Demo: http://ideone.com/PVzUP

Erläuterung:

Wenn wir schreiben char s[]="nawaz; und dann s[2] bedeutet 3. Zeichen in der Zeichenfolge s. Wir können dies schriftlich ausdrücken "nawaz"[2] was auch 3. Zeichen in der Zeichenfolge bedeutet "nawaz". Wir können auch schreiben 2["nawaz"] was auch 3. Zeichen in der Zeichenfolge bedeutet. In Ihrem Code ist die printf verwendet die letzte Form, dh von der Form von 2["nawaz"]. Es ist jedoch ungewöhnlich.

So a["Ya!Hello! how is this? %s\n"] bedeutet 4. Zeichen in der Zeichenfolge (als Wert von a ist 3), und wenn Sie hinzufügen & vor dem a dann &a["Ya!Hello! how is this? %s\n"] gibt die zurück die Anschrift des 4. Zeichens in der Zeichenfolge, das heißt, in printf wird es äquivalent zu:

Hello! how is this? %s\n

Und ich hoffe, Sie können den Rest selbst interpretieren.

  • Ich bin immer noch ratlos über die “Hallo”-Frage … :\

    Benutzer195488

    20. Juli 2011 um 19:37 Uhr

  • @nawaz: Das OP hat b auf aktualisiert b = 5was Ihre Antwortausgabe ändert.

    – jwr

    20. Juli 2011 um 19:52 Uhr

  • @jwr: Ich habe meine Antwort entsprechend aktualisiert. Danke, dass du das mitgeteilt hast. 🙂

    – Nawaz

    20. Juli 2011 um 19:53 Uhr

  • @Soren: OP hat den Wert von geändert b aus 2 zu 3. Jedenfalls habe ich meine Antwort entsprechend geändert.

    – Nawaz

    20. Juli 2011 um 19:55 Uhr

  • @0A0D Ich verstehe nicht wirklich, was mit “was bedeutet ein Ausdruck wie ” gemeint war. Ich denke, es sollte so etwas wie “Wie wird der Ausdruck in diesem Zusammenhang interpretiert?” sein. "hi there" ist ein Zeichenfolgenliteral; es hat typ const char[9]. 2["hi there"] ist äquivalent zu *(2 + "hi there"); In diesem Zusammenhang zerfällt das Array zu einem Zeiger (Typ const char*) und das Hinzufügen einer Ganzzahl zu einem Zeiger verhält sich dann wie gewohnt.

    – Karl Knechtel

    20. Juli 2011 um 22:31 Uhr


Wenn arr[4] meint *(arr+4)dann 4[arr] meint *(4+arr). Da die Addition zwischen Zeigern und ganzen Zahlen kommutativ ist, sind diese identisch.

Die Antwort könnte ganz anders ausfallen, wenn Sie in C++ mit Objekten arbeiten, die überladene Operatoren haben. In diesem Fall ist Ihre Frage nicht vollständig genug.

  • Ich glaube nicht, dass das die Frage ist …

    – Sidyl

    20. Juli 2011 um 19:32 Uhr

  • @Sidyll – Ich denke, das ist die Antwort auf die Frage, die lauten sollte.

    – Bo Persson

    20. Juli 2011 um 19:39 Uhr

  • @sidyll, genau das ist die Frage. Ersetzen 4 mit a oder b und eine Glühbirne sollte klicken.

    – Markieren Sie Lösegeld

    20. Juli 2011 um 19:42 Uhr

  • @Mark ja, ich weiß, aber mit Literalen? Hm, finde ich nicht sinnvoll. Zumindest in C.

    – Sidyl

    20. Juli 2011 um 19:44 Uhr


  • @Mark Ransom: Ja, es funktioniert: ideone.com/kMbMn Beeindruckend. Und entschuldigen Sie, dass ich so dumm bin, aber je mehr ich mit C arbeite, desto weniger weiß ich.

    – Sidyl

    20. Juli 2011 um 19:52 Uhr


Benutzer-Avatar
Tomasz

Wenn a und b ganze Zahlen sind, sind diese beiden Zeilen äquivalent:

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
printf(&("Ya!Hello! how is this? %s\n"[a]), &("junk/super"[b]));  

Und das ist eine interessante Lektüre: http://www.gotw.ca/gotw/086.htm

  • Dies ist der erste Beitrag, den ich gesehen habe, der die Ausgabe in Nawaz ‘Antwort erklärt. Sehr interessant.

    – Mopsschlitten

    20. Juli 2011 um 19:42 Uhr

  • @sun ok, dann tut mir leid, ich habe deine Frage nicht verstanden. vielleicht ist die Lektüre trotzdem interessant 😉

    – Tomasz

    20. Juli 2011 um 20:04 Uhr

Benutzer-Avatar
Bo Persson

Die Art von "hi there" ist const char[9]ein Array aus 9 Zeichen.

In Anbetracht dessen können wir in dieses Array mit indizieren "hi there"[a] wenn a zwischen 0 und 8 liegt.

Und wie du gesagt hast, x[i] ist äquivalent zu *(x + i), *(i + x)und damit auch i[x]. Damit wir schreiben können "hi there"[a] wie a["hi there"] nur um alle zu verwirren.

wenn a=3 und b=5 was bedeutet das

printf(&a[“Ya!Hello! how is this? %s\n”]&b[“junk/super”]);

Ein [] operator ist in der ursprünglichen C-Definition nur eine Offset-Operation, die in Assembler übersetzt wird als

   x[y] => (addr = x + y; fetch content at addr)

Wo also x normalerweise ein Zeiger und y ein Index von diesem Zeiger ist, kümmert es den asember nicht wirklich, wenn Sie sie umschalten.

Der Code entspricht also der verständlicheren Version

   printf(&("Ya!Hello! how is this? %s\n"[a]), &("junk/super"[b]));

Oder mit eliminiertem a=3 und b=5

   printf("Hello! how is this? %s\n", "super");

1019840cookie-checkWas bedeutet ein Ausdruck wie arr[”hi there”] implizieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy