感谢佬们支持!

文章目录

  • 前言
  • 一、C语言的前世今生&&如何写C语言
  • 二、初识C语言
    • 1.  第一个C语言程序(万恶之源)
    • 2.  数据类型
    • 计算机中的单位
    • 介绍各种类型
    • 各数据类型的大小
    • 3   常量、变量
    • 定义变量的方法
    • 变量的分类
    • 变量的作用域和生命周期
    • 常量的分类
    • 4   字符串
    • 5   转义字符
    • 转义字符定义
    • 常见转义字符
    • 6   注释
    • 注释的作用
    • 注释的方式
    • 7    初始选择语句
    • 8    初始循环语句
    • 9    初始函数
    • 函数的结构
    • ADD函数的实现
    • 10  初始数组
    • 数组的定义
    • 数组的结构
    • 数组的访问
    • 11  初识指针
    • 指针的定义
    • 如何存放及打印地址
    • 指针的大小
    • 指针的作用
    • 12  初识操作符
    • 算数操作符
    • 移位操作符
    • 位操作符
    • 单目操作符
    • *关于原码、反码、补码的科普
    • 关系操作符
    • 逻辑操作符
    • 条件操作符(三目操作符)
    • 逗号表达式
    • 下标引用、函数调用和访问结构体成员的操作符
    • 13  常见关键字
    • 14  define定义的常量和宏
    • define定义符号
    • define定义宏
    • 15  初识结构体
    • 自定义类型
    • 结构体的定义
    • 结构体的声明&&结构
    • 结构体的创建和初始化
    • 结构体的访问
  • 总结

前言

上篇博客我们浅略说明了为什么编程之路要从C语言展开,但我们并不了解它,在具体学习之前,我将用一篇博客带大家初始C语言。


一、C语言的前世今生&&如何写C预言

简单来说,在早期我们让计算机做什么事,都是通过写二进制序列的方式实现的。显然,这种方式非常麻烦。

后来,人们通过将特定的二进制序列起名字的方式创造了汇编语言这大大节省了时间及精力。

再后来,人们觉得汇编语言也很麻烦,经过一系列衍生,C语言产生了。20世纪80年代,美国国家标准局为C语言制定了一套完整的标准语法,称为ANSI C。


写C语言,我们需要下载一个编译器。

工欲善其事,必先利其器  。市面上那么多编译器,改选那个呢?

我个人推荐用  VS2019,因为它是一个集成开发环境,不需要配置环境,而且在企业中使用率也很高。相比之下,VScodecodeblocks都需要配置环境,对新手不太友好。另外的VC6.0则是又老兼容性又差,Dev c++ 十年没更新过了,且敲出的代码不美观,不利于形成良好的代码风格。

二、初始C语言

1.第一个C语言程序(万恶之源)


#include<stdio.h>int main()
{printf("hello world");return 0;
}

这个程序的作用是将  hello world 打印到屏幕上如下图:

看起来这段程序很复杂,我们将分行讲解一下。

1.程序的第二行表示主函数(main函数),其中 main 为函数名,int 为这个函数的返回类型。

下面有一对大括号,我们把大括号括起来的中间部分叫函数体

2.函数体中第一行中的 printf 是实现打印hello world 的东西。这是C语言编译库中为你提供(实现好)的一个函数,我们可以调用它为我们实现打印功能。C语言编译库中有很多的库函数,这只是其中一个。

3.但是库函数是不能随便调用的,我们必须引头文件。如程序第一行 #include<stdio.h>。其中,stdio.h为printf 的头文件名称。

4.在函数体最后一行中,是return 0;在C语言中约定返回0是正常返回,非0为异常返回。


2.数据类型

  在介绍数据类型之前,我们先来了解一下计算机中的单位

bit(比特位)-------于二进制中储存1/0

byte(字节)   =   8   bit                                       tb             =      1024gb

kb                =1024byte                                    pb            =      1024tb

mb              =1024kb

gb               =1024mb


介绍各种类型  

初阶的数据类型大致分为两大家族,一类为整形家族,包括

char(字符数据类型)

(注:char类型在储存字符时存的是其ASCII码,故属于整形)

short(短整型)

int(整形)

long(长整型)

long long(更长的整形)

另一类是浮点型家族,包括

float(单精度浮点型)

double(双精度浮点型)

(双精度浮点型精度>单精度)

各数据类型的大小

char 1 byte
short 2 byte
int 4 byte
long 4  byte
long long 8  byte
float 4  byte
double 8  byte

那么类型的作用是什么?创建变量。


3.常量、变量

生活中有很多东西是不变的,比如身份证号;有很多东西是可变的,比如年龄。

在C语言中,我们把不变的值叫常量,变的值叫变量。

定义变量的方法

        1.不能以数字开头

2.不超63个字符

3.区分大小写

示例

int age=20;
//每过一年
age=age+1;

变量的分类

       变量分为局部变量全局变量。全局变量作用于全局范围为,而局部变量作用于局部范围。通俗来讲,大括号内的是局部变量,大括号外的是全局变量。

//局部变量int main()
{int a=100;return 0;
}//全局变量int a=100;
int main()
{return 0;
}

当全局变量和局部变量名字冲突时,局部优先。

int a = 100;int main()
{int a = 10;printf("%d", a);return 0;
}

当然,我们最好不要让局部变量和全局变量名字相同。


变量的作用域和生命周期

作用域通俗来讲就是一段代码中所用到的名字有效的范围

局部变量:变量所在的局部范围。

全局变量:整个工程但是不能跨文件。

生命周期是变量的创建到变量的销毁之间的时间段。

局部变量:进入作用域生命周期开始,出作用于生命周期结束。

全局变量:整个程序的生命周期。

当一个变量的生命周期结束,我们就不能使用它/找到它了

示例:

int main()
{int a = 10;printf("%d", a);return 0;//printf("%d ", a);
}

      成功打印 


int main()
{int a = 10;//printf("%d", a);return 0;printf("%d ", a);
}

打印失败


常量的分类

    1.字面常量,就是直接写出来的常量

int main()
{3.14;return 0;
}

2.const 修饰的常变量

int main()
{const int a = 10;a = 20;//修改a会报错return 0;
}

a的本质是变量,const的修饰限定了他的改变,让他变成一个常量。

在后期const将非常有用,对于不想修改的变量,我们可以在前面加上const进行保护。

3 #define 定义的标识符常量

#define MAX 10000
#include<stdio.h>
int main()
{int a = MAX;printf("%d ", a);return 0;
}

当我们对MAX进行改变时,也会报错,由此可见,MAX为常量。

4可以一 一列举的常量(enum枚举)

enum Sex
{MALE,//0FEMALE,//1//从0开始 从上之下
};
int main()
{enum Sex s = MALE;printf("%d %d %d\n", MALE, FEMALE);//0 1 MALE = 2;//报错
}

当我们对MALE进行改变时,也会报错,由此可见,MALE为常量。

在后期,enum的枚举关键字将会对我们编写项目的菜单有所帮助哦


4   字符串

字符串就是用双引号括起来的一串字符。字符串自带一个结束标志  ‘ \0 ’。

int main()
{"abcdef";return 0;}

\0 作为结束标志,不算作长度。

int main()
{//用strlen求字符串长度int len = strlen("abc");printf("%d", len);return 0;
}

 

字符串会自带 \0,但是字符数组不会。

#include<stdio.h>#include<string.h>
int main()
{char arr1[] = { "abc" };char arr2[] = { 'a','b','c' };return 0;
}

调试一波查看一下arr1和arr2的成员,可以看到arr1有\0, arr2 没有。

一旦没有了\0,arr2的长度就是随机的了,它会一直向后计算,直到遇到\0。


5  转义字符

所有的 ASCII码 都可以用“\”加数字(一般是8进制数字)来表示。而 C 中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符

常见转义字符

(有的不太重要,会加*)

\?           在书写连续多个问号时使用,防止他们被解析成三字母词
\' 用于打印一个单引号
\" 用于表示一个字符串内部的双引号
\\ 用于打印一个  \
\a 电脑蜂鸣*
\b 退格符*
\f 进纸符*
\n 换行
\r 回车*
\t 水平制表符(8个空格)*
\v 垂直制表符*
\ddd ddd表示1 - 3个八进制数字.  如:\130 (输出x) (十进制为88,ASCII码为x)
\xdd d表示2个十六进制数字.如\x30(输出0)(十进制为48,ASCII码为0)

6. 注释

注释的作用

1 屏蔽掉没用的代码

2 添加文字注释,方便理解(好习惯)

注释的方式

          1.c++风格(推荐)

int main()
{//char arr1[] = { "abc" };//char arr2[] = { 'a','b','c' };return 0;

 2. c风格(不推荐)

int main()
{/*char arr1[] = {"abc"};char arr2[] = { 'a','b','c' };*/return 0;
}

在后期学预处理时,我们还会接触到一种有注释功能的操作

#if 0 和 #endif

#if 0#define MAX 10000
#include<stdio.h>
int main()
{int a = MAX;printf("%d ", a);return 0;
}#endif

7. 初始选择语句

在C语言中,有三种结构:顺序结构选择结构循环结构

例:如果 一刚 好好学习,校招时能拿到一个好offer,如果他不好好学习,就回家卖烤面筋。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//输入的值int input = 0;printf(" 一刚要好好学习吗?(1/0)");scanf("%d", &input);//选择if (1 == input){printf("好offer");}else{printf("卖烤面筋");}return 0;
}

其中,"好offer"和"卖烤面筋"就是两个选择。目前只是初识,其他的知识要在后面学习哦


8    初始循环语句

有些事是需要循环做的,比如写代码,学习

在C语言中循环有while循环,for循环,do...while循环

这里先给一个while循环的例子

我们写代码,假设写3万行代码就能拿到一个好offer

#include<stdio.h>
int main()
{int line = 0;while (line < 30000){printf("接着写代码");line++;}if (30000 == line){printf("好offer");}return 0;
}

9 初识函数

众所周知,C语言中有很多库函数,但如果只靠库函数就能解决问题,那还要我们程序员什么用?

所以我们也可以实现一个函数解决功能。

函数的结构

和之前我们介绍的main函数相同,我们自己实现的函数也有类似的结构

实现ADD函数

#include<stdio.h>int ADD(num1, num2)
{return (num1 + num2);
}int main()
{int num1 = 0;int num2 = 0;scanf("%d %d", &num1, &num2);int sum = ADD(num1, num2);printf("%d ",sum);return 0;
}

我们输入2 3,输出了5。


10  初始数组

数组的定义

所谓数组,就是一组相同类型元素的集合

数组的结构

      我们先初始化一个储存int类型的数组 

数组的访问

数组是通过下标访问的。下标从0开始,范围是0~(元素个数-1)。

以上面的元素为例,

arr[0] arr[1] arr[2] arr[3] arr[4] arr[5] arr[6] arr[7] arr[8] arr[9]
1 2 3 4 5 6 7 8 9

10

注意:访问数组中没有的下标叫做越界访问。越界访问可能会导致程序崩溃,程序出错等严重后果。而且编译器也不会报错提醒,我们要避免越界访问。


11  指针

指针的定义

内存是电脑上特别重要的存储器,分为一个个内存单元,每个内存单元大小为一个字节,

我们对每个单元用16进制进行编号。我们称这个编号为地址,我们将地址起名为指针,或者说用指针指向地址。

例:输入int a= 10; ,a分配了4个字节的空间

int main()
{int a = 10;return 0;
}

我们打开调试查看内存,输入&a(只能拿到第一个字节的地址)

得到了0x0113FB64,它就是存a的地址

(注:地址右边从右向左看是00 00 00 10正好是a的值。至于为什么是从右向左看而不是从左向右看,这就要等到后面的学习了)

如何存放及打印地址

      我们创建一个变量pa用来存放地址,我们称这个变量为指针变量。而pa也有它的类型int* 。

用printf打印时我们要用%p

#include<stdio.h>
int main()
{int a = 10;printf("%p", &a);return 0;
}

指针的大小 

由于指针是存放地址的,所以它的大小与执行对象的数据类型无关。

在32位机器下是32比特位,也就是4字节。

在64位机器下是64比特位,也就是8字节。


12 .  初识操作符

算数操作符

 +(加)   -(减)    *(乘)   /(除)% (取余)

我们重点放到后两个操作符上 

/(除)

我们知道,在数学中 9 / 2=4.5

那么在C语言中怎么样呢?

#include<stdio.h>
int main()
{int a = 0;a = 9 / 2;printf("%d", a);return 0;
}

    

为什么是4而不是4.5呢?因为a被定义为了int (整形),所以只能处理整形。

如果我们将a定义为了浮点型,9或2改成小数形式,再以浮点型打印,结果就能得到小数了。

#include<stdio.h>
int main()
{float a = 0;a = 9 / 2.0;printf("%f", a);return 0;
}


%(取余)

取余这个操作符的功能就是它的名字:"取出余数"。

 int main()
{int a = 0;a = 9 % 2;printf("%d", a);return 0;
}

9 = 2 * 4 + 1;所以1是余数

注意:% 两端的操作数必须为整数

移位操作符

>>(右移)   <<(左移)

移位移位,移的是什么位呢?移的是2进制位。

例:

int main()
{int a = 2;int b = a << 1;printf("%d ",b);return 0;
}

得到结果

光看可能不太好想,我们画个图分析一下。

1向左移了移位,所以从2^1--->2^2  , 也就是4


位操作符

&(按位与) | (按位或)   ^(按位异或)

这三个操作符同样也是对二进制位做事的,我们在之后的学习中在做介绍。


赋值操作符

=      +=      - =    *=    %=    /=   &=   ^=    |=    >>=   <<=

赋值操作符是非常好理解的东西。

int main()
{int a = 0;//假设我要将a+5赋给a//1.a = a + 5;//2.a += 5;return 0;
}

别的操作符同理。


单目操作符

所谓单目操作符,就是只有一个数操作数的操作符,像+、-有两个操作数,就是双目操作符

!(逻辑反操作)   -(负值)   +(正值)   &(取地址) sizeof(求操作数的类型长度)

~(对一个数的二进制位按位取反) ++、--(前/后置++、--) (类型)(强制类型转换)

!(逻辑反操作)

在C语言中,0表示假,非0表示真。

int main()
{//真int a = 10;//假printf("%d", !a);return 0;
}

得到结果0表示假。

另外,如果a不等于0,有 if(a) 表示"条件为真,执行操作",if(!a)表示"条件为假,不执行操作"。


+、- 较为简单,这里就不讲了。& 我们在指针中再做讲解会更好。


sizeof 用于操作数的类型长度,这里先给一波例子。

int main()
{int a = 10;printf("%d ", sizeof(int));printf("%d ", sizeof(a));//括号可省printf("%d ", sizeof a);
}

int 是4个字节;a是int类型,所以也是4个字节;因为括号可省,所以也是4个字节。

再给一波数组的例子:

int main()
{int arr[10] = { 0 };printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr[0]));}

1个int 4个字节,10个就是40个字节;而其中的某个元素就是1个int,也就是4个字节。

由此,我们得出了一个求数组元素个数的操作,这个操作再后续的学习中会经常用到。

//40/4=10int sz = sizeof(arr) / sizeof(arr[0]);

~用于把一个数的二进制按位取反,也就是把1变成0,0变成1

这里对原码,反码,补码进行一波科普,这对我们之后的学习非常重要。

*关于原码、反码、补码的科普

首先为什么会有原码反码补码这种东西?

原反补的概念主要是针对负数的,假设我们做 a-b 的运算,由于CPU只有加法器,所以a-b会转化为a+(-b)来计算,如果直接用本来的二进制位(原码),结果是算不出来的,这都是负数的锅,所以我们对负数进行原、反、补、的转换。而正数的原、反、补相同。

原码:原本的二进制位,为了区分正负数,高位是0的为正数,高位为1的为1负数。

例:1的二进制为:00000000 00000000 00000000 00000001

-1的二进制为:10000000 00000000 00000000 00000001

反码:符号位不变,对原码进行按位取反

例:-1的反码为  : 11111111 11111111 11111111 11111110

补码:反码加1

例:-1的补码为  :  11111111 11111111 11111111 11111111

如果我们在计算a-b时用补码计算,就可以得到正确结果。

所以,整数在内存中存的是补码,用%d打印出来的是原码。


前/后置++/--

前置++/-- : 先++/--,后使用

后置++/-- : 先使用, 后++/--

例:

int main()
{int a = 10;int b = ++a;//a=a+1,b=aprintf("a=%d b=%d\n", a, b);
}

 int main()
{int a = 10;int b = a++;//b=a,a=a+1printf("a=%d b=%d\n", a, b);return 0;
}

(类型) 强制转化类型

int main()
{int a = 3.14;printf("%d", a);
}

由于int 是整形,所以无法打印出3.14

我们可以对3.14强制类型转化为int,就能打印出3

int main()
{int a = (int)3.14;printf("%d", a);
}


关系操作符 

>(大于)    <(小于)     >=(大于等于)   <=(小于等于)   ==(等于)   !=(不等于)

这几个比较好理解,我们就一笔带过。


逻辑操作符

&&(并且)     ||(或者)

我们可以通过物理电路来理解。

&&就相当于串联电路,只有2个开关同时闭合才能接通电路。

而 || 就相当于并联电路,任意打开一个开关就能接通电路。

下面我们给一个代码的例子

int main()
{int a = 1;int b = 0;if (a && b){printf("hehe\n");}if (a || b){printf("haha\n");}
}

由于a&&b为假,a||b为真,所以打印haha。


条件操作符(三目操作符)

exp1 ? exp2 :exp3 (注:exp1、2、3均为表达式)当调用时,

如果exp1成立,exp2计算,整个表达式为exp2的值;

如果exp1不成立, exp3计算,整个表达式为exp3的值.

例:求两个数中的最大值

如果用if-else方法

int main()
{int a = 0;int b = 3;int max = 0;if (a > b){max = a;}else{max = b;}printf("%d",max);return 0;
}

但如果用三目操作符

#include<stdio.h>
int main()
{int a = 0;int b = 3;int max = a>b?a:b;printf("%d",max);return 0;
}

也可以达到效果。


逗号表达式

用逗号隔开的一串表达式。

exp1, exp2, exp3, …

从左向右计算,整个逗号表达式时最后一个表达式的值

例:

int main()
{int a = 0;int b = 3;int c = 5;int d = (a = b + 2, c = a - 4, b = c + 2);//a= 5,b = 3; c = 1printf("%d", d);
}

由于最后一个表达式为b,所以d==b,即打印3


下标引用、函数调用和访问结构体成员的操作符

下标引用[]  、函数引用() 、 结构体成员访问  .  ->

下标引用操作符

例:

#include<stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};printf("%d ",arr[5]);
}


函数引用操作符

printf("hehe");

其中的()就为函数引用操作符。


访问结构体成员的操作符先放到 初识结构体 中讲解,大家可以通过目录跳转哦。


13  常见关键字

C 语言标准中规定了32个关键字,像int这些我们已经较为熟悉了,这里我们介绍存储类型的几个关键字:auto、externregister、typedef、static

auto

声明自动变量,由于每个局部变量均由auto修饰,所以一般省略不写

extern

用于声明外部符号。

例:

我们创立两个源文件

在4ever.c中

int g_val = 2023;

在test.c中

 extern int g_val ;int main()
{printf("%d", g_val);return 0;
}

由于有extern声明g_val,所以可以成功打印


register

寄存器关键字,可将变量存于寄存器中。

在介绍之前,我们先进行一波科普。

数据在计算机中可存于5个地方:

网盘、硬盘、内存、高速缓存、寄存器。

从左至右,内存越来越小,造价越来越贵,但速度越来越快。

那么,寄存器关键字存在的意义是什么呢?

如果我们用register修饰了某些变量,当读取数据时,计算器先去寄存器中读取,如果没有读取到,再去高速缓存区中读取,最后才是内存,这大大提高了效率。


typedef

typedef用于对类型进行重命名,在后续的通讯录、顺序表、链表中会用到typedef对冗长的结构体进行简化。

例:

typedef unsigned u_intint main()
{u_int num = 100;return 0;
}

static

static有三个作用

1 修饰局部变量  2  修饰全局变量   3  修饰函数

1 修饰局部变量

   例:

void test()
{int a = 1;a++;printf("%d ", a);
}int main()
{int i = 0;while (i < 10){test();i++;}return 0;
}

分析:由于a是局部变量,所以出了test一定会销毁,所以每次打印2。

如果加上static修饰呢?

 void test()
{static int a = 1;a++;printf("%d ", a);
}int main()
{int i = 0;while (i < 10){test();i++;}return 0;
}

由结果我们可以看到,经过static修饰后,a的生命周期被改变了(但并未改变作用域),导致a并未销毁。这其中的本质是什么呢?

在内存中,我们目前大致分为栈区、堆区、静态区

而static修饰局部变量的本质就是将a的存储类型由栈区变为静态区


2 修饰全局变量

   回忆在extern中1的例子,当我们申请了两个源文件时,用extern声明就可以成功打印g_val。

但如果在g_val前加上static修饰,使这个变量仅可以在自己的源文件使用,就无法打印了。

这其中的本质是:全局变量之所以能在其他源文件内部使用,是由于其具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态局部变量了。

3  修饰函数

   修饰函数与修饰全局变量相似,都是将外部连接属性变为内部连接属性,且本质也是缩小了作用域。

给一波例子:

同样创建两个源文件

test.c中

#include<stdio.h>
extern int ADD(int x, int y); int main()
{int a = 10;int b = 20;int sum = ADD(a, b);printf("%d ", sum);return 0;
}

ADD.c中

int ADD(int x,int y)
{return x+y ;
}

显然,程序能输出结果30

而当函数被static修饰时,就会报错了。


14 define定义常量和宏

define定义符号

常量中我们已经了解到,define可以定义常量。

#include<stdio.h>
#define MAX 10000
#define STR "abcdef"
int main()
{printf("%d ",MAX);printf("%s ",STR);return 0;
}

输出:10000  abcdef

define定义宏

宏可以粗略理解为处理简单逻辑的函数,但其实二者的处理逻辑是不同的,这就要等到之后预处理的学习啦。

例:用宏实现两个数相加。

#include<stdio.h>
#define ADD(x,y) (x+y)
int main()
{printf("%d\n", ADD(2, 3));return 0;
}

最后输出 5。


15 初识结构体

自定义类型

自定义类型包含:结构体、枚举、联合体

结构体的定义

在C语言中存在着许多类型,但是他们只能表示部分数据,并不能描述一个复杂的事物,于是就引出了结构体。

结构体的声明&&结构

例:

struct stu
{char name[20];int age;double score;
}stu1;

其中,struct表示结构体关键字,stu为结构体标签,大括号中间的3个变量为该结构体的3个成员变量,stu1表示你创建了一个该类型的变量。


结构体的创建和初始化

 struct stu s = { "一钢",18,98.9 };

结构体的访问

结构体的访问有两种方式:传值和传址。

传值需要用到 . 操作符

printf("%s %d %lf", s.name, s.age, s.score);

传址需要用到 -> 操作符,还要先对s取地址

struct stu* ps = &s;
printf("%s %d %lf", ps->name, ps->age, ps->score);


总结

     做总结,我用这篇博客简单的带大家初识了一下C语言,后续会深入剖析各个重要章节。水平有限,还请各位大佬指正。如果觉得对你有帮助的话,还请三连关注一波。希望大家都能拿到心仪的offer哦。

每日gitee侠:今天你交gitee了嘛?

速通C语言第一站 一篇博客带你初识C语言相关推荐

  1. Flutter基础篇(2)-- 老司机用一篇博客带你快速熟悉Dart语法

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://www.jianshu.com/p/3d927a7bf020 转载请标明出处: https://www.jianshu.com/p/ ...

  2. 【算法篇】/*一篇博客带你详细了解马踏棋盘问题*/(java语言实现)

    [前言]本文部分内容引用于b站尚硅谷老师的资料,如有侵权,请及时联系作者! hello大家好! 我依然是你们熟悉的槿凉.那么最近呢由于躺平了几天,也没有来得及更新博客,没有办法啦!学校封的严严实实,闷 ...

  3. 【C++基础】C++入门篇之一篇博客带你看懂为什么学习C++,C语言和C++的主要区别

    C++入门篇 C++入门 C++关键字(C++98) 命名空间 命名空间的用法 命名空间的嵌套 命名空间会被合并 命名空间的使用 C++的输入输出 缺省参数 函数重载 重载分类 重载原理 引用 引用用 ...

  4. java map集合的等号改为逗号_老司机用一篇博客带你快速熟悉Dart语法

    [前言]Dart语言是使用flutter框架开发时候必备的语言,flutter是一个跨平台的框架,一套代码就可以完美实现安卓和ios两个平台,适配也很不错,Dart语言很友好,和java很类似,学习成 ...

  5. Dart的语法详解系列篇(1)---- 老司机用一篇博客带你快速熟悉Dart语法

    声明:本文是作者AWeiLoveAndroid原创,版权归作者AWeiLoveAndroid所有,侵权必究.如若转发,请注明作者和来源地址!未经授权,严禁私自转载! _________________ ...

  6. 一篇博客带你轻松应对java面试中的多线程与高并发

    1. Java线程的创建方式 (1)继承thread类 thread类本质是实现了runnable接口的一个实例,代表线程的一个实例.启动线程的方式start方法.start是一个本地方法,执行后,执 ...

  7. 一篇博客带你熟悉Eclipse、AndroidStudio下搭建NDK环境(内有Demo)

    文章目录 一.NDK可以干什么 二.NDK开发环境搭建 三.一个简单的NDK小案例的编写 一.NDK可以干什么 NDK:(Native Development Kit),原生开发工具包是一组可以让您在 ...

  8. 一篇博客带你轻松应对Springboot面试

    1. SpringBoot简介 SpringBoot是简化Spring应用开发的一个框架.他整合了Spring的技术栈,提供各种标准化的默认配置.使得我们可以快速开发Spring项目,免掉xml配置的 ...

  9. 一篇博客,带你找回登录密码

    是不是经常忘记这个登陆密码,但是打开浏览器登陆页面又有密码,但是又可以登录进去,怎样能看到密码呢? 就像这样: 想知道密吗?  今天告诉你两个查看明文的密码方法 1.打开都登陆页面,打开控制台(F12 ...

最新文章

  1. QIIME 2教程. 13训练特征分类器TrainingFeatureClassifiers(2021.2)
  2. Linux内核调试 - 一般人儿我都不告诉他(一)【转】
  3. 开源图像编辑器 GIMP 开发者透露 2019 年计划
  4. JEP 342:JVM和幽灵
  5. Dom4j完整教程~属性相关
  6. 用户需求源源不断,阿里云网络创新不止
  7. from gi.repository import Gtk, GObject
  8. 图像处理基本算法-直方图均衡
  9. c ++异常处理_C ++中的异常处理
  10. Java实现简单计算器
  11. 信息化建设成功的重要因素
  12. 建议收藏!高企申报全流程梳理:带你了解安徽省及16市高企申报的内容及要点
  13. Python包pretty_errors
  14. 身价过亿的妖媚子对小码农说串口能传送我的爱吗?
  15. 人脸图像的几何归一化和灰度归一化
  16. 上网行为管理设备网桥部署方式
  17. 软件开发外包管理的“一二四”
  18. ORA-64203: 目标缓冲区太小, 无法容纳字符集转换之后的 CLOB 数据
  19. 左手坐标系vs右手坐标系
  20. matlab凯塞窗设计,转载:用MATLAB设计FIR滤波器的方法解析

热门文章

  1. 怎样画化学实验装置图
  2. 疫情期间无法出门如何快速在线试妆?百度美妆试妆
  3. mysql inner join 效率_mysql的大小表前后顺序对inner join的效率有影响吗?
  4. linux font 安装等
  5. 多线程基础之二:mutex和semaphore使用方法
  6. php 箭头符号怎么打开,php箭头的用法是什么?
  7. AJAX-serializeArray()函数
  8. 【SemiDrive源码分析】【X9芯片启动流程】09 - X9平台系统启动流程分析
  9. max面部骨骼镜像脚本
  10. 短视频运营技巧合集(上)