繁体   English   中英

使用 C 中的格式说明符打印

[英]Printing with format specifiers in C

在 class 测验中,我被要求编写以下代码片段的 output。

x = 1.234;
printf("x=%2d");

变量x包含点值,所以我假设它是浮点/双精度类型。

在论文中,我回答说这段代码只是简单地在引号内打印语句(如x=%2d ),如 print function 它会按原样打印“”中的任何内容。

但后来我在我的编译器中运行代码以找到 output 为x=4199232 (虽然不同编译器中的数字有所不同)(编辑-我在这里添加了编译代码)

#include <stdio.h>

int main() {
    float x = 1.234;
    printf("x=%2d");
    return 0;
}

任何人都可以解释一下这里到底发生了什么。

该代码具有未定义的行为(这解释了为什么不同编译器中的数字不同),因为您没有为转换提供int类型的参数%2d

如果你写了这个:

x = 1.234;
printf("x=%2d", x);

output 将取决于代码片段中未出现的x类型。 如果x使用int类型或更小的 integer 类型定义,包括_Bool ,则 output 应该是x= 1 ,但如果x具有任何其他算术类型,包括floatdouble ,则行为再次未定义,因为参数没有%d的预期类型。

另请注意,格式字符串中没有尾随\n ,因此 output 可能会延迟到程序结束,并且可能根本不会出现在某些不符合要求的系统上。

在您的示例代码中,由于缺少printf的参数,因此行为未定义,但您确实将x定义为float ,当传递给printf时,它将被隐式转换为double ,对于%d无效。

这是修改后的版本:

#include <stdio.h>

int main() {
    double x = 1.234;            // only use `float` when necessary
    printf("x=%2d\n", (int)x);   // outputs `x= 1`
    printf("x=%2f\n", x);        // outputs `x=1.234000`
    printf("x=%2g\n", x);        // outputs `x=1.234`
    printf("x=%.2f\n", x);       // outputs `x=1.23`
    return 0;
}

在这份声明中

printf("x=%2d");

您忘记为转换说明符d指定参数。 所以程序将尝试 output 存储在 memory 中的第二个参数应该是什么。

所以程序有未定义的行为。

如果您指定第二个参数,它也会有未定义的行为

printf("x=%2d", x );

因为使用了无效的转换说明符和浮点类型的 object。

到 output 只是你应该写的格式字符串

printf("x=%%2d");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM