根据C标准,返回的任何字符fgetc都以unsigned char值的形式返回,"转换为int"(该引用来自C标准,表明确实存在转换).
当sizeof (int) == 1,许多unsigned char值超出范围.因此,这些unsigned char值中的一些可能最终被转换为一个int值(转换的结果是"实现定义的或实现定义的信号被引发")EOF,尽管文件实际上并不存在,但它将被返回处于错误或文件结束状态.
我惊讶地发现这样的实现确实存在.TMS320C55x CCS手册文档UCHAR_MAX的相应值为65535,INT_MAX具有32767,fputs并fopen支持二进制模式......更令人惊讶的是,它似乎将环境描述为完全符合的完整实现(减去信号).
C55x C/C++编译器完全符合ISO规范定义的ISO C标准......
编译器工具带有完整的运行时库.所有库函数都符合ISO C库标准....
这样的实现是否可以返回一个值,表示没有的错误,真的完全符合?这是否可以证明在循环的条件部分中使用feof和ferror(看起来很可怕)?例如,while ((c = fgetc(stdin)) != EOF || !(feof(stdin) || ferror(stdin))) { ... }
仅当读取到正确的字符时,该函数才fgetc()返回int范围内的值,否则返回类型的负值。 unsigned charEOFint
我原来的答案(我更改了它)假设有一个整数转换为int,但事实并非如此,因为实际上该函数fgetc()已经返回类型为 的值int。
我认为,为了保持一致,实现必须fgetc()返回 范围内的非负值int,除非EOF返回。
这样,从 32768 到 65535 的值范围将永远不会与 TMS320C55x 实现中的字符代码关联。