初识C语言-B站”C语言编程学习“的笔记

1、什么是C语言

语言的发展:

低级语言:二进制:硬件-电-正电(1)/负电(0)

汇编语言:助记符:ADD

高级语言:C/C++

C语言->早期不成熟->成熟->流行

国际标准C89/C90

2、第一个C语言程序

C语言中,.c是源文件,.h是头文件

新建项时,选择C++项,但后缀写.c是C语言程序,.cpp是C++程序

项目右击->点击配置到配置页->配置属性->链接器->系统->子系统->控制台(/SUBSYSTEM:CONSOLE)

main(){}主函数

printf("");打印函数

#include <stdio.h>包含一个标准输入输出头文件 std - 标准standrad input output

3、数据类型

char

//字符数据类型

1(sizeof-byte-字节)

short

//短整型short int

2

int

//整形

4

long

//长整型

4/8

long long

//更长的整型

8

float

//单精度浮点数

4

double

//双精度浮点数

8

//C语言有没有字符串类型?

赋值:char ch = 'A';//将字符A赋值给字符数据类型的ch保存在内存中

printf("%c",ch);//打印字符数据类型的ch

scanf("%d%d",&num1,&num2);//输入int类型数据,&是取地址符号

%c-char %d-int %f-float %lf-double(这里l是小写的L) %p-以地址的形式打印 %x-打印16进制数字 %s-字符串string

计算机中的单位

bit - 比特位 - 1/0

byte - 字节 - 8个bit位

kb

mb

gb

tb

pb

float weight = 95.6f//不加f默认将95.6看成double类型,会警告精度丢失,加f将数字指定为float类型

4、变量、常量

变量:

局部变量 - 定义在代码块({})内的变量

全局变量 - 定义在代码块({})外的变量

局部变量和全局变量的名字建议不要相同-容易误会,产生bug

当局部变量和全局变量的名字相同的时候,局部变量优先

C语言语法(C89)规定,变量要定义在当前代码块的最前面(有的编译器会有所改进,对于不定义在代码块最前面的语句也不会报错),C++宽松一些,只要在使用之前定义了就行

不同C文件的全局变量若要相互使用需要先extern申明,例如A文件定义了int a = 3;B文件需要extern int a;才能使用A文件中全局变量a及其值

生命周期

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

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

Microsoft Visual Studio中使用scanf方法时,会

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

scanf是C语言提供的

scanf_s不是标准C语言提供的,是VS编译器提供的,scanf_s方法不能在除VS编译器以外的编译器里编译,代码会失去跨平台性/可移植性

只需要在文件开头加上“#define _CRT_SECURE_NO_WARNINGS 1”就可以忽略警告/错误提示

C语言提供的scanf、strcpy、strlen、strcat等库函数都是不安全的,所以VS都会弹出相应警告/错误提示,将_CRT_SECURE_NO_WARNINGS设为1后VS编译时就会忽略这些方法的不安全性。

还可以可以这样设置:选择VS2019的项目->属性->C/C++->预处理器->在预处理器定义中添加_CRT_SECURE_NO_WARNINGS,或者在VS安装目录中的VC->vcprojectitems的newc++file.cpp使用软件Edit with Notepad++(自己安装)打开并加上“#define _CRT_SECURE_NO_WARNINGS 1”就可以在每次新建C/C++文件时自动添加上这句。

常量:

C语言常量分类:

(1)字面常量:数字

(2)const修饰的常变量:const int num = 4;//const - 常属性、num变为了const修饰的常变量

const int n = 10;

int arr[n] = {0};//出错,因为n是有常属性的变量,依旧是一个变量,不能为创建数组大小时所用。

(3)#define定义的标识符常量:#define MAX 10

(4)枚举常量:枚举 - 一一列举

性别:男、女、保密;

三原色:红、绿、蓝;

enum Sex {

MALE,//男

FEMALE,//女

SECRET//保密

};//枚举关键字:enum,此时MALE,FEMALE,SECRET就是枚举常量

int main() {

enum Sex s = MALE;//变量s赋值为enum Sex类型的枚举常量MALE

printf("%d\n",MALE);//0

printf("%d\n",FEMALE);//1

printf("%d\n",SECRET);//2,这些数字不可被改变,比如这里SECRET=2,不能SECRET=10这样更改SECRET的值,但是这里的变量s的值可以改为枚举类型Sex括号中的其它值

return 0;

}

5、字符串+转义字符+注释

字符串:

"hello bit.\n"

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串,注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。终止密码子\0就是数字0。

char arr1[] = "abc";//数组

char arr2[] = {'a','b','c',0};

char arr3[] = {'a','b','c','\0'};

printf("%s\n",arr1);

printf("%s\n",arr2);

printf("%s\n",arr3);//arr1、arr2和arr3输出一样

VS软件中调试->窗口->监视可以监视程序中的变量和常量等

strlen(str)返回字符串长度,需要#include <string.h>

转义字符:

转变原来的意思

