C++ 用 printf 打印一个字符
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4736732/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Printing a char with printf
提问by peoro
Are both these codes the same
这两个代码是一样的吗
char ch = 'a';
printf("%d", ch);
Will it print a garbage value?
它会打印垃圾值吗?
I am confused about this
我对此感到困惑
printf("%d", 'printf("%d", sizeof('\n'));
');
Will this print 0 or garbage value? Because when i do this
这会打印 0 或垃圾值吗?因为当我这样做时
printf("%c", ch);
It prints 4. Why is sizeof('\n')
4 bytes?
The same thing in C++ prints 1 bytes. Why is that?
它打印 4。为什么是sizeof('\n')
4 个字节?在 C++ 中同样的事情打印 1 个字节。这是为什么?
So here's the main question
所以这是主要问题
in c language is printf("%d", '\0')
supposed to print 0
在 c 语言中printf("%d", '\0')
应该打印 0
and in C++ printf("%d", '\0')
supposed to print garbage?
而在 C++ 中printf("%d", '\0')
应该打印垃圾?
回答by peoro
%d
prints an integer: it will print the ascii representation of your character. What you need is %c
:
%d
打印一个整数:它将打印字符的 ascii 表示。你需要的是%c
:
char ch = 'a';
printf("%d", ch);
printf("%d", '\0');
prints the ascii representation of '\0'
, which is 0 (by escaping 0 you tell the compiler to use the ascii value 0.
printf("%d", '\0');
打印 0 的 ascii 表示'\0'
(通过转义 0,您告诉编译器使用 ascii 值 0。
printf("%d", sizeof('\n'));
prints 4 because a character literal is an int
, in C, and not a char
.
printf("%d", sizeof('\n'));
打印 4 因为字符文字是int
C 中的 , 而不是char
。
回答by scoffey
This is supposed to print the ASCII value of the character, as %d
is the escape sequence for an integer. So the value given as argument of printf
is taken as integer when printed.
这应该打印字符的 ASCII 值,就像%d
整数的转义序列一样。因此,作为参数给出的值printf
在打印时被视为整数。
#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", '7'); /* 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;
}
Same holds for printf("%d", '\0');
, where the NULL character is interpreted as the 0 integer.
同样适用于printf("%d", '\0');
,其中 NULL 字符被解释为 0 整数。
Finally, sizeof('\n')
is 4 because in C, this notation for characters stands for the corresponding ASCII integer. So '\n' is the same as 10 as an integer.
最后,sizeof('\n')
是 4,因为在 C 中,这个字符表示法代表相应的 ASCII 整数。所以 '\n' 和 10 一样是一个整数。
It all depends on the interpretation you give to the bytes.
这一切都取决于您对字节的解释。
回答by John Bode
In C, character constant expressions such as '\n'
or 'a'
have type int
(thus sizeof '\n' == sizeof (int)
), whereas in C++ they have type char
.
在 C 中,诸如'\n'
或 之'a'
类的字符常量表达式具有 type int
(因此sizeof '\n' == sizeof (int)
),而在 C++ 中,它们具有 type char
。
The statement printf("%d", '\0');
should simply print 0; the type of the expression '\0'
is int
, and its value is 0.
该语句printf("%d", '\0');
应该简单地打印 0;表达式的类型'\0'
为int
,其值为 0。
The statement printf("%d", ch);
should print the integer encoding for the value in ch
(for ASCII, 'a'
== 97).
该语句printf("%d", ch);
应打印值的整数编码ch
(对于 ASCII,'a'
== 97)。
回答by orlp
In C char
gets promoted to int
in expressions. That pretty much explains every question, if you think about it.
在 C 中char
被提升为int
in 表达式。如果你仔细想想,这几乎解释了每一个问题。
Source: The C Programming Language by Brian W.Kernighan and Dennis M.Ritchie
资料来源:Brian W.Kernighan 和 Dennis M.Ritchie 的 C 编程语言
A must read if you want to learn C.
如果您想学习 C,则必须阅读。
Also see this stack overflow page, where people much more experienced then me can explain it much better then I ever can.
另请参阅此堆栈溢出页面,那里比我更有经验的人可以比我能更好地解释它。
回答by spinooosa
printf("%d\n", (int) ch)
回答by davep
Yes, it prints GARBAGE unless you are lucky.
是的,除非你很幸运,否则它会打印 GARBAGE。
VERY IMPORTANT.
很重要。
The type of the printf/sprintf/fprintf argument MUST match the associated format type char.
printf/sprintf/fprintf 参数的类型必须匹配相关的格式类型 char。
If the types don't match and it compiles, the results are very undefined.
如果类型不匹配并且可以编译,则结果非常不确定。
Many newer compilers know about printf and issue warnings if the types do not match. If you get these warnings, FIX them.
许多较新的编译器知道 printf 并在类型不匹配时发出警告。如果您收到这些警告,请修复它们。
If you want to convert types for arguments for variable functions, you must supply the cast (ie, explicit conversion) because the compiler can't figure out that a conversion needs to be performed (as it can with a function prototype with typed arguments).
如果要转换变量函数的参数类型,则必须提供强制转换(即显式转换),因为编译器无法确定需要执行转换(就像使用带类型参数的函数原型一样) .
printf("%d", (int) sizeof('\n'))
In this example, printf is being TOLD that there is an "int" on the stack. The cast makes sure that whatever thing sizeof returns (some sort of long integer, usually), printf will get an int.
在这个例子中,printf 被告知栈上有一个“int”。强制转换确保无论 sizeof 返回什么(通常是某种长整数),printf 都会得到一个 int。
##代码##