C中有符号的无符号对象比较:是否存在任何不会导致转换的运算符?

Har*_*ari 0 c type-conversion

来自K&R C.

A.6.5算术转换 许多运算符以类似的方式引起转换并产生结果类型.效果是将操作数引入一个公共类型,这也是结果的类型.这种模式称为通常的算术转换.

在下面的代码中,EOF被定义为-1,这是一个带符号的整数常量,然后ch应该转换为int,而while循环应该最终退出,但似乎不会发生!因此Qn.

int main()
{
 unsigned char ch;
 FILE* fp;
 fp = fopen("myfile.txt","r");
 while((ch=getc(fp)) != EOF)
 {
  printf("%c", ch);
 }
 fclose(fp);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

Lin*_*cer 5

getc返回一个int(因为它必须能够保存所有字符值以及EOF).

在您的代码中,您将此值截断为unsigned char分配给它ch.然后你将它扩展为int,这将永远不会导致EOF,因为-1截断变为255,这将成为int255.