递归,作用域,数组
1递归
定义一个函数,接收用户的输入,如果用户输入的是一个负数,就要求用户重新输入,直到输入为正数为止
写循环的步骤:
1.确定要重复执行的操作
2.确定约束条件
#include <stdio.h>
void getNumber()//定义一个函数
{
int number = -1;
while (number =<0) {
printf("请输入一个正数\n");
scanf("%d", &number);
}
printf("number = %d\n", number);
}
//递归自己调用自己
//1.确定重复执行的操作
//2.确定约束条件
void getNumber2()
{
int number = -1;
printf("请输入一个正数\n");
scanf("%d", &number);
if (number =<0){
getNumber2();//如果number<0,自己调用自己,这就是递归
}else{
printf("number= %d\n",number);
}
}
//注意:能用循环实现的功能,都可以用递归来实现
//递归就是自己调用自己,性能比较差
//递归一定要有一个明确的结束条件,否则会造成死循环
void getNumber3()
{
printf("abc\n");
getNumber3();
}
2数据作用域
局部变量:定义在函数内部的变量以及函数的形参称为局部变量
作用域:从定义哪一行开始直到与其所在的代码块结束
生命周期:从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域
特点:
1、相同作用域内不可以定义同名变量
2、不同作用范围可以定义同名变量,内部作用域的变量会覆盖外部作用域的变量
全局变量:
声明格式:变量类型变量名称
如果只有声明没有初始化,系统会自动帮我初始化,并将值赋值为0
定义格式 变量类型变量名称 =值
生命周期:从定义那一行开始,直到程序退出
作用域:从定义的那一行开始直到文件结束
注意点:
如果有局部变量与全局变量重名,在局部变量所在作用域,局部变量会覆盖全局变量
外部变量
可以在不同的文件中访问变量
特点:不能重名
内部变量
仅能在本文件中被访问变量
特点:在不同文件中可以同名
extern对变量作用
1、完整定义一个外部变量
2、可以完整声明一个外部变量
3、再函数内部声明一个外部变量
注意点:extern声明的外部变量,系统不会自动帮其定义并初始化
static对变量的作用
1、定义一个内部变量
2、声明一个内部变量
3数组
基本数据类型初始化的两种方式
int a;
a =10;
int b =20;
// int num[4]; //定义整形数组,元素个数为4
// 数组的第一种初始化方式
int scores[3];
scores[0] =44;
scores[1] =33;
scores[2] =22;
// 数组也可以定义变量的同时赋值
// 1.定义数组变量的同时,完全赋值,完全初始化
int nums[4] = {1,3,5,6};
// 2.部分初始化,没有赋值的元素默认是0
int nums2[5] = {1,3};
// 3.对指定的角标(索引)进行赋值,没有赋值的元素默认是0
int nums3[10] = {[8] =18, [9] =29};
int nums4[8];
// 1.注意:一个数组,没有初始化,里面放的也是随机值
int nums5[10] = {0};//开发中一般定义数组的同时给0角标元素一个0,就相当于是部分初始化,她有个特点就是没有初始化的值都是0
// 2.注意:数组的[]里面的数字是表示元素的个数,里面只能写整型的常量或者返回值是整型常量的表达式
int nums6['A'] = {1,3};
// int nums7[10.1] = {1, 3};
int nums8[1 + 1] = {1,3};
// 3.注意:数组[]里面的数字,不要用变量,这样写不安全
// 4.注意:在定义数组变量的同时初始化,可以省略元素的个数,编译器会根据后面元素的个数,自动计算出这个数组总共所占用的字节数
int nums10[] = {1,3};
// int nums11[];这种写法是错误的
// 5.注意:如果定义完数组变量以后,再初始化,只能给元素一个一个的初始化,而不能一次性通过{}来赋值
int nums12[3];
// nums12 = {1, 3, 5};错误写法