繁体   English   中英

用printf打印字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM