3

これは、gcc でコンパイルされた私の C コードです。

#include<stdio.h>

int main() 
{ 
    int a=1; 
    switch(a)
    {
       int x=10;
       case 1:
           printf("%d\n",printf("%d\b",x));
           break;
       default:
           printf("%d\n",printf("%d\b",x));
    }
    return 0;
}

printf() は、正常に印刷された要素の数を返すことになっています。 printf("%d\b", x)単独で 10 を出力する必要がありました (\b は印刷ポインターを 1 ステップ (10 の数字 0 まで) 後ろに移動し、その後は何も出力しないためです。したがって、10 を出力する必要があります。これは 2 文字です。これで、外側の printf は 2 を表示します。出力は 102 であるはずです。実際に表示される出力は 2 です。

ネストされたprintfs の場合、印刷ポインタの位置は記憶されていますか? つまり\b、 の中printfに があると、印刷ポインタが 1 歩遅れます。そして、コントロールが今外側に行くとき、printfその変更された位置は記憶されていますか? その最後の文字を上書きしますか?

4

1 に答える 1

5
printf("%d\b",x)

文字'1', '0'(x==10 のため) および を出力し\bます。は\bバックスペース文字です。端末に出力すると、出力されてから10カーソルが 1 列戻ります。

を呼び出すとprintf、印刷した文字数が返されます。この場合、結果は 3 です (はい、'\b'文字としてカウントされます)。

printf("%d\n",printf("%d\b",x));

内側のprintf呼び出しは上で説明したように機能し、3 を返します。外側のprintf呼び出しは を出力し"3\n"ます。

したがって、ステートメント全体が出力されます。

10\b3\n

これ'\b'により、画面上の3が置き換えられるため、最終的に表示される結果 (システムでプログラムを実行したとき) は次のようになります。0

13

を介して出力をパイプすると、次のcat -vようになります。

10^H3

where^Hはバックスペース文字を表します。

編集 :

質問は編集されたばかりで、変更されたプログラムの動作はまったく異なります。switch ステートメントにより、コントロールは宣言を超えてジャンプしますが、が宣言int x = 10;れているスコープにジャンプxします。その結果、は呼び出されたxときに初期化されません。printfこれにより、未定義の動作が発生し、おそらくガベージ出力が発生します(私はちょうど得ました-1217572876^H12)。である場合、次のようxになる0と思います。0^H22

何をしようとしても、それを行うためのより良い方法を見つけてください。

于 2012-09-28T11:08:56.830 に答える