本文主要是介绍C语言学习笔记《带你学C带你飞》P1-P20,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1、序言
- 2、第一个程序
- 3、打印
- 4、变量
- 5、常量和宏定义
- 6、数据类型
- 7、取值范围
- 8、字符和字符串
- 9、算术运算符
- 10、关系运算符和逻辑运算符
- 11、if语句
- 12、switch语句和分支嵌套
- 13、while语句和do while语句
- 14、for语句和循环嵌套
- 15、break语句和continue语句
- 16、拾遗
- 17、数组
- 19、字符串处理函数
- 20、二维数组
1、序言
- 本文是小甲鱼《带你学C带你飞》课程的学习笔记,由于篇幅原因,本文只包含P1到P20的内容
- 查看P21~P40
- 查看P41~P61
- 视频链接
2、第一个程序
- 编程语言是人类跟机器打交道的枢纽,它充当人类的翻译官。
- 编译型语言:c语言——》汇编——》机器语言——》CPU执行
- 解释型语言:java——》字节码——》解释器——》CPU执行 (效率较低)
- C:灵活度高、效率高、可移植性高
#include<stdio.h>
int main(){printf("hello world!");return 0;
}
-
linux环境下
- 编辑:vi test.c
- 编译:gcc test.c -o test
- 执行:./test
-
windows环境下
- Dev C++
- CodeBlocks
3、打印
-
printf(“要打印的内容”);
- printf 格式化输出函数,print打印,f即format格式化
- \n换行
- 每行写不完行尾用\,下一行为上一行的延续。函数、关键字中间也可以用,注意下行开头如果有空格、缩进也会被解释,会导致识别不了。
-
转义字符
4、变量
- 变量的意义就是确定目标并提供存放的空间
- 命名规则:
- 变量名只能是英文字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成
- 第一个字母必须是字母或者下划线开头(不能是数字)
- 变量名区分大小写
- 不能使用关键字
- 32个关健字
- 1999年c99标准增加5个
- 2011年c11标准增加7个
-
数据类型
- char字符型,占用1字节
- int整型,通常反映了所用机器中整数的自然长度
- float单精度浮点型
- double双精度浮点型
-
声明变量语法
- 数据类型 变量名
- 如int a
5、常量和宏定义
-
常量:
- 整数常量
- 实型常量 小数等
- 字符常量 包括普通字符、转义字符(‘\n’,‘\t’)
- 字符串常量
- 符号常量 使用之前必须先定义
-
定义符号常量 宏定义
- #define 标识符 常量
- #define URL “https://www.baidu.com/”
- #define NAME "百度”
- #define YEAR 2022
- #define MONTH 4
- #define DAY 16
-
示例
#include<stdio.h>#define NAME "百度"
#define YEAR 2022
int main (){printf("%s——%d年",NAME,YEAR);
}
-
标识符:和变量字命名规则一样
-
字符串常量 使用null结尾,转义符是\0(表示null,空字符)
-
“Hello world”
-
‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ’ ’ ‘w’ ‘o’ ‘r’ ‘l’ ‘d’ ‘\0’
-
6、数据类型
-
基本类型
- 整数型 int、short int、long int、long long int
- (short int<=int<=long int<=long long int) 【根据编译系统不同,长度不同】
- 浮点型 float、double、long double
- 字符型 char
- 布尔型 _Bool
- 枚举型 enum
- 整数型 int、short int、long int、long long int
-
指针类型
-
构造类型
- 数组型
- 结构型
- 联合性
-
空类型
-
sizeof运算符
- 用于获取数据类型或表达式的长度
- sizeof(变量或对象),可以不加括号,空格隔开。如sizeof(object)或sizeof object
- sizeof(类型),如sizeof(int)
-
signed和unsigned类型限定符 限定char类型和任何整数类型的取值范围
- signed带符号位,可以存放负数
- unsigned不带符号位,只能存放正数和0
- [signed] short [int] 【中括号中可写可不写】
- unsigned short [int]
- [signed] int
- unsigned int
- [signed] long [int]
- unsigned long [int]
- [signed] long long [int]
- unsigned long long [int]
-
示例
#include<stdio.h>int main(){short i;unsigned short j;i=-1;j=-1;printf("%d\n",i); //-1printf("%u\n",j); //65535 u打印无符号
}
7、取值范围
-
比特位:CPU能够读懂的最小单位——比特位,单位bit缩写b
-
字节:内存机构的最小寻址单位——字节,单位Byte缩写B
-
1Byte=8bit
- 1个字节等于8比特
- 1字节最大:二进制11111111 十进制255 十六进制FF
- n个连续的1等于2的n次方减一
#include<stdio.h>#include<math.h> int main(){int result = pow(2,32)-1;printf("result=%d\n",result);return 0; }
-
符号位
- 存放signed类型的存储单元中,左边第一位表示符号位。如果该位为0表示该整数是一个正数;如果该位为1,表示该整数是一个负数。
- 一个32位的整数变量,除去左边第一个符号位,剩下的表示值得只有31个比特位
-
事实上计算机是用补码的形式来存放整数的值。
-
正数的补码是该数的二进制形式【7的补码 00000111】
-
负数的补码:【-7的补码 11111001】
(1)先取得该数的绝对值的二进制形式 【 -7 绝对值7的二进制10000111】
(2)将第一步的值除符号位按位取反 【11111000】
(3)最后将第二步的值加1 【11111001】
-
补码的最大值127最小值-128
01111111 127...00000001 100000000 011111111 -111111110 -210000000 -128
-
-
基本数据类型的取值范围
8、字符和字符串
#include <stdio.h>int main(){char a = 'C';printf("%c = %d \n", a, a); //c = 67char b = 70, c= 105, d = 115, e = 104, f = 67;printf("%c%c%c%c%c\n",b,c,d,e,f); //FishCchar height1 = 172;//包括负数unsigned char height2 = 172; //0~255printf("%d %d",height1,height2);// -84 172return 0;
}
-
ASCII字符表
-
字符串:
- 声明字符串 char 变量名[数量];
- 赋值 变量名[索引号]=‘字符’;
- 声明+赋值 定义字符串 char name[3]={‘a’,‘b’,‘c’};
#include<stdio.h>int main(){char a[9]={'b','i','l','i','b','i','l','i','\0'};printf("%s\n",a);return 0;
}
#include<stdio.h>int main(){//char a[8]={'b','i','l','i','b','i','l','i'};//错误 指定的数组长度不够时//char a[]={'b','i','l','i','b','i','l','i'};//错误 不指定长度,每个字符用单引号时//char a[9]={'b','i','l','i','b','i','l','i'};//正确 预留一个位置//char a[]={'b','i','l','i','b','i','l','i','\0'};//正确 人工添加char a[]={"bilibili"};//正确 字符串复制printf("%s\n",a);return 0;}
9、算术运算符
- C语言通过提供运算符来支持我们对数据进行处理
-
求余%后面必须是整数
-
目
- 1+2 +运算符,1、2两个操作数(+为双目运算符)
-
表达式
- 用运算符和括号将操作数连接起来的式子
- 1+1
- a+b
- ‘a’+‘b’
- a + ‘b’ + pow(a,b)*3/4 + 5
-
运算符的优先性和结合性
-
类型转换
- 1+2.0 转化为1.0+2.0
-
强制转换
- (int)1.2 【注意不会四舍五入】
10、关系运算符和逻辑运算符
-
使用关系运算符来比较两个数的大小关系:
- 优先级高:<、<=、>、>=
- 优先级低:==、!=
-
用关系运算符将两边的变量、数据、表达式连接起来,称为关系表达式。
- 关系表达式得到的值是一个逻辑值,即真或假;
- 在C语言的逻辑运算中,用数字1表示真,用数字0表示假。
- 关系表达式1<2的值为真,因此该关系表达式的值为1
- 关系表达式‘a’ +‘b’<= ‘c’,因为字符’a’.‘b’,'c’对应的ASCII码分别是97、98、99,即97 + 98<=99,因此该表达式的值为0
-
逻辑运算符
-
用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式
- 3 + 1 || 2 == 0 【||左侧为4不为0即为真,||右侧为假,故该式为真(0)】
- !(1 + 1) 【1+1为2不为0则为真,故该式为假(0)】
- !0 + 1 < 1 || !( 3 + 4) 【0为假,则!0为真得1,则1+1<1为假,故||左侧为假,又||右侧为假,故该式为假(0)】
-
短路求值
- 又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个操作数的值无法确定逻辑运算的结果,才对第二个操作数进行求值。
- C语言对于逻辑与和逻辑或采用短路求值的方式。
#include<stdio.h>int main(){int a,b=3;(a=0)&&(b=5); // 因为a为0,0表示假,能确定逻辑与的值,不会再对第二个运算数求值printf("a=%d,b=%d\n",a,b); //a=0,b=3(a=1)||(b=5); //因为a为1,1表示真,能确定逻辑或的值,不会再对第二个运算数求值printf("a=%d,b=%d\n",a,b); //a=1,b=3return 0; }
11、if语句
- 语句(1):
if(表达式)
{逻辑值为真所执行的语句、程序块
}
- 语句(2):
if(表达式)
{逻辑值为真所执行的语句、程序块
}else{逻辑值为假所执行的语句、程序块
}
- 语句(3):
if(表达式1) {……}
else if(表达式2){……}
else if(表达式3){……}
……
else if(表达式n){……}
else {……}
12、switch语句和分支嵌套
switch(整型或字符型)
{
case 常量表达式1:程序块1 break;
case 常量表达式2:程序块2 break;
case 常量表达式3:程序块3 break;
……
case 常量表达式n:程序块n break;
default: 语句或程序块n+1 缺省一个break可不写
}
- 分支嵌套BUG:悬挂else
if(a==1)if(b==2)printf("a等于1,b等于2");
else{printf("a不等于1")}
//这样即使a等于1,b不等于2,也会输出a不等于1。因为else就近if(b==2)
//正确做法加{}
if(a==1){if(b==2)printf("a等于1,b等于2");
}
else{printf("a不等于1")}
- 等于号带来的问题
13、while语句和do while语句
入口条件循环
while(表达式){循环体
}出口条件循环
do{
循环体
}while(表达式);
14、for语句和循环嵌套
for(初始化表达式; 循环条件表达式; 循环调整表达式)循环体
- 表达式1,表达式2和表达式3可以按照需要进行省略(但分号不能省):
- for( ; 表达式2;表达式3)
- for( 表达式1 ; 表达式2 ; )
- for( 表达式1 ; ; )
- for( ; ; ) <==> while(1){ … } 死循环
- 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式(即用逗号分隔多个表达式)
- C99允许在for语句的表达式1中定义变量
15、break语句和continue语句
-
break跳出循环或switch。不能用于循环语句和switch语句之外的任何其他语句中。break 只能跳出一层循环。当有多层循环嵌套的时候,break只能跳出“包裹”它的最里面的那一层循环,无法一次跳出所有循环。同样,在多层 switch 嵌套的程序中,break 也只能跳出其所在的距离它最近的 switch。但多层 switch 嵌套实在是少见。
-
continue 结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定。不能用于switch
16、拾遗
-
赋值运算符左边必须是一个lvalue,变量名就是lvalue
-
int a;
a=5;
-
lvalue 识别和定位存储数值的标志符
-
-
复合的赋值运算符
- +=
- -=
- *=
- /=
- %=
-
自增自减运算符
-
i++
-
i—
-
i++、++i前后的区别
-
j=++i 先i加1,再把加1后的值给j
-
j=i++ 先把i的值给j,i再加1
-
-
-
逗号运算符
- 优先级最低
- 表达式1,表达式,。。。,表达式n
- 运算过程从左到右
- 作为一个整体,它的值为最后一个表达式(表达式n)的值
- a=(b=3,(c=b+4)+5)
- 先将b赋值为3,c赋值为b+4的和7,c的值加5,最后赋值给a,a的值12
- 常见:
- 多个变量初始化
- for表达式1、3
-
三目运算符
- 表达式1?表达式2:表达式3;
- 表达式1正确返回表达式2,错误返回表达式3
-
goto语句历史遗留 不推荐使用
goto A;A: printf("123");
-
注释
-
//单行注释
-
/*多行注释*
*多行注释*/
-
17、数组
-
数组定义:
- 类型 数组名[元素个数]
int a[6]; 占用 4*6 = 24 个字节的内存int N=6;int a[N];char b[24]; 占用 1*24 = 24 个字节的内存double c[3]; 占用 8*3 = 24 个字节的内存
-
数组不能动态定义。[]中不能是一个变量,但是这个变量的值是固定的值的话可以
-
访问数组中的元素
- 数组名[下标]
- 第一个元素的下标是0,不是1
-
数组的初始化
-
所有元素赋值为0(只有0可以)
int a[10]={0}; //只是将第一个元素赋值0,后面会自动初始化为0
-
赋值不同的值用逗号隔开
int a[10]={1,2,3,4,5,6,7,8,9,0};
-
只给一部分元素赋值,未被赋值的元素自动初始化为0.
int a[10]={1,2,3,4,5}
-
只给出各个元素的值,不指定长度,由编译器自动判断
int a[]={1,2,3,4,5};
-
C99新特性:指定初始化的元素。未被赋值的元素自动初始化为0
int a[10]={ [3] = 110 , [5] = 120, [8] =114 };
-
19、字符串处理函数
-
字符数组
char str1[10]={'F','I','S','H','\0'};char str2[]={'F','I','S','H','\0'};不指定长度char str3[]={"FISH"};使用字符串常量初始化字符数组,可以省略大括号char str4[]="FISH";
-
字符串处理函数 在<string.h>
- strlen 获取字符串长度 数组元素的个数
- strcat 连接字符串
- strcmp 比较字符串
- strcpy 拷贝字符串strcpy(str1,str2)把str2复制给str1.注意\0也会复制。要保证str2长度小于str1
- strncat 连接字符串(受限)
- strncmp 比较字符串(受限)
- strncpy 拷贝字符串(受限)strncpy(str1,str2,元素个数n) 把str2的n个元素复制给str1,要自己加\0 str1[n]=‘\0’
20、二维数组
-
定义:
- 类型 数组名[ 行数 ][ 列数 ]
- 在内存中依然是线性存储
-
访问:
- 数组名[行下标][列下标]
- a[0][0] 第一行第一列
-
二维数组初始化
-
由于二维数组在内存中是线性存放的,因此可以将所有的数据写在一个花括号内:
int a[2][3]={1,2,3,4,5,6};
-
为了更直观地表示元素的分布,可以用大括号将每一行的元素括起来:
int a[2][3]={{1,2,3},{4,5,6}};
-
二维数组也可以仅对部分元素赋初值:
int a[2][3]={{1},{4}} 对每行第一个赋值,其余自动为0
-
如果希望整个二维数组初始化为0,那么直接在大括号里写一个0即可:
int a[2][3]={0} 整个二维数组初始化为0
-
C99同样增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:
int a[2][3] = {[0][0] = 1,[1][1] = 2};
-
二维数组的初始化也能偷懒,让编译器根据元素的数量计算数组的长度。但只有第1维的元素个数可以不写,其他维度必须写上:
int a[][3]={1,2,3,4,5,6} 行数可不写,自动判断
-
-
示例代码
#include <stdio.h> #include <string.h>int main(){int a[2][3] = {1,2,3,4,5,6};int i,j;for (i=0;i<2;i++){for(j=0;j<3;j++){printf("a[%d][%d] = %d ",i,j,a[i][j]);}putchar('\n');}putchar('\n');//矩阵转置for (i=0;i<3;i++){for(j=0;j<2;j++){printf("a[%d][%d] = %d ",j,i,a[j][i]);}putchar('\n');}return 0; }
这篇关于C语言学习笔记《带你学C带你飞》P1-P20的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!