C语言学习笔记《带你学C带你飞》P1-P20

2023-12-27 07:59
文章标签 语言 学习 笔记 p1 p20

本文主要是介绍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
  • 指针类型

  • 构造类型

    • 数组型
    • 结构型
    • 联合性
  • 空类型

  • 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542407

相关文章

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安