\?在书写连续多个问号时使用,防止他们被解析成三字母词,早期编译器??+字符(例如”)“)被称为三字母词,例如??)会被早期编译器识别为],所以需要写成\?\?)将?转义为正常字符

\'用于表示字符常量',例如char a = '''会报错,但是char a = '\''就表示字符'赋值给a

\"用于表示一个字符串内部的双引号

\\用于表示一个反斜杠,防止它被解释为一个转义序列符

\a警告字符,蜂鸣

\b退格符

\f进纸符

\n换行

\r回车

\t水平制表符

\v垂直制表符

\ddd其中ddd表示1~3个八进制的数字。如:\130代表八进制130在ASCII码表中对应的字符

\xdd其中dd表示2个十六进制数字。如:\x30代表十六进制30在ASCII码表中对应的字符

注释:

//注释内容,是C++的注释风格,可以注释一行也可以注释多行

/*注释内容*/,是C的注释风格,不能嵌套注释

例如:/*/*注释内容1*/注释内容2*/,此处注释内容2就不会被注释掉,且最后一个*/是多余的,会报错

用//多行注释在VC上栏有对应按键,也可以选中需要注释的几行ctrl+k+c注释,ctrl+k+u取消注释

6、选择语句

int main() {

int a = 0;

scanf("%d",&a);

if(a == 0) {

printf("a = 0");

} else if(a == 1) {

printf("a = 1");

} else {

printf("a != 0&&a != 1");

}

return 0;

}

7、循环语句

while语句

int a = 0;

while(a < 1) {

a++;

}//每循环一次a加1,直到a<10不成立退出循环,先判断后循环

for语句

for(int a = 0;a < 10;a++) {//每循环一次a加1,直到a<10不成立退出循环,先判断后循环

}

do while语句

int a = 0;

do {

a++;

} while(a < 10);//每循环一次a加1,直到a<10不成立退出循环,先循环后判断

8、函数

#include <stdio.h>

int Add (int x , int y) {

return x + y;

}

int main() {

int num , a , b ;

num = Add (a , b);

return 0;

}

当函数Add (x , y)写在main前面是如上;当写在main后面时,需要在main主函数上方声明:int Add (int x , int y);当写在此文件外面的.h文件中时也需要声明并#include "add.h",或将函数写在.c文件中并extern声明,#include后面用<>只会查询标准路径,效率更高,而使用""查询的路径更多(包含标准路径),也因此效率更低

内部函数(静态函数):只能本文件可用,须在函数名和函数类型前加static关键字

外部函数:可以被同一源程序中的其它函数调用,定义外部函数时可以加extern关键字(可省略),但是调用声明时不可省略关键字。

9、数组

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整型数组,最多放10个元素

arr[0]代表的是arr[]数组中的第一个元素,数组的下标编号是从0开始的

10、操作符

算术操作符

+、-、*、/、%

+加

-减

*乘

/除

%取余:

取模:

5 mod 3 = 2

-5 mod 3 = 1

5 mod -3 = -1

-5 mod -3 = -2

取余:

5 rem 3 = 2

-5 rem 3 = -2

5 rem -3 = 2

-5 rem -3 = -2

浏览器搜索得:在C/C++, C#, JAVA, PHP这几门主流语言中,’%’运算符都是做取余运算,而在python中的’%’是做取模运算,此外,余数在数学中的定义是始终大于等于0的,而对于某些编程语言的取余运算不是按照上面的定义来执行的,因此才会出现余数小于0的情况,我们在使用取模(取余)运算时要注意的地方有一个,当除数和被除数出现异号的情况时,程序移植的时候要特别小心,因为不同语言对取模和取余的定义可能是不同的

移位(二进制位)操作符

>>、<<

>>:右移,移二进制位

<<:左移

int a = 1;//00000000 00000000 00000000 00000001

int b = 0;

b = a<<1;//a=1,b=2,a本身是不变的

位(二进制位)操作符

&、^、|

&:按位与

|:按位或

^:按位异或

&这种属于位操作符,&&这种属于逻辑运算符,逻辑运算符用于判断true和false,位操作符用于二进制数的位操作,例如1&&2=true&&true=1,1&2=01&10=00=0

赋值操作符

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

单目操作符(只有一个操作对象)

!:逻辑反操作:!10是0

-:负值

+:正值

&:取地址

sizeof:操作数的类型长度(以字节为单位)

int a = 10;//sizeof(a)=sizeof(int)=sizeof a=4,sizeof int是错误格式

~:对一个数的二进制补码按位取反

原码、反码、补码,整数在内存中存储的时候,存储的是二进制的补码,int是有符号的整型

int a = 0;

int b = ~a;//a=-1

//a:00…00

//b:11…11,如果是有符号的二进制,则二进制最高位的0表示正数,1表示负数,负数存储为补码,打印出的是原码,负数的原码除符号位外各位取反得到反码,反码+1得到补码,正数的原码、反码和补码一样,原码、反码和补码是为了解决负数于加减运算时的问题,补码的补码就是原码。

--:前置、后置--,前置时先运算后返回值,后置时先返回值后运算

int a = 1;

int b = a--;//b=1,a=0

int c = --a;//c=-1,a=-1

++:前置、后置++

*:间接访问操作符(解引用操作符)

(类型):强制类型转换

双目操作符(有两个操作对象)

三目操作符(有三个操作对象)

关系操作符

>

>=

<

<=

!=用于测试“不相等”

==用于测试“相等”

逻辑操作符

&&逻辑与

||逻辑或

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

exp1 ? exp2 : exp3如果表达式1成立返回表达式2否则返回表达式3

逗号表达式

exp1, exp2, exp3, …expN

下标引用、函数调用和结构成员

[] () . ->

11、常见关键字

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

关键字auto

意思是自动

int main() {

int a = 10;//局部变量-自动变量-自动创建、自动销毁,这里int前面默认省略了关键字auto,本来是:

//auto int a = 10;局部变量都是自动变量所以就直接省略了auto关键字

return 0;

}

关键字break

可以在循环语句中停止循环,或在switch分支语句中跳出分支

关键字case

switch(表达式) {

case 常量表达式1:  语句1;

case 常量表达式2:  语句2;

case 常量表达式n:  语句n;

default:  语句n+1;

}

关键字char,字符类型

关键字const,常变量

关键字continue,意思是继续,用在循环里面

关键字default,意思是默认,是switch语句中的

关键字do,do{}while()语句

关键字double,双精度浮点型

关键字else,if{}if else{}else{}

关键字enum,枚举

关键字extern,引入外部符号

关键字float,单精度浮点型

关键字for,for循环

关键字goto,无条件跳转语句

goto label;

//其它代码

label:

其中,label为我们自己定义的一个标签,定义的规则与变量的命名相同,它的位置是不固定的,它可以写在goto语句的后面,也可以写在它的前面,然而goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。

关键字if,if{}else{}

关键字int,整型

关键字long,长整型

关键字register,寄存器关键字

计算机存储数据

寄存器

高速缓存

内存

硬盘

register int a = 10;//建议把a定义成寄存器变量

关键字return,返回

关键字short,短整型

关键字signed,int定义的整型是有符号的,signed int,我们只是把signed省略了,相反,unsigned int定义的整型就是无符号整型(只能是正数,即使赋值一个负数也会被认为是正数)

关键字sizeof,计算操作数的类型长度

关键字static,静态

将函数或变量设为静态,此static语句只在此文件中运行一次,不会被循环语句循环运行,static改变了函数或变量的链接属性(内部链接属性/外部链接属性),会将链接属性统一变为内部链接(只能在此文件中使用,且生命周期结束于此文件结束)

while(1){

int a = 1;

a++;

printf("%d",a);//此处打印为22222……

}//局部变量a出大括号生命周期结束,被销毁

while(1){

static int a = 1;

a++;

printf("%d",a);//此处打印为23456……

}//静态变量a出大括号生命周期不结束

关键字struct,结构体关键字

关键字switch

switch(表达式) {

case 常量表达式1:  语句1;

case 常量表达式2:  语句2;

case 常量表达式n:  语句n;

default:  语句n+1;

}

关键字typedef,类型定义,类型重定义

typedef unsigned int u_int;//给unsigned int定义一个别名:u_int

关键字union,联合体/共用体

关键字unsigned,无符号的

关键字void,无/空

关键字volatile,体现C语言段位的一个关键字,C语言中用的不多,比较难,操作系统中介绍

关键字while,while循环语句

12、#define定义常量和宏

#define MAX 100//定义标识符常量

#define max(x,y) (x>y?x:y)//定义宏

int main() {

int a = MAX;

int b = max(1,2);//int b = (x>y?x:y);

return 0;

}

define不是关键字,只是一种指令

13、指针

#include <studio.h>

int main() {

int a = 10;//4个字节

int* p = &a;

printf("%p\n",&a);

printf("%p\n",p);//两个输出是一样的,p就是&a,*p就是a

}

指针即指针变量,32bit平台的指针变量大小是4byte,64bit平台的指针变量大小是8byte

14、结构体

//创建结构体类型

struct Book {

char name[20];

short price;

struct Book* next;

};//这个分号不可缺少

int main() {

//创建结构体类型的变量

struct Book b1 = {"C语言程序设计",55};

struct Book b2 = {"hello",66,&b1};

struct Book* B3 = &b1;

printf("书名:%s\n",b2.name);//输出:“书名:hello”

printf("%s\n",b2.next->name);//输出:“C语言程序设计”

printf("%s\n",b3->name);//输出:“C语言程序设计”

printf("%s\n",(*b3).name);//输出:“C语言程序设计”

return 0;

}

结构体变量.成员

结构体指针->成员

strcpy(目标数组,数组):string copy,字符串拷贝,是库函数(头文件:string.h)

char[10] a = "hello";

strcpy(a,"world");//将world拷贝到a数组,即将world赋值给a字符数组

字符数组a本身是此数组的地址,不能粗暴的a = "world",不能将字符串(字符数组)赋值给一个字符数组地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值