目录
3.2 浮点型:float——单精度浮点数;double——双精度浮点数编辑
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量。,它可以让数据更简洁,更易读。
一.什么是C语言?
1.C语言是一门通用计算机编程语言,广泛应用于底层开发。
2.C语言最初的标准:ANSI C,C89、C90、C99、C11……。
3.计算机处理的是二进制信息(011101000010011)
4.c语言是一门面向过程的计算机编程语言,与c++,java等面向对象的编程语言有所不同。
现在的编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC(vs2019-集成开发环境)、Turbo C等。
二.第一个C语言程序
1.集成开发环境:集成了很多子功能——编辑、编译、链接、运行、调试
2.c语言程序一般有两个文件:.c 源文件 .h 头文件
2.1 第一个c语言程序:
#include<stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
注:(1)main函数是程序的入口,即程序从main开始运行。
(2)一个工程只能有一个main函数。
(3)程序的第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。
(4)printf(...) 是 C 中另一个可用的函数,会在屏幕上打印信息。
(5)return 0; 终止 main() 函数,并返回值 0。
三.数据类型
3.1 整型:
注:①long long 8字节
②int类型输出用%d long类型输出用%ld long long类型输出用%lld
3.2 浮点型:float——单精度浮点数;double——双精度浮点数
注:直接写出的浮点型数据,会被编译器默认为double类型
3.3 void类型:void 类型指定没有可用的值。
3.4 数据类型转换:
(1)数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型;在 C 语言中也可以对数据类型进行强制转换。
//强制类型转换:(数据类型)
int a = (int)3.14; //3.14默认为double类型,但是通过(int)被强制转换为整型
printf("a=%d", a); //输出结果为a=3
(2)自动转换规则:①浮点数赋给整型,该浮点数小数被舍去;
②)整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中。
附:计算机中常见单位:
四.变量 & 常量
4.1 变量(建议初始化)
4.1.1 创建变量
1.数据类型+变量名。(float 后面的数据加一个f,double则不需要)
4.1.2 标识符
C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。因此,在 C 中,Manpower 和 manpower 是两个不同的标识符。
4.1.3 变量名的规则
1.跟标识符一样,但是变量名不能与c语言的关键字相同。
4.1.4 变量命名的艺术:见名知意。
①骆驼式命名法:是指混合使用大小写字母来构成变量和函数的名字。eg:CamelCase; SunFlower等。
②匈牙利命名法:基本原则是:变量名 = 属性 + 类型 + 对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。 eg.char chGraden 、int nLength 、p = *pDoc 等。
③下划线命名法:是指在每个独立的单词直接添加下划线。这种命名在内核代码中尤为常见。 eg. sun_flower student_data等。
4.1.5 变量的分类:
局部变量(优先级高于全局变量) & 全局变量。(附:scanf是输入函数,用法与printf一样,只不过在变量名前加取地址符&)
附:extern 使用外部变量(extern int a = 0;)
4.1.6 变量的作用域和生命周期
4.2 常量(一般全字母大写)
4.2.1 使用 #define 预处理器
#define 可以在程序中定义一个常量,它在编译时会被替换为其对应的值。(没有赋值符号"=")
#define MONEY 100;
4.2.2 使用 const 关键字
const 关键字用于声明一个只读变量,即该变量的值不能在程序运行时修改。(本质还是变量)
const int a = 100;
4.2.3 enum(枚举)
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量。,它可以让数据更简洁,更易读。
五.字符串 & 转义字符 & 注释
5.1 字符串
1.这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。
2.字符串用双引号,单个字符用单引号;字符串用%s,单个字符用%c。
(字符串是可以放在字符数组中的!用单个字符要加\0,字符串整体输入则不需要)
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
char site[] = "RUNOOB";
printf("%s", RUNOOB);
printf("%c", 'R');
3.关于%d等的介绍:
附:%f—float %lf—double
4.有关字符串操作的函数:
注:strlen求的是截止第一个\0前的字符个数(\0不算字符串的长度)
实例:
5.2 转义字符
1.转义字符:
注: ①打印 \ 必须用'\\'。
②在计算字符串长度时,一个转义字符算一个长度。
③注意\ddd是八进制,不含数字8。
2.ASCII表:常用(A—65 a—97 字符0—48)
ASCII表与转义字符\ddd、\xdd有关:
eg: ① \130: 130(八进制)= 88(十进制) 所以输出X
② \x30:30(十六进制)= 48(十进制)所以输出0
5.3 注释
1.注释的作用:①代码中有不需要的代码可以直接删除,也可以注释掉 。
② 代码中有些代码比较难懂,可以加一下注释文字。
2.两种注释: ① /*xxxxxx*/ 可以跨行注释 缺陷:不能嵌套注释
② //xxxxxxxx 可以注释一行也可以注释多行 缺陷:不能跨行注释
六.选择语句 & 循环语句
1.c语言作为结构化的程序设计语言:顺序结构,选择结构,循环结构。
6.1 选择语句
6.1.1 C 语言中 if 语句的语法:
6.1.2 C 语言中 if...else 语句的语法:
6.1.3 C 语言中 嵌套 if 语句的语法:
6.1.4 C 语言中 switch 语句的语法:
注:
- switch 语句中的 expression 是一个常量表达式,必须是一个整型或枚举类型。
- 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
- case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量。
- 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
- 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
- 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
- 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
6.1.5 C 语言中 嵌套 switch 语句的语法:
实例:根据性别满足工龄奖励小程序
#include<stdio.h>
int main(void)
{
char sex;
int age ;
printf("请输入你的性别简称!男(M),女(F)\n");
scanf_s("%c", &sex);
switch (sex)
{
case 'M':
case 'm':
printf("你的性别为“男”请你进入测试!\n");
printf("请输入你的工龄!\n");
scanf_s("%2d",&age);
switch (age)
{
case 5:
printf("奖励iphone一台!!\n");
break;
case 10:
printf("奖励汽车一辆!!\n");
break;
case 15:
printf("奖励小楼一栋!!\n");
break;
default:
printf("抱歉,未满足奖励条件或者超出工龄!!\n");
break;
}
break;
case 'F':
case 'f':
printf("你的性别为“女”请你进入测试!\n");
printf("请出入你的工龄!\n");
scanf_s("%2d",&age);
switch (age)
{
case 5:
printf("奖励iphone一台!\n");
break;
case 10:
printf("奖励名牌化妆品一套!\n");
break;
case 15:
printf("奖励爱马仕包一个!\n");
break;
default:
printf("抱歉, 未满足奖励条件或者超出工龄!!\n");
break;
}
break;
}
return 0;
}
6.2 循环语句
6.2.1 while循环:
只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句。
6.2.2 for循环:
for 循环允许您编写一个执行指定次数的循环控制结构。
6.2.3 do...while 循环 :
不像 for 和 while 循环,它们是在循环头部测试循环条件。在 C 语言中,do...while 循环是在循环的尾部检查它的条件。
do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。
6.2.4 循环的嵌套:
C 语言允许在一个循环内使用另一个循环。
①while的嵌套:
②for的嵌套:
③do...while的嵌套:
6.2.5 循环控制语句:
①break:当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
②continue:C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 while 和 do...while 循环,continue 语句重新执行条件判断语句。
③goto:C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。
注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。
七.函数
作用:函数的特点就是简化代码,代码复用。
7.1 定义函数
注: ①返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
② 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
③参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
④函数主体:函数主体包含一组定义函数执行任务的语句。
7.2 调用函数
如果函数定义在main函数后面,则在前面需要先声明。
#include <stdio.h>
/* 函数声明 */
int max(int num1, int num2);
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
int ret;
/* 调用函数来获取最大值 */
ret = max(a, b);
printf( "Max value is : %d\n", ret );
return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
附:如果在定义函数时,在函数的首部的最左端加关键字 extern,则此函数是外部函数,可供其它文件调用。
如函数首部可以为:
extern int max (int a,int b)
八.数组
1.定义:一组相同类型数据的集合。
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
2.初始化:
3.数组的下标:数组的下标都是从0开始,a[0]代表数组的第一个元素 。
4.数组的使用:数组必须通过循环来使用,无论是数据的输入还是输出。
九.操作符
9.1 算数操作符
1.下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
注:①%只能是整型。
②关于++和--,有前置和后置:
前置:先加(减)一,后使用 后置:先使用,后加(减)一
9.2 位运算符 (涉及二进制,暂时不讲)
& | ^ ~ << >>
9.3 赋值运算符
1.下表列出了 C 语言支持的赋值运算符(最后5个涉及位运算符):
9.4 逻辑运算符
1.下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:
9.5 关系运算符
1.下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
9.6 杂项运算符
1.下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :。
注:①sizeof()单位是字节
②上面最后一个也叫三元运算符,使用方法如下:
9.7 逗号表达式
1.逗号表达式:exp1, exp2, exp3, ... expN
2..逗号表达式特点:从左向右依次计算,整个表达式的结果是最后一个表达式的结果。
附:下标引用([ ])、函数调用(( ))和结构成员(. ->)
十.关键字
1.c语言预留关键字
十一.初识指针(基础)
11.1 内存
1.内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
2.变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。 取出变量地址如下:
#include <stdio.h>
int main()
{
int num = 10;
# //取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}
11.2 什么是指针
1.通俗来说就是一个快捷方式。指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var_name;
2.在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
注:
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
11.3 使用指针
使用指针时会频繁进行以下几个操作:
定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。
#include <stdio.h>
int main()
{
int a = 10;
// &-取地址操作符
int* pa = &a; // '*'说明pa叫做指针变量
// int————说明pa是指向int类型的变量
*pa = 20; // * 解引用操作符——通过地址找到地址所指向的对象,*pa就等价于a
printf("%d\n", a);
return 0;
} //输出结果为20
注:&a的时候取出的是四个字节中地址较小的一个字节的地址
11.4 指针变量的大小
1.指针大小在32位平台是4个字节,64位平台是8个字节。
十二.结构体
12.1 何为结构体
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
12.2 定义结构体
12.3 结构体初始化
struct Stu
{
char name[20]; //名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
}; //注意有分号
//打印结构体信息
struct Stu s = {"张三", 20, "男", "20180101"};
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
>id);