Seite 1 von 1
for-Schleife in C
Verfasst: 29.01.2006 02:46
von freedimension
Wie lässt sich folgende For-Schleife nach PB übersetzen?
Code: Alles auswählen
for (i = n >> 1; i > (j0 ^= i); i >>= 1){
...anderes Zeugs...
}
Es kommt mir dabei u.A. auf die korrekte Reihenfolge der Zuweisungen und Berechnungen an.
Ich habe da im Moment folgendes stehen:
Code: Alles auswählen
i = n >> 1
j0 = Pow(j0, i)
While
... anderes Zeugs
i >> 1
j0 = Pow(j0, i)
Wend
Jedoch bin ich mir da mal wieder gar nicht so sicher da ich selbst kein C programmiere

Verfasst: 29.01.2006 04:10
von MARTIN
Ich würde sagen:
Code: Alles auswählen
i = n >> 1 ;i = n >> 1
j0 = j0 ! i ;j0 ^= i
While ( i > j0 )
j0 = j0 ! i ; kann hier stehen
;... anderes Zeugs
i = i >> 1 ;i >>= 1 nach dem Schleifen rumpf
Wend
habe aber nicht getestet.
Und ja ich weiss dieses Zeichen ^ steht meistens für Exponenzieren in C ist es aber bitweise XODER.
Verfasst: 29.01.2006 12:06
von freedimension
MARTIN hat geschrieben:Ich würde sagen:
Code: Alles auswählen
i = n >> 1 ;i = n >> 1
j0 = j0 ! i ;j0 ^= i
While ( i > j0 )
j0 = j0 ! i ; kann hier stehen
;... anderes Zeugs
i = i >> 1 ;i >>= 1 nach dem Schleifen rumpf
Wend
habe aber nicht getestet.
Und ja ich weiss dieses Zeichen ^ steht meistens für Exponenzieren in C ist es aber bitweise XODER.
D'oh! Da hast du jetzt aber eine Gut bei mir, danke.
Was dein "kann hier stehen" anbelangt, so kommt es ja darauf an, ob j0 von "anderem Zeugs" in der Schleife gebraucht wird. Warum die Bedingung der While-Schleife wohl weg war? Hier im Code ist sie da, allerdings hatte ich einen Kommentar dahinter entfernt, evtl. war ich da etwas zu übereifrig

Verfasst: 29.01.2006 17:06
von MARTIN
Was dein "kann hier stehen" anbelangt, so kommt es ja darauf an, ob j0 von "anderem Zeugs" in der Schleife gebraucht wird.
Wenn man nur die besagte C for-Schleifen nachbilden will dann eingentlich nicht. Es ist nur wichtig das das diese Zeile
direkt nach dieser
folgt.
Es steht also in While/Wend schleife entweder ganz oben oder ganz unter.
Das entspricht dann der Reienfolge der Ausführung in einer C for-Schleifedie:
Code: Alles auswählen
for (i = n >> 1;//initialisierung
i > (j0 ^= i);//Fortlauf-Bedigung wird vor dem Schleifenrumpf ausgeführt/ausgewertet
i >>= 1 ){ //Aktualisierung wird erst nach dem Schleifenrumpf ausgeführt
...anderes Zeugs...
}
Aber du bist sicher mittlerweile schon selbst darauf gekommen.
Verfasst: 29.01.2006 17:27
von freedimension
MARTIN hat geschrieben:
Code: Alles auswählen
for (i = n >> 1;//initialisierung
i > (j0 ^= i);//Fortlauf-Bedigung wird vor dem Schleifenrumpf ausgeführt/ausgewertet
i >>= 1 ){ //Aktualisierung wird erst nach dem Schleifenrumpf ausgeführt
...anderes Zeugs...
}
Genau, aber da ich "j0 ^=i" doch bereits einmal vor der Schleife ausgeführt habe, darf ich den zweiten Aufruf erst am Schleifenende platzieren.
Verfasst: 29.01.2006 17:57
von MARTIN
Genau, aber da ich "j0 ^=i" doch bereits einmal vor der Schleife ausgeführt habe,
Ja aber es muss dann in der schleife irgendwo wieder ausgeführt werden, und wenn j0 nur einen Einfluss auf den Schleifenrumpf hätte, wäre es egal ob es ganz oben oder ganz unten stehen würde.
Aber trotzdem muss in diesem Fall "j0 = j0 ! i" ganz unten nach dem "i = i >> 1" stehen, weil j0 muss vor der Auswertung der Schleifenbedigung (nach dem i geändert wurde), aktualisiert werden. Jetzt sehe ich das, die schleife sollte also so aussehen:
Code: Alles auswählen
i = n >> 1
j0 = j0 ! i
While ( i > j0 )
;... anderes Zeugs
i = i >> 1 ;i >>= 1 nach dem Schleifen rumpf
j0 = j0 ! i ; kann hier stehen
Wend
Verfasst: 29.01.2006 20:03
von freedimension
Danke, ich denke das haut jetzt so hin. Habe mir gerade auch extra einen C-Compiler installiert und zur Bestätigung einmal folgenden Code drauf los gelassen:
Code: Alles auswählen
#include <stdio.h>
int A(){
printf("A");
return 0;
}
int B(){
printf("B");
return 3;
}
int C(){
printf("C");
return 1;
}
int main(void){
int i, k;
for (i = A(); i < B(); i += C()){
printf("\nZeugs\n");
}
printf("\n\n######\n\n");
i = A();
k = B();
while (i < k){
printf("\nZeugs\n");
i += C();
k = B();
}
printf("\n\n");
return 0;
}
Demnach passt das so wie wir es haben (also die Ausführungsreihenfolge)
