能否编写严格符合ISO/IEC 9899:2017的C程序实现显示器输出?
首先明确核心逻辑:严格符合ISO/IEC 9899:2017的程序,要求的是不依赖未指定、未定义或实现定义的行为的结果,而非完全禁止触发这些行为。
1. 对严格符合程序定义的澄清
根据标准:
严格符合标准的程序只能使用本文件规定的语言和库特性。其输出不得依赖任何未指定、未定义或实现定义的行为,且不得超出任何最低实现限制。
这里的关键是“输出不得依赖”——也就是说,程序可以触发未指定行为,但不能假设该行为会产生某个特定结果(比如假设行末输出字符必然换行,或者必然覆盖末尾字符)。只要程序的功能不绑定这些不确定的结果,就不违反严格符合的要求。
2. 避免触发行末未指定行为的可行方案
标准规定了最低实现限制,其中<limits.h>中的LINE_MAX宏定义了文本行的最大长度(包含终止的换行符)。严格符合的程序可以控制每行输出的字符数不超过LINE_MAX - 1,这样活动位置永远不会到达行的最后位置,从根源上避免触发该未指定行为。
比如,程序输出时确保每行的打印字符数不超过LINE_MAX - 1,最后加上换行符,就可以完全规避这个场景。
3. 即使触发未指定行为,仍可能符合标准
如果程序因某些原因触发了行末的未指定行为,但后续逻辑不依赖于该行为的具体表现(比如程序只是输出日志,不需要读取显示状态或基于显示结果继续执行),那么它依然是严格符合标准的。标准禁止的是依赖这些不确定行为来实现程序的核心功能,而非完全杜绝触发场景。
总结
这并非标准疏漏,而是对“严格符合程序”的定义理解存在偏差:严格符合的核心是不依赖不确定行为的结果,而非完全避免所有可能触发不确定行为的操作。通过遵循标准的最低限制,或确保程序不依赖未指定行为的输出,完全可以编写严格符合标准的程序。
内容的提问来源于stack exchange,提问作者Tux1

