In-/Dekrementierungen in Bedingungen

Hallo,

ich habe eine Frage zur Postfixnotation von In- und Dekrementierungsoperatoren in Bedingungen, z.B. While-Schleifen. Das folgende Programm

#include 
#define BUFSIZE 4096

void spiegeln(char \*string)
{
 char \*reverse=string;
 while(\*reverse++)
 {
 printf("A");
 printf("%i",\*reverse);
 printf("B");
 }

 printf("\n%c\n",\*reverse);
 printf("Z");
 while(\*reverse-- != \*string)
 {
 printf("A");
 printf("%c",\*reverse);
 printf("B");
 }
 printf("\n");
}

int main()
{
 char string[BUFSIZE]="123456";
 string[3]=0;
 spiegeln(string);
 return 0;
}

gibt unter Linux folgendes aus:
A50BA51BA0B
5
ZABA3BA2BA1B
Ich kann mir das nur so erklären, daß die In-/Dekrementierungen in Postfixschreibweise nach der Überprüfung der Bedingung, aber vor Durchlaufen des Anweisungsblocks ausgeführt werden, egal, ob die Bedingung zutrifft oder nicht. Zeigt *reverse also nach der ersten While-Schleife auf die erste Stelle außerhalb des reservierten Platzes, wenn 4095 + NUL darin wären? Zeigt also *reverse nach der zweiten While-Schleife auf jeden Fall auf das Speicherfeld unmittelbar vor Beginn (!) des Strings? Ist das nicht höchst gefährlich?

Gruß
Markus

Hallo Markus

ich habe eine Frage zur Postfixnotation von In- und
Dekrementierungsoperatoren in Bedingungen, z.B.
While-Schleifen. Das folgende Programm

char *reverse=string;
while(*reverse++)
{

}

gibt unter Linux folgendes aus:
A50BA51BA0B
5
ZABA3BA2BA1B
Ich kann mir das nur so erklären, daß die
In-/Dekrementierungen in Postfixschreibweise nach der
Überprüfung der Bedingung, aber vor Durchlaufen des
Anweisungsblocks ausgeführt werden, egal, ob die Bedingung
zutrifft oder nicht. Zeigt *reverse also nach der ersten
While-Schleife auf die erste Stelle außerhalb des reservierten
Platzes, wenn 4095 + NUL darin wären? Zeigt also *reverse nach
der zweiten While-Schleife auf jeden Fall auf das Speicherfeld
unmittelbar vor Beginn (!) des Strings? Ist das nicht höchst
gefährlich?

Was heisst gefährlich? Das ist doch das, was
Du ihm sagst, dass er es machen soll :wink:

Wenn dort eine In/Dekrementierung steht, dann
führt er diese auch aus, das Resultat wird als
Schleifenbedingung verwendet (prefix), bei
postfix, hat er dann das Resultat in der Schleife
(oder eben nach der Schleife, wenn diese nicht
mehr ausgeführt wird).

Ich hab mal angepasst:

 void spiegeln(char \*string)
{
 char \*reverse=string;
 
 while( \*reverse ) 
 printf("A%cB", \*reverse++);

 printf("\n[%c]\nZ", \*reverse);

 while( reverse \> string ) 
 printf("A%cB", \*--reverse);

 printf("\n");
}

Grüße

CMБ

Hallo Semjon,

Was heisst gefährlich? Das ist doch das, was
Du ihm sagst, dass er es machen soll :wink:

Ja, Dein Vorschlag die Operatoren in den Anweisungsblock reinzunehmen ist wohl vorzuziehen… es ist halt nur weit verbreitet das nicht so zu machen. M.a.W. mein Beispiel ist vorsichtig gesagt schlechter Stil und realistisch ein Sicherheitsrisiko.

Mit bestem Gruß
Markus

Hallo Markus,

Was heisst gefährlich? Das ist doch das, was
Du ihm sagst, dass er es machen soll :wink:

Ja, Dein Vorschlag die Operatoren in den Anweisungsblock
reinzunehmen ist wohl vorzuziehen… es ist halt nur weit
verbreitet das nicht so zu machen. M.a.W. mein Beispiel ist
vorsichtig gesagt schlechter Stil und realistisch ein
Sicherheitsrisiko.

Bei C wurde halt einiges was die CPU kann, mit in die Sprache übernommen:
Zumindest beim Stackpointer kann fast jede CPU z.B. „*SP++“ als einen einzigen Maschinen-Befehel ausführen.

Heute kann ein Compiler mit guter Optimieren dies erkennen und u.U. den einzelnen Maschinen-Befehl selber erstellen.

MfG Peter(TOO)