web-dev-qa-db-ja.com

printfで文字を印刷する

これらのコードは両方とも同じですか

_char ch = 'a';
printf("%d", ch);
_

ガベージ値を出力しますか?

私はこれについて混乱しています

_printf("%d", '\0'); 
_

これは0またはガベージ値を出力しますか?私がこれをするとき

_printf("%d", sizeof('\n')); 
_

4を出力します。なぜsizeof('\n')は4バイトなのですか? C++の同じものは1バイトを出力します。何故ですか?

だからここに主な質問があります

c言語ではprintf("%d", '\0')は0を出力するはずです

そして、C++ printf("%d", '\0')でゴミを出力することになっていますか?

18
user535450

_%d_は整数を出力します:あなたのキャラクターのASCII表現を出力します。必要なのは_%c_:

_printf("%c", ch);
_

printf("%d", '\0');は、_'\0'_のASCII表現を出力します。これは0です(0をエスケープすることにより、ASCII値0を使用するようコンパイラーに指示します)。

printf("%d", sizeof('\n'));は、文字リテラルがintではなくCのcharであるため、4を出力します。

36
peoro

%dは整数のエスケープシーケンスであるため、これは文字のASCII値を出力することになっています。したがって、printfの引数として指定された値は印刷時の整数。

char ch = 'a';
printf("%d", ch);

printf("%d", '\0');についても同様です。NULL文字は0の整数として解釈されます。

最後に、sizeof('\n')は4です。これは、Cでは、この文字表記が対応するASCII整数です。したがって、 '\ n'は整数の10と同じです。

それはすべてあなたがバイトに与える解釈に依存します。

8
scoffey

Cでは、_'\n'_や_'a'_などの文字定数式の型はint(したがってsizeof '\n' == sizeof (int))ですが、C++ではchar型です。 。

ステートメントprintf("%d", '\0');は単に0を出力するだけです。式_'\0'_の型はintであり、その値は0です。

ステートメントprintf("%d", ch);は、ch(ASCIIの場合は_'a'_ == 97)の値の整数エンコードを出力する必要があります。

6
John Bode

Cでは、charは式でintに昇格されます。あなたがそれについて考えるならば、それはほとんどすべての質問を説明します。

出典:Brian W.KernighanとDennis M.RitchieによるCプログラミング言語

Cを学びたいなら、必ず読んでください。

このスタックオーバーフローページ も参照してください。ここでは、経験豊富な人が私よりもずっとうまく説明できます。

5
orlp
#include <stdio.h>
#include <stdlib.h>

int func(char a, char b, char c) /* demonstration that char on stack is promoted to int !!!
                                    note: this promotion is NOT integer promotion, but promotion during handling of the stack. don't confuse the two */
{
  const char *p = &a;
  printf("a=%d\n"
         "b=%d\n"
         "c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this)
}


int main(void)
{
  func(1, 2, 3);

  //printf with %d treats its argument as int (argument must be int or smaller -> works because of conversion to int when on stack -- see demo above)
  printf("%d, %d, %d\n", (long long) 1, 2, 3); // don't do this! Argument must be int or smaller type (like char... which is converted to int when on the stack -- see above)



  // backslash followed by number is a oct VALUE
  printf("%d\n", '\377');             /* prints -1   -> IF char is signed char: char literal has all bits set and is thus value -1.
                                                     -> char literal is then integer promoted to int. (this promotion has nothing to do with the stack. don't confuse the two!!!) */
                                      /* prints 255  -> IF char is unsigned char: char literal has all bits set and is thus value 255.
                                                     -> char literal is then integer promoted to int */


  // backslash followed by x is a hex VALUE
  printf("%d\n", '\xff');             /* prints -1   -> IF char is signed char: char literal has all bits set and is thus value -1.
                                                     -> char literal is then integer promoted to int */
                                      /* prints 255  -> IF char is unsigned char: char literal has all bits set and is thus value 255.
                                                     -> char literal is then integer promoted to int */


  printf("%d\n", 255);                // prints 255


  printf("%d\n", (char)255);          // prints -1   -> 255 is cast to char where it is -1
  printf("%d\n", '\n');               // prints 10   -> Ascii newline has VALUE 10. The char 10 is integer promoted to int 10
  printf("%d\n", sizeof('\n'));       // prints 4    -> Ascii newline is char, but integer promoted to int. And sizeof(int) is 4 (on many architectures)
  printf("%d\n", sizeof((char)'\n')); // prints 1    -> Switch off integer promotion via cast!

  return 0;
}
3
spinooosa