一、关键字
定义:关键字就是C语言提供的有特殊含义的符号,也叫做保留字
由ANSI标准定义的C语言共32个关键字
特点:全部都是小写
在开发工具或者智能文本编辑工具中会显示特殊的颜色。
根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两类
1.数据类型的关键字
(1) 基本数据类型 (5个):
整数类型:int 浮点类型:double float
字符类型:char
void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果
(2) 类型修饰关键字(4个)
short:修饰int,短整型数据,可省略被修饰的int
long:修饰int,长整型数据,可省略被修饰的int
signed:修饰整型数据,有符号数据类型
unsigned:修饰整型数据,无符号数据类型
(3) 复杂类型关键字(5个)
strut:结构体声明
union:共用体声明(用的不多)
enum:枚举声明
typedef:声明类型别名
sizeof:得到特定类型或特定类型变量的大小
(4) 存储级别关键字
auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参
建议编译器通过寄存器而不是堆栈传递参数
extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定
另外文件声明的
const:与volatile合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制
编译器每次从内存中取得该变量的值
volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变
强制编译器每次从内存中取得该变量的值
2 流程控制关键字
(1) 跳转结构
return:用在函数中,返回特定值(或者是void值,即不返回值)
continue:结束当前的循环,开始下一轮循环
break:跳出当前循环或switch结构
goto:无条件跳转语句
(2) 分支结构
if:条件语句
else:条件语句否定分支
switch:开关语句(多重分支语句)
case:开关语句中的分支标记
default:开关语句中的“其他”分支,可选
(3) 循环结构(3个)
for:for循环结构
do:do循环结构,do 1 while(2); 的执行顺序是:1->2->1....循环,2为循环条件
while:while循环结构 ,while(1) 2; 的执行顺序是:1->2->1....循环,1为循环条件
以上循环语句,当循环条件为真则继续循环,为假则跳出循环。
二、程序流程控制
主要分为:顺序结构 选择结构 循环结构
这里主要介绍选择结构和顺序结构
1.选择结构
(1)If语句
If语句的三种格式
a) if(条件表达式)
{
执行语句;
}
或 if(条件表达式) 执行语句;
b) if(条件表达式)
{
执行语句1;
}
else
{
执行语句2;
}
c) if(条件表达式)
{
执行语句;
}
else if
{
执行语句2;
}
else
{
执行语句3;
}
陷阱
if(a!=0) { a不是0;} else {a是0;}
if (a); { }
if (a=0)
a == 0;
if (10) int a = 9;
(2) switch语句
switch语句格式:
switch(表达式)
{
case取值1:
执行语句;
break;
case取值2:
执行语句;
break;
…...
default:
执行语句;
break;
}
注意点:如果要在case后面的定义新的变量,必须用大括号{}(作用域)包住
关于break和continue的使用注意点
break:
1.使用场合: switch语句:退出整个switch语句
循环结构:退出整个循环语句
2.注意点: 只对最近的循环结构有效
continue:
1.使用场合: 循环语句:结束当前的这次的循环体,进入下一次循环体
2.注意点: 只对最近的循环结构有效
if和switch的对比
很多情况下可以互换
if用的比较多,比较灵活,switch只能比较某个单值
2.循环结构
(1) while和do while
while语句格式:
while(条件表达式)
{
执行语句;
}
特点:只有条件成立才会执行循环体
陷阱:while(true){};//无限循环
do while语句格式:
do
{
执行语句;
}while(条件表达式);
特点:一定会先执行一次循环体,再做判断
for语句格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
简单实用:初始化语句可以是多句(把printf放到for的括号中去)
陷阱:
死循环 for(;;);//对于for 来讲,不写条件表达式默认就是true
for 循环体内部变量的作用域
作用域混淆 for(int i=0;i<5;i++) int a=10;
//此处i和a都是局部变量,作用域在循环体内
while循环和for循环的比较
可以互换
for循环的变量可以及时回收
三、函数
什么是函数:任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序都有自己的功能,我们一般称这些小程序段为“函数”。所以,你可以说C语言是由函数构成的
函数的定义格式:
返回值类型 函数名(形式参数列表)//函数的声明可以省略形参的名称,只要形参的类型
{
函数体;
}
定义函数的目的: 将一个常用的功能封装起来,方便以后调用
函数的参数:
1.形式参数:定义函数时函数名后面的参数,简称形参
2.实际参数:调用函数时传入的具体数据,简称实参
3.实参的个数必须等于形参的个数
4.函数体内部不能定义和形参一样的变量
5.如果是基本数据类型作为函数形参,纯粹是值传递,修改函数内部的形参的值,并不会影响外面实参的值
6.一个函数可以没有形参,也可以有无限多个
函数的返回值:
return 的作用:退出函数 返回一个具体值给函数调用者
void:代表没有返回值
如果没有明确说明返回值类型,默认是int 类型
就算明确返回值类型,也可以不返回任何值
void 可以省略return
可以多次使用return
return后面不能有其他语句
特点:
定义函数可以将功能代码进行封装,便于对该功能进行复用
函数只有被调用时才会被执行
函数的出现提高了代码的复用性
如何定义一个函数:
明确函数的作用,起一个有意义的函数名称
明确函数的参数和返回值
注意:
默认情况下,不允许有函数名称一样
函数不能嵌套定义,但是可以重复声明
补充:
声明函数只要在定义函数前
如果有函数的声明,没有函数的定义
(1)编译可以通过,因为编译器只会检测语法合不合理,并不会检测函数有没有定义
(2)链接报错,因为链接时会检测函数是否定义
预处理指令简介:
#include:
(1) 作用:拷贝包含文件的所有内容到#include所在的位置
(2) 自定义文件用"",系统自带文件用 < >
(3) #include <stdio.h>的目的:拷贝printf函数的声明
多文件团队开发:
链接:把项目中所有相关联的 .o 目标文件 、c语言函数库合并在一起,生成可执行文件
(1)函数的定义放在 .c 文件,函数的声明放在 .h 文件
(2)如果使用某个 .C 文件中定义的函数,只需要#include这个.c文件对应的.h 文件
(3).h文件的作用:被别人拷贝。编译链接的时候不需要管 .h文件
四、小练习
循环嵌套练习
/*
提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推
*****
****
***
**
*
*/
#include<stdio.h>
int main()
{
//定义一个变量
int n;
//提示用户输入一个正整数
printf("请输入一个正整数:");
//用scanf函数接收用户输入的数字
scanf("%d",&n);
//使用嵌套for循环
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n-i;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
运行结果为:
*****
****
***
**
*
函数的练习
/*
编写一个函数int pieAddd(int n) ,计算+2+3+。。。+n的值并返回。比如pieAdd(3)
的值是+2+3=6
*/
#include <stdio.h>
//函数的声明
int pieAdd(int n);
int main()
{
//定义一个变量
int a = 10;
//调用函数
int sumNumber = pieAdd(a);
printf("得到的和为:%d",sumNumber);
return 0;
}
//函数的定义
int pieAdd(int n)
{
//定义一个变量和
int sum = 0;
for(int i = 1;i <= n;i++)
{
sum += i;
}
return sum;
}
运行结果为: 55