[英]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
具有任何其他算术类型,包括float
和double
,则行为再次未定义,因为参数没有%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.