[英]Printing a char with 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')
应该打印垃圾?
%d
打印一个整数:它将打印您角色的ascii表示。 你需要的是%c
:
printf("%c", ch);
printf("%d", '\\0');
打印'\\0'
的ascii表示,为0(通过转义0,告诉编译器使用ascii值0。
printf("%d", sizeof('\\n'));
打印4因为字符文字是int
,在C中,而不是char
。
这应该打印字符的ASCII值,因为%d
是整数的转义序列。 因此,作为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;
}
是的,它会打印GARBAGE,除非你很幸运。
很重要。
printf / sprintf / fprintf参数的类型必须与关联的格式类型char匹配。
如果类型不匹配并且编译,则结果非常不确定。
许多较新的编译器了解printf并在类型不匹配时发出警告。 如果你收到这些警告,请修复它们。
如果要为变量函数的参数转换类型,则必须提供强制转换(即显式转换),因为编译器无法确定是否需要执行转换(因为它可以使用带有类型参数的函数原型) 。
printf("%d\n", (int) ch)
在这个例子中,printf是TOLD,堆栈上有一个“int”。 演员确保无论sizeof返回什么东西(通常是某种长整数),printf都会得到一个int。
printf("%d", (int) sizeof('\n'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.