这里的代码给出了不正确的int num值,如果我输入的num是例如11,则printf函数将输出0.但是如果我将static添加到int num,则printf生成的输出是正确的 . 有人可以解释原因 . 如果我将第二个scanf的格式说明符设为%c,那么也可以正确打印int值 .
#include<stdio.h>
int main()
{
int num;//making it static gives correct result
char ch;int c;
printf("enter the value of num and ch:\n");
scanf("%d",&num);
scanf("%d",&ch);
printf("num = %d and ch = %c",num,ch);
return 0;
}
3 回答
它不是专门针对
printf()
,问题是由对scanf()
的错误调用引起的 .引用
C11
,章节§7.21.6.2对于
%d
转换说明符,预期的参数类型是但是,你所提供的只是一个指向
char
的指针 . 不匹配 . Undefined behavior .OTOH,用于
%c
转换说明符,所以使用
是正确的 . 或者,您也可以使用
这个
将调用 Undefined Behavior ,因为您使用的是整数格式,以将其存储在字符中 .
您观察到的很可能是因为第二个
scanf
错误(char
工具大)格式说明符会覆盖num
所在的自动变量内存 .使
num
静态将其移动到全局变量内存并且它(种类)有效,但它仍然是未定义的行为,某些内存已被覆盖某处,您可能稍后付出代价 . 因此,唯一的选择是指定正确的格式说明符,如您所述%c
.