【C 学习】12.2-函数补充

"知道做不到就是不知道"

一、函数原型

一般情况下,main()函数都放在编辑页面的最后,因为C的编译器是自上而下的分析代码。

cs 复制代码
#include<stdio.h>

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

int main(){
    int a = 1;
    int b = 2;
    int result;
    result = sum(a,b);
    printf("%d",result);
    return 0;
}

但是如果想要在排布上让main()函数放在最前面,而所用到的功能函数的具体复杂实现都放在后面,则需要把函数的头放在main()函数的前面,记得加分号,这叫做函数的声明(区别与函数的定义)。

cs 复制代码
#include<stdio.h>

//函数声明
int sum(int, int);

int main(){
    int a = 1;
    int b = 2;
    int result;
    result = sum(a,b);
    printf("%d",result);
    return 0;
}

//函数定义
int sum(int a,int b){
    int c;
    c=a+b;
    return c;
}

函数原型------函数头,以分号结尾 ;其目的就是告诉编译器这个函数长什么样子:名称、参数(数量及类型)、返回类型。

函数原型里面可以没有参数名称:比如 void sum(int ,int )

二、局部变量

函数每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行独有的,称作局部变量。定义在函数内部的就是局部变量,参数也是局部变量。

  1. 变量的生存期和作用域:"大括号";

  2. 在不同的函数里面就有不同的变量作用空间,彼此之间的变量访问是不存在交叉的;

cs 复制代码
#include <stdio.h>

int main() {
    int outer_var = 10; // 函数级局部变量
    
    printf("outer_var (函数级): %d\n", outer_var);
    
    { // 开始代码块
        int inner_var = 20; // 块级局部变量
        printf("inner_var (块内): %d\n", inner_var);
        printf("outer_var (块内访问): %d\n", outer_var); // 可以访问外部变量
        
        { // 嵌套代码块
            int nested_var = 30; // 嵌套块级变量
            printf("nested_var (嵌套块内): %d\n", nested_var);
        } // nested_var 在此被销毁
        
        // printf("nested_var: %d\n", nested_var); // 错误:nested_var 已不可访问
    } // inner_var 在此被销毁
    
    // printf("inner_var: %d\n", inner_var); // 错误:inner_var 已不可访问
    printf("outer_var (函数级): %d\n", outer_var);
    
    return 0;
}


1. 作用域层次
​​outer_var​​:函数级局部变量,在整个 main函数内可见
​​inner_var​​:块级局部变量,仅在第一个 {}代码块内可见
​​nested_var​​:嵌套块级变量,仅在嵌套的 {}代码块内可见
2. 作用域规则
内层代码块可以访问外层变量(如块内可访问 outer_var)
外层代码块不能访问内层变量(尝试在块外访问 inner_var会导致编译错误)
同名变量在内层会屏蔽外层变量



//预期输出
outer_var (函数级): 10
inner_var (块内): 20
outer_var (块内访问): 10
nested_var (嵌套块内): 30
outer_var (函数级): 10

3. 规则

a) 本地变量是定义在块内的(可以是函数的,也可以是语句的,甚至可以是随便拉一对大括号来定义变量);

b) 程序运行进入到这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了;

c) 在块的外面定义的变量,在块里面仍然有效;

d) 在块里面定义的变量和外面的变量同名,则在块内部使用该变量的时候就掩盖外面的变量,即就近原则(同时,如果在块外面使用该同名变量,只能使用块外变量);

e) 在同一个块里面就不能定义同一个变量;

f) 本地变量不会被默认的初始化。

三、参数传递

  1. C语言在调用函数的时候 ,永远只能把值传给函数。

如果想要实现参数的同步修改,后面会讲到指针(c++中是引用)。

  1. 调用函数时给的值与参数类型不匹配,是C语言传统上最大的漏洞。编译器总是悄悄把类型转好,但这种转换往往和期望的不一样。

四、其他补充知识点

  1. 逗号运算符,取括号中最后一个变量的值作为运算结果。
cs 复制代码
#include <stdio.h>

int main() {
    int a, b, c;
    
    // 逗号运算符的简单使用
    c = (a = 5, b = a + 3, a + b); 
    printf("a = %d, b = %d, c = %d\n", a, b, c); 
    // 输出:a = 5, b = 8, c = 13(5+8)
    
    return 0;
}

*在函数的参数列表中的逗号仅是标点符号,不产生运算结果,如f(a, b)。

但是 **f((a, b))**指的是先做括号里面的运算,在作为参数传递给 f() 函数,即f(b)。

  1. 可以在函数里面定义或者使用其它函数,但是不允许在函数中存在其他函数的声明!

  2. int main(){}return 0来保证运行无错;本质上是一个函数。

写在最后:

更新C语言学习笔记

如有错误,烦请多多批评指正!

相关推荐
微露清风5 小时前
系统性学习C++-第五讲-内存管理
java·c++·学习
小张的博客之旅7 小时前
2025年“羊城杯”网络安全大赛 线上初赛 (WriteUp)
python·学习·网络安全
晚枫~8 小时前
零基础快速上手Playwright自动化测试
javascript·python·测试工具·c#·自动化
~无忧花开~8 小时前
JavaScript学习笔记(二十八):JavaScript性能优化全攻略
开发语言·前端·javascript·笔记·学习·性能优化·js
机器学习之心8 小时前
PINN物理信息神经网络风电功率预测!引入物理先验知识嵌入学习的风电功率预测新范式!Matlab实现
神经网络·学习·matlab·风电功率预测·物理信息神经网络
爱编程的鱼8 小时前
C# 变量详解:从基础概念到高级应用
java·算法·c#
HalvmånEver8 小时前
红黑树实现与原理剖析(上篇):核心规则与插入平衡逻辑
数据结构·c++·学习·算法·红黑树
BreezeJuvenile9 小时前
外设模块学习(5)——DS18B20温度传感器(STM32)
stm32·嵌入式硬件·学习·温度传感器·ds18b20
cimeo9 小时前
【C学习】13-数组使用与运算
学习·c#