在下面的样本中
#include <stdio.h>
#include <math.h>
int main(void) {
int t,n,x,i;
long int num;
scanf("%d",&t);
while(t--){
scanf("%d",&n);num=0;
for(i=1;i<=n;i++){
scanf("%d",&x);
num=num+(x*pow(10,(n-i)));
}
printf("%ld\n",num);
}
return 0;
}
对于一组输入,样本需要0.03秒的时间
当我将格式说明符从%ld
更改为%d
时,在printf中,对于相同的值和输入数量,样本花费0.02秒的时间。
在这两种情况下,num
都是long int
类型,并以该形式进行评估。
为什么会发生这种情况,即使在两种情况下结果都相同?
答案 0 :(得分:0)
您的计时结果有多准确?如果您使用time
命令,它只会给您两位小数,因此0.03
和0.02
之间的差异并不重要(例如,它实际上可能是0.02500001
并且在舍入之前0.02499999
。使用较长的输入并重复测试几次,对结果取平均值,并查看标准差以查看差异是否具有统计显着性。
也就是说,根据您的平台,int
和long int
也可能具有相同的尺寸,这两者相当。如果不是,则取决于平台上的C库是否实际使用不同的例程来解析长整数而不是普通整数。我希望在内部它总是使用相同的例程,即最长的整数大小,并将结果转换为请求的类型。
答案 1 :(得分:0)
当我将格式说明符从%ld更改为%d ...
时
... 未定义的行为(UB)。
long int num;
...
printf("%d\n",num); // mis-matched specifier and data type.
即使OP可能会收到未发布输入的预期结果,但由于UB,性能比较为moot。
执行时序比较时,数据集,测试顺序(由于内存缓存)和许多因素都有所贡献。为了进行良好的分析,发布没有未定义行为的代码,并在运行时显示其自身的差异。