for-Schleife in C

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

for-Schleife in C

Beitrag 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 :|
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag 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.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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 :|
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag 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

Code: Alles auswählen

j0 = j0 ! i 
direkt nach dieser

Code: Alles auswählen

j0 = j0 ! i 
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.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag 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
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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) :allright:
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten