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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识