zoukankan      html  css  js  c++  java
  • C语言 笔记(函数)

    函数的定义

    Windows风格函数命名
    函数名使用“动词”或者“动词+名词”(动宾数组)的形式,如函数名GetMax等。而变量名使用“名词”或者“形容词+名词”的形式,如变量名oldValue与newValue等。

    在函数体内部定义的变量只能在函数体内访问,称为内部变量。
    函数头部参数表里的变量,称为形式参数(Parameter,形参),也是内部变量,即只能在函数体内访问。

    形参表是函数的入口。

    函数调用

    main函数调用其他函数时,必须提供一个称为实际参数(Argument,实参)的表达式给被调用的函数。
    调用其他函数的函数简称为主调函数。
    被调用的函数称为被调函数。
    主调函数把实参的值复制给被调函数的形参的过程,称为参数传递。

    注意:
    函数的返回值只能有一个,函数返回值的类型可以是除数组以外的任何类型。函数中的return语句可以有多个,但不表示函数可以有多个返回值。
    无需任何返回值的return语句可以写成:return;

    函数封装与防御性程序设计

    函数封装使得外界对函数的影响仅限于几个入口参数。而函数对外界的影响也仅限于一个返回值和数组、指针类型的参数,不仅便于各个函数单独测试、排错,也便于多人合作开发程序。

    程序的健壮性:
    程序具有遇到不正确使用或非法数据输入时仍能保护自己避免出错的能力

    在函数的入口处增加对函数参数合法性的检查,就是一种常用的增强程序健壮性的方法。像这种在程序中增加一些代码,用于专门处理某些异常情况的技术,称为防御性程序设计(Defensive Programming)。

    函数设计的基本原则:
    (1).函数规模要小,更容易维护,出错几率更小
    (2).功能要单一,不要设计多种用途的函数
    (3).只有一个入口和一个出口
    (4).在函数接口中清楚的定义函数的行为,定义好接口后,不要轻易改动。
    (5).在函数的入口处,对参数的有效性进行检查。
    (6).在执行某些敏感性操作(如执行除法、开方、取对数、赋值、函数参数传递等)之前,应检查操作数及其类型的合法性,以避免发生除零、数据溢出、类型转换、类型不匹配等因思维不缜密而引起的错误。
    (7).在函数调用的时候应该确保函数的实参类型和形参类型相匹配。
    (8).当函数需要返回值时,应确保函数中的所有控制分支都有返回值。没有返回值用void声明。
    (9).错误处理代码一般放在函数末尾,对于某些错误,还要设计专门的错误处理函数。

    变量的作用域和存储类型

    变量的作用域规则是:
    每个变量仅在定义它的语句块(包含下级语句块)内有效,并且拥有自己的储存空间。

    全局变量从程序运行开始起就占据内存,仅在程序结束时才将其释放,所谓释放内存,其实就是将内存中的值恢复为随机值(即乱码)。

    变量的存储类型

    在C语言中,变量和函数有数据类型和存储类型两个属性,因此变量定义的一般形式为:
    存储类型 数据类型 变量名表;

    变量的存储类型是指编译器为变量分配内存的方式,它决定变量的生存期,即决定变量何时“生”,何时“灭”。

    C语言提供了以下几种不同的存储类型:
    自动变量 auto 类型名 变量名;
    静态变量 static 类型名 变量名;
    外部变量 extern 类型名 变量名;
    寄存器变量 register 类型名 变量名;

    C语言把自动变量设计成缺省的存储类型,即auto可以省略不写。
    如果没有指定变量的存储类型,那么变量的存储类型就缺省为auto。
    自动变量的自动体现为在进入语句块时自动申请内存,退出语句块时自动释放内存。
    他仅能被语句块内的语句访问,在退出语句块以后不能再访问。
    因此,自动变量也被称为动态局部变量。
    因此,在不同的并列语句块内可以定义同名变量,不会互相干扰,因为它们各自占据着不同的内存单元,并且有着不同的作用域。

    在并列的语句块之间只能通过一些特殊通道传递数据,如函数参数,返回值,以及全局变量。因全局变量破坏了函数的封装性,所以不建议采用。

    自动变量在定义时不会自动初始化,初值即乱码。并且在退出函数后,分配的内存立即被释放。

    静态变量与全局变量:
    从生存期和作用域两个角度来分析,静态变量和全局变量都是在静态存储区分配内存的,都只分配一次储存空间并且都被初始化一次,都能自动初始化为0,其生存期都是整个程序运行期间,即从程序运行起就占据内存,程序退出时才释放内存。但作用域可能不同。

    在函数内定义的静态变量,称为静态局部变量,静态局部变量只能在定义它的函数内被访问,而在所有函数外定义的静态变量,称为静态全局变量,静态全局变量可以在定义它的文件内的任何地方被访问,但不能像非静态的全局变量那样被程序的其他文件所访问。

    如果在所有函数之外定义的变量没有指定其存储类别,那么它就是个外部变量。外部变量是全局变量,作用域从它的定义点到本文件的末尾。
    但是如果要在定义它之前或者在其他文件中使用它,那么就需要用关键字extern对其进行声明(注意不是定义,编译器并不对其分配内存)。

    寄存器变量就是用寄存器存储的变量。
    将需要频繁访问的数据存放在CPU内部的寄存器里,即将使用频率较高的变量声明为register,可以使程序更小,执行速度更快。

    模块化程序设计

    无论结构化方法还是面对对象方法,模块化的基本指导思想都是“信息隐藏”。即把不需要调用者知道的信息封装在模块内部,使模块的实现细节对外不可见。
    模块分解的基本原则:高聚合,低耦合,保证每个模块的相对独立性。

    模块化程序设计是指一个规模较大的系统的设计过程,表面上是将系统划分为若干子系统,任务划分若干子任务,其本质思想是要实现不同层次的数据或过程的抽象。

    自底向上:
    先编写出基础代码段,然后再扩大,补充和升级。

    自顶向下:
    先写出结构简单、清晰的主程序来表达整个问题,在此问题包含的复杂子问题用子程序来实现;若子问题中还包含着复杂的子问题,再用另一个子程序来解决,直到每个细节都可以用高级语言表达为止。

  • 相关阅读:
    2.创建第一个启用了服务和数据驱动的silverlight5应用程序
    1.搭建siverlight 5开发环境
    读《C程序设计语言》笔记1
    读《C程序设计语言》笔记2
    郑州轻工业大学OJ 2834.小凯的书架 题解 线段树二分
    洛谷P3834 【模板】可持久化线段树 2/POJ2104 Kth Number 题解 主席树
    洛谷P6883 [COCI20162017#3] Kroničan 题解 状压DP入门题
    CF1586D. Omkar and the Meaning of Life 题解 纪念一下第一道AC的交互题
    冒泡事件
    JavaScript 对象是词典
  • 原文地址:https://www.cnblogs.com/HBU-xuhaiyang/p/12776033.html
Copyright © 2011-2022 走看看