当前位置: 首页 > news >正文

函数初体验

请按顺序标示出指定语句的执行顺序(如 A -> B -> C -> D)

#include <stdio.h>

void a();
void b();
void c();

void a()
{
        ; // A
}

int main()
{
        b(); // B
        a(); // C
        c(); // D

        return 0;
}

void c()
{
        ; // E
}

void b()
{
        ; // F
}

答:B -> F -> C -> A -> D -> E

注:什么都没有只写一个分号(;)表示这是一个空语句,什么也不做。

#include <stdio.h>

void func()

int main()
{       
        func();

        return O;
}

void func()
{
        print("I love FishC.com!\n");

        return 0;
};

#include <stdio.h>

void func(); // A. 声明语句需要分号结束

int main()
{       
        func();

        return O; // B. 返回数字0不是字母0
}

void func()
{
        print("I love FishC.com!\n"); // C. 格式化输出的标准库函数是printf

        return 0; // D. 返回值是void的函数不需要使用return语句返回
} // E. 这里不应该加分号

函数的声明有什么用?

答:所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。

有时候,你可能会发现及时不写函数的声明,程序也是可以正常执行的。但如果你把函数的定义写在调用之后,那么编译器可能就会找不着北了:

#include <stdio.h>

int main()
{
        print_C();

        return 0;
}

void print_C()
{
        printf(" ###### \n");
        printf("##    ##\n");
        printf("##      \n");
        printf("##      \n");
        printf("##      \n");
        printf("##    ##\n");
        printf(" ###### \n");
}

程序执行后会弹出提醒(一些比较旧的编译器甚至会报错):

这是因为程序的编译时从上到下执行的,所以从原则上来说,函数必须“先定义,再调用”。向上边例子反其道而行就会出问题。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。

 函数是否必须声明才能使用?

答:对于函数来说,必须“先定义,再调用”。但声明却不是必须的,只要“被调用函数”的定义在“调用函数”之前即可。但是,作为一个良好的编程习惯,建议大家还是无论如何都把函数的声明写上比较合适。

如果定义一个与标准库函数重名的函数,会这样?答:重新定义的同名函数会覆盖标准库函数(前提是两者的声明一致,包括返回值和参数类型、个数一致)。

比如下面我们把 putchar 函数给覆盖掉: 

#include <stdio.h>

int putchar(int c);

int putchar(int c)
{
        printf("FishC\n");

        return c;
}

int main(void)
{
        putchar('H');

        return 0;
}

程序实现如下:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java8-求两个集合取交集
  • whaler_通过镜像导出dockerfile
  • 【我的OpenGL学习进阶之旅】讲一讲GL_TEXTURE_2D和GL_TEXTURE_EXTERNAL_OES的区别
  • 【Linux】管道通信和 system V 通信
  • 独占电脑资源来执行一个应用
  • 1111111111111111111111
  • uni-app全局文件与常用API
  • Redis在SpringBoot中配置
  • 【1.0】drf初识
  • 如何使用 API list 极狐GitLab 群组中的镜像仓库?
  • Docker 部署常用中间件(redis,rabbitMQ,mysql8,es,kibana,nginx等)亲测成功~~~
  • Linux没有telnet 如何测试对端的端口状态
  • c++中的斐波那契数列(Fibonacci Sequence)和背包问题(Knapsack Problem)
  • 3. 类的生命周期
  • 深度学习loss
  • [译] React v16.8: 含有Hooks的版本
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android 控件背景颜色处理
  • CSS中外联样式表代表的含义
  • Java深入 - 深入理解Java集合
  • JS+CSS实现数字滚动
  • JS变量作用域
  • Leetcode 27 Remove Element
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Quartz初级教程
  • rc-form之最单纯情况
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 从零开始在ubuntu上搭建node开发环境
  • 读懂package.json -- 依赖管理
  • 二维平面内的碰撞检测【一】
  • 构建二叉树进行数值数组的去重及优化
  • 将回调地狱按在地上摩擦的Promise
  • 京东美团研发面经
  • 一些css基础学习笔记
  • 用element的upload组件实现多图片上传和压缩
  • 运行时添加log4j2的appender
  • 责任链模式的两种实现
  • 走向全栈之MongoDB的使用
  • Java性能优化之JVM GC(垃圾回收机制)
  • Java总结 - String - 这篇请使劲喷我
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​Spring Boot 分片上传文件
  • #pragma 指令
  • (20)docke容器
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (汇总)os模块以及shutil模块对文件的操作
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net 7 上传文件踩坑
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET单元测试
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ::前边啥也没有