使用不同格式说明符

时间:2017-01-28 13:24:08

标签: c format-specifiers

在下面的样本中

    #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类型,并以该形式进行评估。 为什么会发生这种情况,即使在两种情况下结果都相同?

2 个答案:

答案 0 :(得分:0)

您的计时结果有多准确?如果您使用time命令,它只会给您两位小数,因此0.030.02之间的差异并不重要(例如,它实际上可能是0.02500001并且在舍入之前0.02499999。使用较长的输入并重复测试几次,对结果取平均值,并查看标准差以查看差异是否具有统计显着性。

也就是说,根据您的平台,intlong int也可能具有相同的尺寸,这两者相当。如果不是,则取决于平台上的C库是否实际使用不同的例程来解析长整数而不是普通整数。我希望在内部它总是使用相同的例程,即最长的整数大小,并将结果转换为请求的类型。

答案 1 :(得分:0)

  

当我将格式说明符从%ld更改为%d ...

... 未定义的行为(UB)。

long int num;
...
printf("%d\n",num);  // mis-matched specifier and data type.

即使OP可能会收到未发布输入的预期结果,但由于UB,性能比较为moot

执行时序比较时,数据集,测试顺序(由于内存缓存)和许多因素都有所贡献。为了进行良好的分析,发布没有未定义行为的代码,并在运行时显示其自身的差异。