2016-09-19 4 views
0

私は以下のプログラムを持っています。フォーマット指定子は、印刷するバイト数をどのように知っていますか?

#include<stdio.h> 
int main() 
{ 
    char a='b'; 
    int b=11299; 
    char d[4]="abc"; 
    printf("value of a is %d\n",a); 
    printf("value of b is %c\n",b); 
    printf("value of c is %d\n",*d); 
    char *c=d; 
    c=c+1; 
    printf("c is %d\n",*c); 
} 

%dのフォーマット指定子と少し混同しています。私はそれが4バイトのデータを印刷すると考えていました。しかし、上記のプログラム(最初と最後のprintf)から、charパラメータが使用されたときには1バイトしか出力されないことが明らかです。なぜ%dは1バイトしか印刷しませんか?印刷するバイト数はどのように分かりますか?

+0

これは 'printf'フォーマットについての基本的なMSVCのページ](https://msdn.microsoft.com/en-us/library/56e442dc.aspx)であります幅などの詳細にリンクしています。普通の '%d'指定子は、与えられた引数を必要なだけ多くの数字を使って' int'として表示します。 –

+0

'a'が' printf() 'に渡されるとき、コンパイラによって' int'に宣言されます。 – alk

+0

'char'は' int'に昇格します。 –

答えて

3

バイトは印刷されません。渡された値が正しい型を持っていれば、値(対応する引数として渡す値)を出力します。

例1では、引数は値'b'です。当初のタイプはchar(式aにはタイプがcharであるため)ですが、可変引数はデフォルトのプロモーションの対象となり、intより低いランクの整数タイプはintになります。したがって、引数として、タイプはintです。

例3では、引数は値'a'です。同様に、最初はタイプchar*dの式はchar)を持っていますが、intに昇格します。

プロモーションが行われず、タイプが間違っていた場合でも、printfは「印刷バイト数が少ない」とは限りません。あなたのプログラムは、定義されていない振る舞いしかしません。例えば:あなたの例で

int a = 42; 
printf("%lld\n", a); // undefined behavior because int does not 
        // get promoted implicitly to long long. 

2、%c書式指定子がタイプintの引数を期待します。 printfunsigned charに変換し、対応する文字を出力します。 intの任意の値を使用できます。それは既にunsigned charの範囲の値である必要はありません。

0

まず、ISO C90を指定した宣言であり、警告に示されているように、宣言とコードが混在することを禁じます。 char型のステートメントポインタchar * c = d;は、コードの途中ではなく、文字列dchar d [4] = "abc";のように指定する必要があります。 2番目:int main(){関数は何も返しませんが、警告を出さないように指定する必要があります。

改訂プログラムは次のようになります。

#include<stdio.h> 
int main() 
{ 
    char a='b'; 
    int b=11299; 
    char d[4]="abc"; 
    char *c=d; 
    printf("value of a is %d\n",a); 
    printf("value of b is %c\n",b); 
    printf("value of c is %d\n",*d); 
    c=c+1; 
    printf("c is %d\n",*c); 
    return 0; 
} 
+0

Err、これはどうやって質問に答えますか? – alk

関連する問題