day05--随机数、缓冲区、函数、变量作用域

随机数

无法预知的数字成为随机数;需要包含<stdlib.h>
rand(); //随机数。
srand(); //随机数的种子,程序只需要设置一次随机数种子。
time(); //获取当前时间,单位s,包含<time.h>。



缓冲区

输入缓冲区

 scanf用户在键盘上输入的数字首先进入输入缓冲区,然后才会被程序得到。如果用户输入的数据格式和程序中需要的格式不一致就导致后面的数据得不到处理。

//使用如下两条语句可以把输入缓冲区里第一个换行字符和它前面的所有字符都丢掉。
scanf("%*[^\n]");
scanf("%*c");
输出缓冲区

 printf输出缓冲区里的内容只有在以下四种情况下才显示:
  1、有换行字符。
  2、程序结束。
  3、输出缓冲区被充满的时候
  4、使用语句:fflush(stdout);



函数

定义:按照程序部分功能进行的语句分组。
声明:返回类型 函数名(形参); int add(int x, int y);
调用:如果函数A在执行过程中把自己的时间分配给函数B使用,就表示它们之间存在函数调用关系。
  exit(1); //结束程序运行,须包含<stdlib.h>

显式声明:函数声明语句单独写在文件开头。
隐式声明:编译器先遇到函数调用语句的时候会猜测函数的格式,这种猜测称为隐式声明。
  1、若函数真实格式和隐式声明格式不同时,会编译报错。所以调用之前必须先声明被调函数,或者隐式声明的函数必须放在调用之前。

其他
  1、不可以跨函数使用变量;
  2、不同函数里的变量可以重名;
  3、一个函数多次执行则每次执行的时候它里面的变量所代表的存储区都可能不同。
  4、volatile:使用此关键字声明的变量可以被其他程序修改。

数据传递

 函数调用过程中通常会伴随着两个函数之间的数据传递。这种传递存在两个完全相反的方向,可以从调用函数向被调用函数传递数据,也可以从被调用函数向调用函数传递数据。
1、函数返回值:被调函数向调用函数传递一个数据。return
  若被调用函数里没有使用return设置返回值,则存放返回值的存储区内容是随机的。
  void函数是没有返回值。
  若函数明前没有写返回值类型,C89默认为一个整形类型,C99不允许。

2、赋值
  可以向被调用函数传递任意多个数据,且类型任意。
  被调用函数需要为每个数据提供一个同类型的存储区。
  void函数中没有形参。
  若什么都没有表示函数可以提供任意多个不同类型的形参

  形参:函数声明时参数列表中的所有参数都为形参。
  实参:函数调用时传递给函数的所有参数都为实参。实参不一定是数字。

  值传递:
  指针传递:

  数组形参:
   1、数组作为形参的时候,真正的形参并不是数组,而是一个可以当作数组使用的变量。且数组形参包含的所有存储区不是被调函数提供的。使用数组形参的时候需要提供一个整数类型的形参表示数组形参中包含的存储区个数。
    void print(int array[], int size);
   2、调用函数和被调函数公用一个存储区。所以可以实现数据的双向传递

  变长参数:

递归
  定义:函数自己调用自己。
  使用场景:若一个问题可以拆分成多个小问题,至少一个小问题和原来的大问题本质上一样。(遵守一定的规则)
  编写步骤:
   1、 编写语句解决分解后的每个小问题。
   2、在函数的开头编写分支用来处理不能分解的情况,这个分支必须保证函数可以结束。

递推
  定义:采用循环解决类似问题



变量作用域

局部变量:声明在函数里面的变量。
 1、作用域:只包含在函数内部的语句。
 2、生命周期:函数执行的时间范围内使用。
 注意:函数多次执行时每次分配的存储区可能相同,可能不同。

全局变量:声明在所有函数外部的变量。
 1、作用域:包含程序中的所有语句。
 2、生命周期:整个程序执行期间
 注意:没有初始化的全局变量会自动初始化为0。

注意:
 1、局部变量和全局变量是可以重名。重名的变量优先代表局部变量。
 2、优先考虑采用局部变量。尽可能的少使用全局变量。
 3、存储区的使用不受作用域的限制(可以跨函数使用存储区)。它是受生命周期的限制。

static静态变量
 1、作用域:
  静态局部变量:和局部变量一样。
  静态全局变量:只包含声明它的文件里的所有语句。(不可以跨文件使用)。
 2、声明周期:整个执行时间。
 注意:
  1、静态变量的存储区不会变化。
  2、没有初始化的静态变量会自动初始化为0。
  3、静态变量只会在程序开始的时候初始化一次,和书写位置无关。


const关键字
 1、const int *p; //不可以对捆绑的存储区赋值,但可以对指针赋值。
 2、int * const p; //可以对捆绑的存储区赋值,但不可以对指针赋值。
 原则:向右就近原则,1修饰int表示值不能改变,2修改p指针表示指针不能改变。
 声明指针形参的时候应该尽可能在类型名称前使用const关键字。


extern关键字
 在一个源文件声明的全局变量,若想在别的源文件中想使用次全局变量,则必须在此源文件对应的头文件中用extern关键字生命次全局变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值