Ungültige Ausgabe im „int“-Array

Lesezeit: 2 Minuten

Benutzer-Avatar
Suraj

Ich versuche, Hinweise zu lernen, und bin gerade auf eine Situation gestoßen, die ich nicht verstehe.

int main()
{
  int num[3][2]={3,6,9,12,15,18};
  printf("%d %d",*(num+1)[1],**(num+2));
}

Nach dem, was ich gelernt habe, sollte die Ausgabe sein:

12 15

aber eigentlich ist es:

15 15

Wieso den? Bitte klären Sie, wie die Dinge hier als erstes berechnet werden, was ich denke *(num+1) Lassen Sie sich berechnen und zeigen Sie auf die 1. dh {9,12} und dann [1] sollte auf das erste Element verweisen, dh 12.

Ich verwende den GCC-Compiler.

  • Weitere Informationen zur Operatorpriorität finden Sie unter siehe diese Tabelle.

    – WhozCraig

    16. Oktober 2014 um 7:44 Uhr

  • @WhozCraig: Ja, das war wirklich hilfreich. Danke. Können Sie mir auch einige Links oder Tutorials vorschlagen, von denen ich solche und noch komplexere Zeigerarithmetik lernen könnte?

    – Suraj

    16. Oktober 2014 um 7:55 Uhr

  • @Suraj Ehrlich gesagt gibt es keinen besseren Ersatz, als einfach selbst kurze Konsolen-Apps zu entwickeln, die damit spielen. Besonders mit Bootsladungen der Ausgabe mit dem Plattform-Zeiger-Formatbezeichner %p zum printf. Es gibt eine Reihe subtiler Nuancen, die sich ehrlich gesagt nur durch praktische Erfahrung in Ihrem Kopf verfestigen können. Google ist Ihr Freund, genau wie diese Seite. Nachschlagen [c] pointer arithmetic Für ein Fülle von anständigen ähnlichen Fragen. Und ein Debugger (Einzelschritt und Betrachten von Vars) ist äußerst hilfreich.

    – WhozCraig

    16. Oktober 2014 um 8:00 Uhr


  • Neben anderen Problemen mit dem Code beginnen alle Arrays mit 0 und nicht mit 1, also einem Offset von [1] wählt tatsächlich den zweiten Eintrag im Array aus.

    – Benutzer3629249

    16. Oktober 2014 um 8:14 Uhr

  • @deviantfan Entschuldigung, mein Fehler!

    – Grijesh Chauhan

    16. Oktober 2014 um 11:29 Uhr

In Ihren Daten

int num[3][2]={3,6,9,12,15,18};

gleichwertig:

int num[3][2]={{3,6},{9,12},{15,18}};

dh

num[0][0] = 3
num[0][1] = 6
num[1][0] = 9
num[1][1] = 12
num[2][0] = 15
num[2][1] = 18

daher,

*(num+1)[1]
= *(*(num+1+1))
= num[2][0] 
=15

und,

**(num+2))
= num[2][0]
=15

Benutzer-Avatar
2501

Array-Index [] Der Operator hat eine höhere Priorität als der Dereferenzierungsoperator *.

Damit ist der Ausdruck gemeint *(num+1)[1] ist äquivalent zu *((num+1)[1])

Und wenn wir es auseinander nehmen

*(*((num+1)+1))

*(*(num+2))

*(num[2])

num[2][0]

Benutzer-Avatar
Abweichler

Sehen C Operatorrangfolge, [] vorher bearbeitet wird *

Das bedeutet

(num+1)[1]
*((num+1)+1)
*(num+2)

Zusammen mit den zusätzlichen * (in meinem Beispiel nicht geschrieben),
es wird dasselbe wie die zweite Sache.

  • Operatorpriorität und Auswertungsreihenfolge sind orthogonal.

    – Leichtigkeitsrennen im Orbit

    16. Oktober 2014 um 9:42 Uhr

  • Okay, böses Wort. Besser? 🙂

    – Abweichler

    16. Oktober 2014 um 10:08 Uhr

  • Das Erreichen dieses Ziels impliziert jedoch immer noch eine Verarbeitungsreihenfolge, die nicht mit der Art und Weise zusammenhängt, wie Token analysiert werden.

    – Leichtigkeitsrennen im Orbit

    16. Oktober 2014 um 10:09 Uhr

  • @LightnessRacesinOrbit: senkrecht? das würde bedeuten, dass sie völlig unabhängig sind, aber es gibt klare Abhängigkeiten.

    – Karoly Horvath

    12. November 2014 um 10:04 Uhr

  • @KarolyHorvath: Vielleicht ja, aber der Ausdruck “vorher verarbeiten” impliziert eine Bewertung, während Bewertung und Vorrang (dh während des Parsens) immer noch zwei verschiedene Dinge sind.

    – Leichtigkeitsrennen im Orbit

    12. November 2014 um 10:37 Uhr

1330070cookie-checkUngültige Ausgabe im „int“-Array

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

Privacy policy