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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 16:18:45  来源:igfitidea点击:

Printing a char with printf

c++cprintfsizeof

提问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

%dprints 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 因为字符文字是intC 中的 ,​​ 而不是char

回答by scoffey

This is supposed to print the ASCII value of the character, as %dis the escape sequence for an integer. So the value given as argument of printfis 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 chargets promoted to intin expressions. That pretty much explains every question, if you think about it.

在 C 中char被提升为intin 表达式。如果你仔细想想,这几乎解释了每一个问题。

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。

##代码##