printf() rückwärst :P



  • Ich habe eben festgestellt das printf(); seine parameter rückwärts durcharbeitet. als beispiel:

    eine textdatei mit dem inhalt "123".

    version1:

    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
       FILE *fp = fopen("C:\\test.txt", "r");
       char i[3];
       i[0]=fgetc(fp);
       i[1]=fgetc(fp);
       i[2]=fgetc(fp);
       printf("%c%c%c\n", i[0], i[1], i[2]);
       fcloseall();
    }
    

    ausgabe : "123"

    version2:

    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
       FILE *fp = fopen("C:\\test.txt", "r");
       printf("%c%c%c\n", fgetc(fp), fgetc(fp), fgetc(fp));
       fcloseall();
    }
    

    ausgabe: "321"

    das ist irgendwie verwirrend... und ich hab mich gewundert wieso der rückwärts einliest... seit dem arbeite ich mit cout 🙂

    [ Dieser Beitrag wurde am 30.03.2003 um 01:57 Uhr von Fabian Bernecker editiert. ]



  • und ich hab mich gewundert wieso der rückwärts einliest... seit dem arbeite ich mit cout

    Was dir aber überhaupt nichts nützt, da das Verhalten bei cout *exakt* genauso *implementation-defined* ist wie bei printf auch.

    Die Reihenfolge in der Funktionsargumente ausgewertet werden ist *nicht* definiert. Es muss lediglich jedes Argument ausgewertet sein *bevor* die erste Anweisung der Funktion ausgeführt wird.

    Der Aufruf:

    printf("%c%c%c\n", fgetc(fp), fgetc(fp), fgetc(fp));

    kann zur Ausgabe jeder beliebigen Permutation von 1,2,3 führen. Und wenn der Compilerhersteller will sogar jedesmal zu einer anderen.

    Für:

    cout << fgetc(fp) << fgetc(fp) << fgetc(fp);
    

    gilt exakt das selbe.

    [ Dieser Beitrag wurde am 30.03.2003 um 08:43 Uhr von HumeSikkins editiert. ]



  • Schade 😞

    Ich hatte gedacht das das Problem damit behoben ist. Aber ich werd mir das auf jeden Fall merken und in Zukunft drauf achten. Danke für die Info 🙂


Anmelden zum Antworten