これらのコードは両方とも同じですか
_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')
でゴミを出力することになっていますか?
_%d
_は整数を出力します:あなたのキャラクターのASCII表現を出力します。必要なのは_%c
_:
_printf("%c", ch);
_
printf("%d", '\0');
は、_'\0'
_のASCII表現を出力します。これは0です(0をエスケープすることにより、ASCII値0を使用するようコンパイラーに指示します)。
printf("%d", sizeof('\n'));
は、文字リテラルがint
ではなくCのchar
であるため、4を出力します。
%d
は整数のエスケープシーケンスであるため、これは文字のASCII値を出力することになっています。したがって、printf
の引数として指定された値は印刷時の整数。
char ch = 'a';
printf("%d", ch);
printf("%d", '\0');
についても同様です。NULL文字は0の整数として解釈されます。
最後に、sizeof('\n')
は4です。これは、Cでは、この文字表記が対応するASCII整数です。したがって、 '\ n'は整数の10と同じです。
それはすべてあなたがバイトに与える解釈に依存します。
Cでは、_'\n'
_や_'a'
_などの文字定数式の型はint
(したがってsizeof '\n' == sizeof (int)
)ですが、C++ではchar
型です。 。
ステートメントprintf("%d", '\0');
は単に0を出力するだけです。式_'\0'
_の型はint
であり、その値は0です。
ステートメントprintf("%d", ch);
は、ch
(ASCIIの場合は_'a'
_ == 97)の値の整数エンコードを出力する必要があります。
Cでは、char
は式でint
に昇格されます。あなたがそれについて考えるならば、それはほとんどすべての質問を説明します。
出典:Brian W.KernighanとDennis M.RitchieによるCプログラミング言語
Cを学びたいなら、必ず読んでください。
このスタックオーバーフローページ も参照してください。ここでは、経験豊富な人が私よりもずっとうまく説明できます。
#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;
}