1

同じ関数内で宣言する場所に応じて異なる動作をする変数があります。何が起こっているのか理解したいです。

この関数では、何が起こっているのかを説明するためだけに、異なる結果を生成する変数の宣言と初期化を両方の場所に含めました。プログラムを実行すると、どちらの場所でも、変数を 2 回宣言するのではなく、1 回だけ宣言します。

可変温度について言及し、シナリオ 1 とシナリオ 2 についてコメントしました

C関数

    int main(int argc, char* argv[])
    {
        // ensure proper usage
        if (argc != 4) // we need four arguments
        {
            printf("Usage: copy infile outfile\n");
            return 1;
        }

        // remember filenames
        char* infile = argv[2];
        char* outfile = argv[3];

        // the factor
        int n = argv[1][0] - '0';

        // SCENARIO 1) HERE HERE HERE HERE THIS IS THE VARIABLE I AM DISCUSSING!!!!!!!
->      int temp = n; // WHEN DECLARED HERE AND INITIALIZED AT TIME OF CREATION
                      // gdb displays its value equal to the value of n


        // open input file 
        FILE* inptr = fopen(infile, "r");
        if (inptr == NULL)
        {
            printf("Could not open %s.\n", infile);
            return 2;
        }

        // open output file
        FILE* outptr = fopen(outfile, "w");
        if (outptr == NULL)
        {
            fclose(inptr);
            fprintf(stderr, "Could not create %s.\n", outfile);
            return 3;
        }

        // read infile's BITMAPFILEHEADER
        BITMAPFILEHEADER bf;
        fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);

        // read infile's BITMAPINFOHEADER
        BITMAPINFOHEADER bi;
        fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);

        // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
        if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || 
            bi.biBitCount != 24 || bi.biCompression != 0)
        {
            fclose(outptr);
            fclose(inptr);
            fprintf(stderr, "Unsupported file format.\n");
            return 4;
        }

        //gdb break to check the previous values


        // SCENARIO 2) HERE HERE HERE HERE THIS IS THE VARIABLE I AM DISCUSSING!!!!!!!!
->      int temp = n; // WHEN DECLARED HERE AND INITIALIZED THE VARIABLE HERE
                      // gdb displays its value equal to 0 and not n

        // write outfile's BITMAPFILEHEADER
        fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);

        // write outfile's BITMAPINFOHEADER
        fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);

        // determine padding for scanlines
        int padding =  (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

        //gdb break to check the new values

        // iterate over infile's scanlines
        for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
        {
            // iterate over pixels in scanline
            for (int j = 0; j < bi.biWidth; j++)
            {
                // temporary storage
                RGBTRIPLE triple;

                // read RGB triple from infile
                fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

                // write RGB triple to outfile
                fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
            }

            // skip over padding, if any
            fseek(inptr, padding, SEEK_CUR);

            // then add it back (to demonstrate how)
            for (int k = 0; k < padding; k++)
                fputc(0x00, outptr);
        }

        // close infile
        fclose(inptr);

        // close outfile
        fclose(outptr);

        // that's all folks
        return 0;
    }

コードによって n も temp も何らかの方法で変更されると、なぜ別の値が得られるのでしょうか?

4

1 に答える 1

0

したがって、コードを理解していれば、初期化後に読んtempだり、読んだりすることはありません。n2 番目のケースでは、コンパイラがそれを (最適化のレベルに応じて) 把握し、削除した可能性があります。

于 2013-04-12T06:00:52.433 に答える