根据C标准,返回的任何字符fgetc
以以下形式返回unsigned char
值,“转换为int
“(该引用来自 C 标准,表明确实存在转换)。
When sizeof (int) == 1
, many unsigned char
值超出范围。因此,其中一些可能unsigned char
值可能最终会被转换为int
值(转换的结果是“实现定义的或提出实现定义的信号”) of EOF
,尽管文件实际上并未处于错误或文件结束状态,但仍会返回该值。
我惊讶地发现这样的实现确实存在。 TMS320C55xCCS手册文件UCHAR_MAX
对应值为65535,INT_MAX
有 32767 个,fputs
and fopen
支持二进制模式...更令人惊讶的是,它似乎将环境描述为完全一致、完整的实现(减去信号)。
C55x C/C++ 编译器完全符合 ISO 规范定义的 ISO C 标准...
编译器工具附带完整的运行时库。所有图书馆
函数符合 ISO C 库标准。 ...
这样的实现是否可以返回一个值来指示没有错误的地方,really完全符合?这是否可以证明使用feof
and ferror
在循环的条件部分(看起来很可怕)?例如,while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }
功能fgetc()
返回一个int
值范围为unsigned char
仅当读取到正确的字符时,否则返回EOF
这是类型的负值int
.
我原来的答案(我改变了它)假设有一个整数转换为int
,但事实并非如此,因为实际上该函数fgetc()
已经返回类型的值int
.
我认为,为了符合要求,实施必须做出fgetc()
返回范围内的非负值int
, 除非EOF
被返回。
这样,从 32768 到 65535 的值范围将永远不会与 TMS320C55x 实现中的字符代码关联。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)