zoukankan      html  css  js  c++  java
  • C语言之函数

    函数的定义

    1.逻辑上:能够完成特定功能的独立的代码块。

    2.物理上:能够接收数据【也可以不接收数据】,能够对接收的数据进行处理【也可以不对数据进行处理】,能够将数据处理的结果返【也可以没有返回值】。

    3.函数定义的本质:详细描述函数之所以能够实现某个特定功能的具体方法。

    语法

    返回值类型 函数名(形式参数列表)
    {
    	函数体;
    }
    

    返回值类型:用户需要函数返回的数据类型。
    函数名:代表的是函数的入口地址。
    形式参数列表:就是用户将函数外部数据传入函数内部的 局部变量。
    函数体:函数的具体功能代码。

    代码示例

    void max()
    {
        printf("最大值是:%d
    ")
    }
    

    形式参数列表(形参)

    形参在函数定义的时候没有空间,只有在调用函数的时候形参才有空间。函数调用完形参自动释放。

    代码示例

    void max(int a, int b)
    

    注意:在定义函数的时候,不要给形参赋值

    函数存在的意义

    • 避免了重复性操作。
    • 有利于程序的模块化

    代码实现

    # include <stdio.h>
    
    // 函数声明
    void max(int i, int j)
    {
        //max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
        if (i > j){
           printf("%d
    ", i);
        }else{
          printf("%d
    ", j);  
        }
    }
    
    int main(void)
    {	
        // 1.定义变量
        int a, b, c, d, e, f;
    
        a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
        // 调用函数
        max(a, b);
        max(c, d);
        max(e, f);
        /*
        if (a > b)
        printf("%d
    ", a);
        else
        printf("%d
    ", b);
    
        if (c > d)
        printf("%d
    ", c);
        else
        printf("%d
    ", d);
    
        if (e > f)
        printf("%d
    ", e);
        else
        printf("%d
    ", f);
        */
        return 0;
    }
    

    return 表达式含义

    return是终止被调函数,向主调函数返回表达式的值,如果表达式为空,则只终止函数,不向被主函数返回任何值。

    代码示例

    # include <stdio.h>
    
    int f()
    {
        //因为函数的返回值类型是int  所以最终f返回的是10而不是10.5
        return 10.5;  
    }
    
    int main(void)
    {
    	int i = 99;
    	double x = 6.6;
    	
    	x = f();
    	printf("%lf
    ", x);
    
    	return 0;
    }
    

    Break语句

    是用来终止(就近的)循环和switch语句。而return是用来终止被调函数的。

    # include <stdio.h>
    
    void fmin(void)
    {
    	int i;
    
    	for (i=0; i<5; ++i)
    	{
    		printf("大家辛苦了!
    ");
    		return;   //return是终止函数的
    	}
    	printf("同志们好!
    ");
    }
    
    int main(void)
    {
    	fmin();
    	return 0;
    }
    

    函数的分类

    • 有参函数和无参函数。
    • 有返回值和无返回值。
    • 库函数和用户自定义函数。
    • 普通函数和主函数(main函数)

    注意事项

    1.一个程序有且只有一个主函数。
    2.主函数可以调用普通函数,普通不能调用主函数。
    3.普通函数可以相互调用。
    4.主函数是程序的入口,也是函数的出口。值传递函数和地址传递函数。
    

    代码示例

    # include <stdio.h>
    
    //max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
    void max1(int i, int j)
    {
    	if (i > j)
    		printf("%d
    ", i);
    	else
    		printf("%d
    ", j);
    }
    
    int max2(int i, int j)
    {
    	if (i > j)
    		return i;
    	else
    		return j;
    }
    
    int main(void)
    {
    	int a, b, c, d, e, f;
    	a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
    
    	printf("%d
    ", max2(a, b));
    	printf("%d
    ", max2(c, d));
    	printf("%d
    ", max2(e, f));
    
    /*
    	max1(a, b);
    	max1(c, d);
    	max1(e, f);
    */
    	return 0;
    }
    

    例子声明

    //判断一个数是否素数,该数只能被1和本身整除
    # include <stdio.h>
    bool IsPrime(int val)
    {
        // 1.定义变量
    	int i;
        // 2.变量循环
    	for (i=2; i<val; ++i)
    	{
    		if (val%i == 0)
    			break;
    	}
    	if (i == val)
    		return true;
    	else
    		return false;
    }
    
    int main(void)
    {
    	int m;
    	scanf("%d", &m);
    	
    	if ( IsPrime(m) )
    		printf("Yes!
    ");
    	else
    		printf("No!
    ");
    
    	return 0;
    }
    

    函数的声明

    # include <stdio.h>
    
    void fmax(void); //函数声明, 分号不能丢掉
    
    int main(void)
    {
    	fmax();
    
    	return 0;
    }
    
    void fmax(void)
    {
    	printf("哈哈!
    ");
    }
    
    

    注意

    当函数没有返回值时,那么规范的写法是要在函数中写明void的。如果函数调用写在了函数定义的前面,则必须加函数前置声明。

    代码示例

    # include <stdio.h>
    
    //void fmin(void);  //9行
    
    void gmin(void)
    {
    	fmin();  //因为函数f的定义放在了调用f语句的后面,所有语法出错
    }
    
    void fmin(void)
    {
    	printf("哈哈!
    ");
    }
    
    int main(void)
    {
    	gmin();
    
    	return 0;
    }
    

    形参和实参的关系

    • 形参和实参个数是一一对应的。
    • 形参和实参的位置也是一一对应的。
    • 形参和实参的数据类型需要相互兼容。
    # include <stdio.h>
    void f(int i, float x)  //形参
    {
    	printf("%d
    ", i);
    }
    int main(void)
    {
    	f(9.9, 6.6); //实际参数
    
    	return 0;
    }
    

    案列1

    判断一个数是否是素数

    代码示例

    # include <stdio.h>
    
    //  判断一个数是否是素数
    int main(void)
    {
    	int val;
    	int i;
    
    	scanf("%d", &val);
    	for (i=2; i<val; ++i)
    	{
    		if (0 == val%i)
    			break;
    	}
    	if (i == val)
    		printf("Yes!
    ");
    	else
    		printf("No!
    ");
    
    	return 0;
    }
    

    函数版代码示例

    # include <stdio.h>
    //  判断一个数是否是素数,函数实现
    
    bool IsPrime(int val)
    {
    	int i;
    
    	for (i=2; i<val; ++i)
    	{
    		if (0 == val%i)
    			break;
    	}
    	if (i == val)
    		return true;
    	else
    		return false;
    }
    
    int main(void)
    {
    	int val;
    	int i;
    
    	scanf("%d", &val);
        
    	if ( IsPrime(val) )
    		printf("Yes!
    ");
    	else
    		printf("No!
    ");
    
    	return 0;
    }
    

    案例2

    求1到某个数字之间(包括该数字)所有的素数。

    代码示例

    /*
    求1到某个数字之间(包括该数字)所有的素数,并将其输出
    只用main函数实现,有局限性:
    	1. 代码的重用性不高
    	2. 代码不容易理解		
    */
    # include <stdio.h>
    int main(void)
    {
    	int val;
    	int i;
    	int j;
    
    	scanf("%d", &val);
    	for (i=2; i<=val; ++i)
    	{
    		//判断i是否是素数,是输出,不是不输出
    		for (j=2; j<i; ++j)
    		{
    			if (0 == i%j)
    				break;
    		}
    		if (j == i)
    			printf("%d
    ", i);
    	}
    	return 0;
    }
    

    函数代码示例

    /*
    	用两个函数来实现求1到某个数字之间所有的素数,并将其输出
    	代码量更少,可重用性更高
    */
    # include <stdio.h>
    
    //本函数的功能是: 判断m是否是素数,是返回true,不是返回false
    bool IsPrime(int m)
    {
    	int i;
    		
    	for (i=2; i<m; ++i)
    	{
    		if (0 == m%i)
    			break;
    	}
    	if (i == m)
    		return true;
    	else
    		return false;
    
    }
    
    //本函数的功能是把1到n之间所有的素数在显示器上输出
    void TraverseVal(int n)
    {
    	int i;
    
    	for (i=2; i<=n; ++i)
    	{
    		if ( IsPrime(i) )
    			printf("%d
    ", i);
    	}
    }
    
    int main(void)
    {
    	int val;
     
    	scanf("%d", &val);
    	TraverseVal(val);
    
    	return 0;
    }
    

    变量的作用域

    局部变量

    局部变量
    在一个函数内部定义的变量或者函数的形参,都统称为局部变量。
    void f(int i)
    {
        int j = 20;
    }
    i和j都是局部变量
    

    局部变量的使用范围只能在本函数内部使用

    全局变量

    在所有函数外部定义的变量叫做全局变量。
    全局变量使用范围:从定义位置开始到整个程序结束。
    

    代码示例

    # include <stdio.h>
    
    /*
    	一定要明白该程序为什么是错的,
    	也要明白把9到12行代码放在14行后面,为什么程序就OK了
    */
    
    void gmin()  //9
    {
    	printf("k = %d
    ", k);
    } //12
    
    int k = 1000;  //14行
    
    void fmax(void)
    {
    	gmin();
    	printf("k = %d
    ", k);
    }
    
    int main(void)
    {
    	fmax();
    	return 0;
    }
    

    变量命名冲突

    在同一个范围之内不能定义两个一样的局部变量

    /*
    在一个函数内部,如果定义的局部函数的名字和全局变量名一样时,
    局部变量会屏蔽掉全局变量,上例中最终的输出结果是8。
    因为局部变量把全局变量给屏蔽掉了
    */
    # include <stdio.h>
    int i = 99;
    
    void fmax(int i)
    {
    	printf("i = %d
    ", i);
    }
    
    int main(void)
    {
    	fmax(8);
    
    	return 0;
    }
    
  • 相关阅读:
    HDU 5818 Joint Stacks (优先队列)
    POJ 3169 Layout (差分约束系统)
    HDU 4370 0 or 1 (最短路+最小环)
    LightOJ 1074 Extended Traffic (最短路spfa+标记负环点)
    HDU 1142 A Walk Through the Forest (求最短路条数)
    力扣71——简化路径
    力扣73——矩阵置零
    ThreadLocal的进化——TransmittableThreadLocal
    ThreadLocal的进化——InheritableThreadLocal
    Java——内部类详解
  • 原文地址:https://www.cnblogs.com/Guard9/p/12905124.html
Copyright © 2011-2022 走看看