This question already has answers here:
Can sizeof(int) ever be 1 on a hosted implementation?
(8个答案)
5年前关闭。
根据the C standard,由
当
我很惊讶地发现这样的实现确实存在。 TMS320C55x CCS manual记录了对应值65535的
这样的实现是否可以返回一个值,该值指示完全没有错误的错误?这是否可以在循环的条件部分使用
(8个答案)
5年前关闭。
根据the C standard,由
fgetc
返回的任何字符都以unsigned char
值的形式返回,“转换为int
”(引用来自C标准,表示确实存在转换)。当
sizeof (int) == 1
时,许多unsigned char
值超出范围。因此,这些unsigned char
值中的某些可能最终会转换为int
的EOF
值(转换的结果为"implementation-defined or an implementation-defined signal is raised"),尽管文件实际上未处于错误或文件末尾,该值仍会返回状态。我很惊讶地发现这样的实现确实存在。 TMS320C55x CCS manual记录了对应值65535的
UCHAR_MAX
,具有32767的INT_MAX
,fputs
和fopen
支持二进制模式……更令人惊讶的是,它似乎将环境描述为一个完全符合要求的完整实现(减去信号)。这样的实现是否可以返回一个值,该值指示完全没有错误的错误?这是否可以在循环的条件部分使用
feof
和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实现中的字符代码相关联。
关于具有sizeof(int)== 1 "fully conform"的实现可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30836207/