当我尝试运行此代码时,它会提供以下输出:
c
99
25448
4636795
我想知道编译器如何生成最后两个输出?
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
char ch='c';
printf("%c\n",ch);
printf("%d\n",ch);
printf("%d\n",'ch');
printf("%d","ch");
return 0;
}
答案 0 :(得分:6)
printf("%c",ch); - print normal character
printf("%d\n",ch); - print ascii value of character
printf("%d\n",'ch'); - multi-character literal
printf("%d","ch"); - print value of pointer to string "ch"
关于'ch'
25448是0x6368
,63是'c'的十六进制,68是'h'的十六进制
答案 1 :(得分:1)
printf("%c", ch); // print ch as a character
printf("%d\n", ch); // print the ASCII value of ch
printf("%d\n", 'ch'); // print the value of the multi-character literal 'ch'
// implementation defined, but in this case 'ch' == 'c' << 8 | 'h'
printf("%d", "ch"); // print the address of the string literal "ch"
// undefined behavior, read below
关于多字符文字阅读here
您的代码invokes undefined behavior位于上一个printf
,因为您使用了错误的格式说明符。 printf
期待一个整数,并且您正在传递一个地址。在64位系统中,这很可能是64位值,而int
是32位。正确的版本应该是
printf("%p", (void*)"ch");
另一个问题是你没有在iostream
中使用任何内容,为什么要包括它?不要同时包含iostream
和stdio.h
。在C ++中更喜欢iostream
,因为它更安全。如果需要,请使用cstdio
代替stdio.h
你不应该同时标记C和C ++。他们是不同的语言