据我所知,变量类型,例如之间的唯一差别char,int等等是记忆它们占据的量.我猜他们在调节他们所拥有的变量代表什么方面没有任何作用.如果这是真的,在这里,我看到以下内容strcmp:
strcmp函数将字符串s1与s2进行比较,返回一个与第一个不同字符对之间的差异具有相同符号的值(解释为unsigned char对象,然后提升为int).
我想问为什么结果会提升到int?由于chars被比较,它们的差异char在所有情况下都适合.因此,不推广结果int只是在结果的末尾附加一堆0?那么,为什么这样做呢?
Mik*_*our 28
char可能签署也可能不签署.strcmp必须返回一个签名类型,如果差异为负,则可以为负数.
更一般地说,int优选用于传递和返回简单数值,因为它被定义为这些值的"自然"大小,并且在某些平台上,处理比较小类型更有效.
Ran*_*832 11
当然,尽管其他人提到了溢出的可能性,但它只需要能够返回例如-1,0或1 - 这很容易适合签名的字符.真正的历史原因是,在20世纪70年代的C的原始版本中,函数无法返回char,并且任何尝试这样做都会导致返回int.
在这些早期的编译器中,int也是默认类型(很多情况,包括函数返回值,如下面的主要部分所示,允许你将int声明为int而不实际使用int关键字),因此定义任何函数都是有意义的特别需要返回一个不同的类型作为返回int.
即使是现在,无论如何,char返回只是将值符号扩展到int返回寄存器(pdp11上的r0,x86上的eax).将其作为char处理将不会有任何性能优势,而允许它作为实际差异而不是强制它为-1或1确实具有小的性能益处.对于比较运算符而言,axiac的答案也提出了不得不将其提升回int的好处.这些促销的原因也是历史性的,顺便说一下,编译器不必为char和int的每种可能组合实现单独的运算符,特别是因为许多处理器上的比较指令仅适用于int.
证明:如果我在Unix V6上为PDP-11制作测试程序,则会忽略char类型并返回该范围之外的整数值:
char foo() {
return 257;
}
main() {
printf("%d\n", foo());
return 0;
}
# cc foo.c
# a.out
257
Run Code Online (Sandbox Code Playgroud)