为什么第一个代码工作,第二个代码输出错误?

时间:2014-01-05 13:04:47

标签: c output

这是第一个代码

#include <stdio.h>
#include <stdlib.h>
int main()  
{   
   short int a;
   unsigned short int l;
   scanf("%d%u",&a,&l);
   printf("%d %u",a,l);
   return 0;
}

如果我给出输入(可能是任何其他输入)

5
9

输出

0 9

第二个代码是

#include <stdio.h>
#include <stdlib.h>
int main()
{
   short int a;
   unsigned short int l;
   scanf("%u%d",&l,&a);
   printf("%d %u",a,l);
   return 0;
}

如果我给出输出(可能是任何其他输入)

9
5

输出

5 9

为什么scanf("%d%u",&a,&l);不起作用且scanf("%u%d",&l,&a);有效?

1 个答案:

答案 0 :(得分:3)

对数据类型使用错误的说明符会调用undefined behavior。结果可能是预期的或意外的。

C11:7.21.6格式化输入/输出功能:

  

(p9)如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为为   未定义。

和约h:p(7)

  

h指定以下d, i, o, u, xX转换说明符适用于   short intunsigned short int参数(参数将根据整数提升进行提升,但在打印前其值应转换为short intunsigned short int);或者后面的n转换说明符适用于指向short int参数的指针。

h前使用%d,在%u类型数据中使用short

scanf("%hd %hu",&a,&l);
printf("%hd %hu",a,l);