C语言-第33课 - 认清函数的真面目

第33课 - 认清函数的真面目

一.概念

  1. 函数的由来

程序 = 数据 + 算法

C程序 = 数据 + 函数

我们下面分析一下汇编语言,汇编语言是从上到下顺序执行的,汇编为了循环执行,就有了跳转指令。通过来回的跳转,就存在了不同的功能模块,这也就是我们C语言中的函数的原型。

  1. 函数的意义

模块化程序设计:

C语言中的模块化:

  1. 面向过程的程序化设计

(1) 面向过程是一种以过程为中心的编程思想。

(2) 首先将复杂的问题分解为一个个容易解决的问题。

(3) 分解过后的问题可以按照步骤一步步完成。

(4) 函数是面向过程在C语言中的体现。

(5) 解决问题的每个步骤可以用函数来实现。

二. (函数)声明和(函数)定义

首先声明和定义是不同的。

程序中的声明可以理解为预先高旭编译器实体的存在,如:变量,函数,等等。

程序中的定义明确指示编译器实体的意义。

例如:

// global.c

// int g_var = 0;   定义

#include <stdio.h>

extern int g_var;  //声明

void f(int i, int j);  /*声明,提前声明,下面的使用就是合法的,否则提前使用不合法。*/

int main()

{

int g(int x);

g_var = 10;

f(1, 2);

printf("%d\n", g(3));

return 0;

}

void f(int i, int j)

{

printf("i + j = %d\n", i + j);

}

int g(int x)

{

return 2 * x + g_var;

}

三. 函数

  1. 函数的参数

l 函数参数在本质上与局部变量相同,都是在栈上分配空间。

l 函数参数的初始值是函数调用时的实参值。

例:

#include <stdio.h>

int f(int i, int j)

{

printf("%d, %d\n", i, j);

}

int main()

{

int k = 1;

f(k, k++);

printf("%d\n", k);

return 0;

}

在windows的c++环境中运行的结果是:

1,1

2

在linux的gcc编译器中,运行结果是:

2,1

2

  1. 盲点

函数参数的求职顺序依赖于编译器的实现。

C语言中大多数运算符对其操作数求值的顺序都依赖于编译器的实现的。

我们看下面一段程序:

int i = f() * g();

到底是f还是g先调用,我们不能确定,在不同的编译器中会有不同的效果。

  1. 程序中的顺序点

(1) 程序中存在一定的顺序点。

(2) 顺序点指的是执行过程中修改变量的最晚时刻。

(3) 在程序达到顺序点的时候,之前所做的一切操作必须反映到后续的访问中。

  1. 如何找顺序点

(1) 每个完整表达式结束时。

(2) &&,||,?:,以及都哈表达式的每个运算对象之后。

(3) 函数调用中对所有实际参数的求值完成之后(进入函数体之前)。

下面看一个例子:

#include <stdio.h>

int main()

{

int k = 2;

int a = 1;

k = k++ + k++;

printf("k = %d\n", k);

if( a-- && a )  //左边的是1,右边的是0。

{

printf("a = %d\n", a);

}

return 0;

}

运行结果:6

分析:k = k++ + k++;中分号才是数据点,k++操作是在2的基础上自增,但是这个结果不会瞬间反映到k的值上(因为是后置)。第二个k++也是在2的基础上自增1。在到达数据点之前,k的值会是4。到达分号的时候,我们再完成之前的两次自增的操作,加了两次1,k的值变成6。

改成k = k++ + ++k;或者 k = ++k + k++;   运行结果是7。

改成k = ++k + ++k;                   运行结果是8。

  1. 函数的缺省认定

C语言会默认没有类型的函数的参数为int。

f(i,j)

{

return i+j;

}

等价于:

f(int i, int j)

{

return i+j;

}

小结:

l C语言是一种面向过程的语言。

l 函数可以理解为解决问题的步骤。

l 函数的实参并没有固定的计算次序。

l 顺序点是C语言中变量改变的最晚时机。

l 函数定义时函数和返回值的缺省类型为int。

原文地址:https://www.cnblogs.com/free-1122/p/9794693.html

时间: 2024-08-28 08:07:24

C语言-第33课 - 认清函数的真面目的相关文章

第33课 main函数与命令行参数

1. main函数的概念 (1)C语言中main函数称之为主函数 (2)一个程序是从main函数开始执行的 [编程实验]main函数的原型究竟是什么 //以下四个main函数都是合法的 //第1种 //main() //{ //} //第2种 //void main() //{ //} //第3种:——标准的入口函数 int main() { return 0; } //第3种:——标准的入口函数 //int main() //{ // //没写返回值 //} [思考]为什么编译器支持那么多种不

【C语言探索之旅】 第一部分第九课:函数

内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写 动

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|

C语言基础:数组作为函数参数传递演示源码

将做工程过程中常用的内容片段记录起来,如下内容内容是关于C语言基础:数组作为函数参数传递演示的内容,应该能对小伙伴也有好处. #include <stdio.h> void show_array(int values[], int number_of_elements) { int i; printf("About to display %d valuesn", number_of_elements); for (i = 0; i < number_of_elemen

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----02 printf和scanf函数、基本语句和运算、流程控制、函数、数组、字符串

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.printf函数 1.在使用peintf函数前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据,其中使用格式是 printf(“字符串”) :或者 printf(“字符串”, 格式符参数): 2.常用的格式符及其含义如图所示 3.格式符还可以添加输出宽度 二.scanf函数 1.在使用scanf函

【C++探索之旅】第一部分第七课:函数效应,分而治之

内容简介 1.第一部分第七课:函数效应,分而治之 2.第一部分第八课预告:传值引用,文件源头 函数效应,分而治之 上一课<[C++探索之旅]第一部分第六课:控制流程,随心所至>中,我们学习了条件语句和循环语句. 这两种语句也算是算法的核心了.在更早的课程中,我们学习了变量.这些都是所有编程语言的必备元素. 这一课我们又要学习一个几乎所有编程语言都有的极重要元素: 函数. C++的所有程序都或多或少用到函数,到目前为止,你其实也已经用了好多次了,不过你可能只缘身在此山中,还云深不知处. 函数的功

C语言样式的文件操作函数

使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: 1 //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 2 FILE* fd = fopen(filename.c_str(), oflag); 2.写文件的函数原型: size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream ); 其中buffer是需要向文件中写入的内容在内存中的首地址指针,size是待写入

【示例】C语言中利用数组存放函数指针

C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: int max(int,int); // 声明函数,比较两数大小 int (*p)(); //声明指向函数的指针变量 p=max; //将函数max的入口地址赋给指针变量p int c=(*p)(a,b); //调用函数 2.函数指针作为函数参数 该例子中每次给process函数不同实参(函数名)

C语言 字符串和数字转换函数

atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.参数nptr字符串可包含正负号.小数点或E(e)来表示指数部分,如123.456或123e-2.