其原因纯粹是历史的。请注意,在C语言(K& R C)的旧时代,没有功能原型。那些时代的strchr功能将被声明为

char *strchr();

并以K& R风格定义为

char *strchr(s, c)

char *s;

char c;

{

/* whatever */

}

然而,如果在没有原型的情况下声明函数(如上所示),C语言(在K& R C和现代的)中,每个函数调用中传递的参数都受到所谓的默认参数的提升。在默认参数促销下,小于int(或unsigned int)的整数类型始终转换为int(或unsigned int)。即当参数未声明时,每当您将char值作为参数传递时,此值将隐式转换为int,实际上以int形式传递。简而言之也是如此。 (BTW,float通过默认参数促销转换为双倍)。如果在函数内部的参数实际上被声明为一个char(如上面的K&R样式定义),它将被隐式转换回char类型并在函数中用作char。这是它在K& R时代的工作原理,实际上它在现代C中如何运作,当功能没有原型或使用可变参数时。

现在,C语言中的C语言具有函数原型,并使用了现代风格的函数定义语法。为了保留和复制strchr的“传统”功能,如上所述,除了将strchr的参数声明为int并将其明确转换为函数中的char外,我们别无选择。这正是你在引用的代码中观察到的。这正如标准中描述的strchr的功能一样。

此外,如果您有一个已经编译的遗产库,其中strchr是如上所示的K&R风格定义的,并且您决定为该库提供现代原型,则对于strchr的适当声明将为

char *strchr(const char *s, int c);

因为int是上述传统实现期望的物理接收为c。用char参数声明它将是不正确的。

因此,您将永远不会看到“传统”标准库函数,期望char,short或float类型的参数。所有这些函数将被声明为int或double类型的参数。

一个非常相同的理由背后是char指针和void *指针共享相同的表示和对齐要求的标准保证。依靠这个保证,你可以将malloc声明为一个void * -returning函数,然后使用这个声明与预编译的标准库的旧版本,其中malloc实际返回char *。

参考:C99的理由,版本5.10

7.1.4 Use of library functions /–/ All library prototypes are specified in terms of the “widened” types: an argument formerly declared as char is now written as int. This ensures that most library functions can be called with or without a prototype in scope, thus maintaining backwards compatibility with pre-C89 code

c语言 strchr 返回int,为什么strchr需要一个int来找到char?相关推荐

  1. int最大值java_Java 中一个int型数组的求最大值最小值 | 学步园

    小友今日看单元测试,发现的一个测试用例的代码.而测试的是某个类的最大值,最小值方法. 在此把测试类发上来.保留此地,如有人对此有兴趣,看以看下.闲话少说: public class MaxMinToo ...

  2. C语言 函数返回多个值方法

    通常我们都会遇到会要求我们利用相关步骤进行运算,并且其结果可能涉及到多个值,此时,利用函数较为方便,但是对于C语言来说,要求单一出口原则,只能返回一个值,这时就无法实现. 通常我们可以通过如下方法进行 ...

  3. C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别!

    C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别! unsigned int zero = 0; unsigned ...

  4. c语言strchr函数内容,c strchr函数_c语言strchr函数_strchr函数用法

    各位看官们,大家好,上一回中咱们说的是字符串比较的例子,这一回咱们说的例子是:字符串查找.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在C语言的标准库中为我们提供了字符串查找函数,我们 ...

  5. 用c语言编写函数Isprime,C语言问题。编写一个函数:int isprime(int n)用于判断一个整数是否为素数,如果是就返回1,否则返回0。...

    int isPrime(int num) { int divisor = 3; int testLimit = num; if (num < 2) return 0; if ( num < ...

  6. asin c语言中 返回值范围_大学C语言考试易错知识点总结

    作者:cggwz 来源:https://blog.csdn.net/cggwz/article/details/103740713?utm_medium=distribute.pc_relevant. ...

  7. C语言链表返回第n个到最后的节点的算法(附完整源码)

    C语言链表返回第n个到最后的节点的算法 C语言链表返回第n个到最后的节点的算法完整源码(定义,实现,main函数测试) C语言链表返回第n个到最后的节点的算法完整源码(定义,实现,main函数测试) ...

  8. C语言试题五十一之已知学生的记录是由学号和学习成绩构成,n名学生的数据已存入s结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分)。

    1. 题目 请编写一个函数void function(Student a[], int n, Student *s),其功能时:已知学生的记录是由学号和学习成绩构成,n名学生的数据已存入s结构体数组中 ...

  9. 演示Go语言多返回值功能

    演示Go语言多返回值功能 Go语言革命性地在静态开发语言阵营中率先提供了多返回值功能.这个特性让开发者可以从原来用各种比较别扭的方式返回多个值的痛苦中解脱出来,既不用再区分参数列表中哪几个用于输入,哪 ...

  10. c语言的返回类型是指针变量吗,C语言-指针类型

    改值场景示例 - 改变 n 的值 的函数 void change(int n) { n = 10; } int main() { int a = 20; - 这里只能把 变量a 的值传到 change ...

最新文章

  1. 一键部署dns服务_OpenShift : 通往云原生、DevOps、微服务和Serverless的大门
  2. SharePoint 检测页面编辑模式
  3. 【总结整理】如何做需求分析(转)
  4. MS SQL SERVER导出表结构到Excel
  5. python怎样实现封装_python 封装底层实现原理
  6. java学习(15):巩固练习
  7. java 编码实现内存拷贝_java提高篇(六)-----使用序列化实现对象的拷贝
  8. DHCP服务器--红色箭头
  9. 支付宝五福又来了,但已没人关心抢红包
  10. Asp.net MVP模式介绍
  11. zabbix 自动发现 自动添加主机
  12. WINRM实现端口复用后门
  13. Python turtle制作书法作品——《鸟鸣涧》
  14. 双拼域名价格高吗?关于双拼域名的几种解读
  15. java 生成证书图片_java生成自定义证书图片1 - 制作证书word模板
  16. 【ThreeJS基础教程】0.在学习使用ThreeJS之前
  17. 通过搜索引擎快速寻找漏洞
  18. 几何的对称之美——风筝定理
  19. 掘金全球最大商务差旅市场 SAP旗下Concur联合中数通进军中国
  20. 搜狗输入法 for Mac V6.6.0.13588官方版

热门文章

  1. 2019爪哇部落第十届新生选拔赛 题解
  2. 52单片机与MH-Sensor-Series模块使用简单检测车轮转速
  3. Java抽象类和接口(武磊绝杀塞尔塔纪念版)
  4. 图像平移 ——MATLAB实现
  5. 重要的统计量(期望、方差、协方差、相关系数、矩)的概念和性质
  6. 概率论与数理统计第一章 随机事件与概率 学习总结
  7. No enclosing instance of type 错误的解决方法
  8. 5G时代系列谈:(五)未来之势
  9. Java-除数为0时会报错的情况(一个无法理解的例外-被除数为0)
  10. 小米手机保护套自动锁屏功能