Priorität von Operatoren
-
moin!
ich behandel gerade pointerarithmetik und muss verzweifelt feststellen, dass ich bei der priorität von operatoren unterschiedliche angaben finde.
folgendes beispiel (mit der annahme das ++ höher ist als *):
int array[] = {47, 11}; int *pointer = array; printf("%d \n", ++*pointer);
das ergebnis ist meines erachtens 11, da ich die prio auch deutlich mit klammern setzen kann. also: *(++pointer)
wie gesagt... das mit der annahme, dass ++ höher ist als *.
laut compiler ist es aber 48also auf die suche gemacht:
laut meinem skript haben beide die gleiche prio. würde also heißen "von rechts nach links.
würde bedeuten: ++(*pointer) und wäre 48.hier eine seite die ebenfalls meint, beide hätte die gleiche prio: http://www.c4learn.com/c-programming/meaning-of-ptr-in-pointer/
wikipedia (jaaa is keine fachliteratur
) und mein buch( C/C++ Kompendium von Markt+Technik) sagen aber das ++ höher als * ist und somit 11 rauskommen müsste.
ich will jetzt meinem compiler nicht widersprechen
allerdings vertraue ich auch auf mein 1400 seiten C/C++ konmpendium
was ist denn nun wahr?
gleiche prio und von rechts nach links oder ++ höher als *?wie immer besten dank!
norben
-
Die Priorität ist bei ++*p vollkommen egal, es gibt keine andere Möglichkeit das zu interpretieren als ++(*p).
-
Norben schrieb:
allerdings vertraue ich auch auf mein 1400 seiten C/C++ konmpendium
Leider auch so ein Machwerk, das anscheinend (den Fragen der Schüler nach) mehr Geschirr zerdeppert, als es den Schüler weiterbringt.
Wie Bashar schrieb, ++*pointer ist eindeutig.
Kannst versuchen, verschieden zu klammern.
++(pointer)
(++)pointer//geht ja gar nicht
aber Dein
*++pointer
ist doch ganz was anderes. Seit wann darf man denn beim Umklammern die Reihenfolge vertauschen? Nee, darf man gar nicht.Über die Klammern musst Du erst nachdenken bei
*p++
Das könnte
(*p)++
ider
*(p++)
sein und da muss man dann erst nachschauen, welcher Operator in der Rangfolge vorher steht, also stärker bindet.
-
Norben schrieb:
wikipedia (jaaa is keine fachliteratur
) und mein buch( C/C++ Kompendium von Markt+Technik) sagen aber das ++ höher als * ist und somit 11 rauskommen müsste.
Du verwechselst vermutlich den binären Operator * (Multiplikation) und den unären prefix Operator * (Dereferenzierung).
Würde mich nämlich sehr wundern wenn das in einem Buch - selbst wenn es nicht so toll sein sollte - falsch drinnen steht. Ist ja einfach genug - Liste ausm Standard abtippen und fertig.++ und unäres * sind beides prefix Operatoren und haben beide die gleiche Priorität. Und wie volkard schon geschrieben hat: es geht ja gar nicht anders rum.
-
hustbaer schrieb:
Würde mich nämlich sehr wundern wenn das in einem Buch - selbst wenn es nicht so toll sein sollte - falsch drinnen steht. Ist ja einfach genug - Liste ausm Standard abtippen und fertig.
Trivia: Solch eine Liste gibt es im Standard gar nicht. Der Rang der Operatoren muss erst aus der dort beschriebenen Syntax hergeleitet werden. Da steht dann beispielsweise, dass der Additionsoperator eine "multiplicative-expression" als Argument nimmt. Guckt man bei der Multiplikation (welche dann gleich als Namensgeber für einen ganzen Haufen von Operatoren gleicher Priorität steht), so nimmt diese eine "cast-expression", und so weiter. Daraus kann man sich dann konstruieren, dass ein Cast eine höhere Prioritat hat als Multiplikation, welche eine höhere Priorität hat als Addition, usw.
Der faule Buchautor macht das natürlich nicht selber (ich bezweifle von einigen, dass sie den Standard überhaupt je angesehen haben), sondern schreibt die fertig zusammen gestellte Liste aus den Compilerdokumentationen, Wikipedia oder anderen Büchern ab.
-
volkard schrieb:
Norben schrieb:
allerdings vertraue ich auch auf mein 1400 seiten C/C++ konmpendium
Leider auch so ein Machwerk, das anscheinend (den Fragen der Schüler nach) mehr Geschirr zerdeppert, als es den Schüler weiterbringt.
student bitte
hustbaer schrieb:
Du verwechselst vermutlich den binären Operator * (Multiplikation) und den unären prefix Operator * (Dereferenzierung).
die annahme ist natürlich da. es steht allerdings dereferenzierung dahinter.
allerdings muss ich zugeben, dass ein kleiner fehler meinerseits auftauchte.
um es zu korrigieren. im c/c++ kompendium ist entsprechend der prio absteigend aufgeteilt:
++ (post)
++ (präfix) auf einer höhe mit * dereferenzierung.++ post is als höher als *
nur in meinem skript bleibt es lediglich falsch. dort wird nicht zwischen prä und post unterschieden und ++ auf eine prio mit * gesetzt.