【问题标题】:Why is the output of the code snippet printf("%. %. %. "); comes to be %.0 %.0 %.0?为什么代码片段的输出是 printf("%.%.%.");变成 %.0 %.0 %.0?
【发布时间】:2019-09-19 15:09:28
【问题描述】:

我知道句号 . 符号精确地分隔字段宽度。但是,我不知道% 之后的零是如何出现的。每次我运行它都会显示相同的输出。

代码:

#include <stdio.h>
int main() { printf("%. %. %. "); return 0; }

输出: %.0 %.0 %.0

main.c:13:15: warning: unknown conversion type character 0x20 in format [-Wformat=]                                                                                                         
main.c:13:18: warning: unknown conversion type character 0x20 in format [-Wformat=]                                                                                                         
main.c:13:21: warning: unknown conversion type character 0x20 in format [-Wformat=]                                                                                                         

【问题讨论】:

  • 程序有未定义的行为。
  • 不要忽略警告。这很可能是未定义的行为:您没有提供有效的转换字符。 0x20 是空格的十六进制值。
  • 如果你提供了无效的格式说明符,你为什么会期望得到任何特定的结果?
  • 鉴于 #include 指令没有文件名,我预计会收到更多警告。
  • 非常相似。 printf() with no arguments in C compiles fine. how? 的可能重复项

标签: c format printf specifier


【解决方案1】:

您在% 之后没有提供有效的转换说明符(例如dxfgcsp 等)所以您正在调用undefined behavior。这意味着任何事情都可能发生。

来自 ISO C99 标准的第 7.19.6.1/9 节:

如果转换规范无效,则行为未定义。239) 如果任何参数不是相应转换规范的正确类型,则行为是 未定义。

【讨论】:

  • 每次我运行这段代码,我都会得到相同的输出。
  • @RohitPratap 未定义并不意味着随机。未定义意味着任何事情都可能发生。绝对什么。即使您确定它必须有意义,也允许它没有意义。即使您确定它必须没有意义,它也可以是可预测的。
  • @RohitPratap 总是用cc -Werror=format 编译。编译器将此视为信息性警告而不是像语法错误那样严重失败的事实是不幸的。
  • @mosvy 好的,先生,我愿意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2010-10-06
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多