我对以下程序有疑问,我无法理解以下程序的输出:
#include<stdio.h>
#include<conio.h>
main()
{
char c='1';
clrscr();
printf("%d",&c);
getch();
}
在我的编译器中它正在打印“-11”而我正在使用Turbo C ++。我知道如果我使用“c
”而不是“&c
”它会打印49因为它是一个ASCII数字为'1'。但是当我使用“&c
”时它为什么打印-11。
答案 0 :(得分:5)
&c
表示c
的地址,而不是其值,并且具有指针类型。使用%d
作为指针有undefined behaviour,因此您的程序可以随意打印任何喜欢的内容(或者确实做一些完全不同的事情)。
在实践中可能发生的事情是指针被重新解释为整数,并且整数恰好设置了其顶部位。在two's complement中,这代表一个负数,因此它会被打印出来。
答案 1 :(得分:1)
将printf
行更改为:
printf("%c",c);
在您的代码中,%d
正在打印带符号的十进制整数,而不是char值。但是,这里是未定义的,因为;
&c
是c
的地址,而不是值。
答案 2 :(得分:1)
您输出c
的地址作为整数。
如果要将c
的值作为整数输出,请使用printf("%d", c);
;使用printf("%c", c);
将其作为字符输出。
答案 3 :(得分:0)
因为&c
是字符c
的地址而不是它的值。如果要查看其值,请不要将&
放在那里。在Turbo C中将地址打印为整数是完全有效的,但是Decent编译器会警告你:
警告:格式'%d'需要类型为'int'的参数,但参数2的类型为'char *'