【0基础到备战蓝桥杯】Day11

1. 嵌套和链式访问

1.1. 嵌套调用

嵌套调⽤就是函数之间的互相调⽤,每个函数就像⼀个乐⾼零件,正是因为多个乐⾼的零件互相⽆缝的配合才能搭建出精美的乐⾼玩具,也正是因为函数之间有效的互相调⽤,最后写出来了相对⼤型的程序。

假设我们计算某年某⽉有多少天?如果要函数实现,可以设计2个函数:

is_leap_year():根据年份确定是否是闰年

get_days_of_month():调⽤is_leap_year确定是否是闰年后,再根据⽉计算这个⽉的天数

int is_leap_year(int y)
{
    if(((y%4==0)&&(y%100!=0))||(y%400==0))
        return 1;
    else
        return 0;
}
int get_days_of_month(int y, int m)
{
    int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int day = days[m];
    if (is_leap_year(y) && m == 2)
        day += 1;
    return day;
}
int main()
{
    int y = 0;
    int m = 0;
    scanf("%d %d", &y, &m);
    int d = get_days_of_month(y, m);
    printf("%d\n", d);
    return 0;
}

这⼀段代码,完成了⼀个独⽴的功能。代码中反应了不少的函数调⽤:

  • main 函数调⽤ scanf 、 printf 、 get_days_of_month
  • get_days_of_month 函数调⽤ is_leap_year

未来的稍微⼤⼀些代码都是函数之间的嵌套调⽤,但是函数是不能嵌套定义的。

1.2. 链式访问

所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数,像链条⼀样将函数串起来就是函数的链式访问。

例如:

#include <stdio.h> 
int main() 
{ 
    int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度 
    printf("%d\n", len);//2.打印⻓度 
    return 0; 
}

前⾯的代码完成动作写了2条语句,把如果把strlen的返回值直接作为printf函数的参数呢?这样就是⼀个链式访问的例⼦了。

#include <stdio.h> 
int main() 
{ 
    printf("%d\n", strlen("abcdef"));//链式访问 
    return 0; 
}

在看⼀个有趣的代码,下⾯代码执⾏的结果是什么呢?

#include <stdio.h> 
int main() 
{ 
    printf("%d", printf("%d", printf("%d", 43))); 
    return 0; 
}

2. 函数的声明和定义

⼀般我们在使⽤函数的时候,直接将函数写出来就使⽤了。

⽐如:我们要写⼀个函数判断⼀年是否是闰年。

#include <stido.h> 
//判断⼀年是不是闰年 
    int is_leap_year(int y) 
{ 
    if(((y%4==0)&&(y%100!=0)) || (y%400==0)) 
        return 1; 
    else 
        return 0; 
} 
int main() 
{ 
    int y = 0; 
    scanf("%d", &y); 
    int r = is_leap_year(y); 
    if(r == 1) 
        printf("闰年\n"); 
    else 
        printf("⾮闰年\n"); 
    return 0; 
}

函数或参数无非三种表达形式:声明、定义、引用。

  • 如果没有定义,只有声明和调用:编译时会报连接错误。undefined reference to `func_in_a'
  • 如果没有声明,只有定义和调用:编译时一般会报警告,极少数情况下不会报警告。但是最好加上声明。
  • 如果没有调用,只有定义和声明:编译时一般会报警告(有一个函数没有使用),有时不会报警告。这时候程序执行不会出错,只是你白白的写了几个函数,而没有使用浪费掉了而已。

函数的调⽤⼀定要满⾜,先声明后使⽤

函数的定义也是⼀种特殊的声明,所以如果函数定义放在调⽤之前也是可以的。

定义函数的语法:

返回值类型 函数名(参数列表) {
    函数体;
    return 返回值; // 如果返回值类型不是 void,则需要返回一个值
}
  • 返回值类型:指定函数返回的数据类型,例如 int(整数)、float(浮点数)、void(无返回值)等;
  • 函数名:函数的标识符,用于调用时引用,命名规则与变量相同(字母、数字、下划线组成,首位不能是数字);
  • 参数列表:定义函数接受的输入,可以为空,用括号 ( ) 包裹,多个参数用逗号分隔;
  • 函数体:用大括号 { } 包裹,包含函数的具体逻辑;
  • return 语句:用于返回结果并结束函数执行,如果返回值类型是 void,可以省略。

例题:

计算两个整数之和的函数

int add(int a, int b) {
    int sum = a + b;
    return sum;
}

定义好函数后,我们需要通过调用来执行它。函数调用通常是将函数名加上参数(如果有)写在程序中合适的位置。调用时,程序会跳转到函数定义处,执行其中的代码,然后返回到调用点继续执行。

调用函数的语法如下:

函数名(实参列表);



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值