【问题标题】:Why the first code work and second give wrong output?为什么第一个代码有效而第二个代码输出错误?
【发布时间】:2014-01-05 13:04:46
【问题描述】:

这是第一个代码

#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",&amp;a,&amp;l); 不起作用而scanf("%u%d",&amp;l,&amp;a); 起作用?

【问题讨论】:

  • 因为%u%d 是正常的int,而不是short int
  • @OliCharlesworth 那么这在第一种情况下是如何工作的?还是他走运了?
  • 两者都不起作用,因为由于 Oli 提供的原因,它们都调用了未定义的行为。
  • @ᴍarounᴍaroun 这是未定义的行为,他正在使用分配给变量的内存之外的内存。他很幸运。
  • @ᴍarounᴍaroun:因为这是 UB,我想这只是机会。

标签: c output


【解决方案1】:

对数据类型使用错误的说明符会调用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 参数的指针。

%d 之前使用h%u 用于short 类型数据。

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

【讨论】:

  • @user3162531;更新了我的答案。
  • 由于默认参数提升,printf 没有必要。 (虽然我认为这有利于一致性......)
  • @OliCharlesworth;但这样做没有坏处:)
  • @user3162531;阅读我的答案的第一行。
  • 但是为什么这个问题只出现在 %d 而不是 %u
猜你喜欢
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多