Error[8]: Undefined offset: 77, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

一、课前的小建议:


1.养成写博客的习惯:对所学知识的总结、面试的谈资、愿意分享

2.维护github/gitee账号:大公司认可

3.学会编程≠学会C语言:(包括但不限于)计算机语言、算法和数据结构、 *** 作系统、计算机网络、数据库+项目实战

一、什么是C语言

1.语言:人与人之间交流的工具 -> 计算机语言:人与计算机之间交流的工具 (C语言实质上可以理解为一种工具 与计算机交流的方式)

2.目前已经有上千种计算机语言了,C语言只是其中一种(不过一直是流行排行榜的前三!)

3.计算机语言的发展:由低级到高级 (由难以 *** 作变得全民均可编程)

   二进制代码->汇编语言(助记符)-> B语言 -> C语言

4.C语言的国际标准 ANSI C C89 C90 C11

5.常见的编译器:Clang、GCC、MSVC、Turbo C

二、第一个C语言程序

1.注意后缀一定是.c 不然.cpp程序会以C++语法进行编译

#include 

int main()
{
	printf("hehe\n");
	return 0;
}

2.C语言代码中一定要有main函数(主函数)

   主函数的标准写法:

int main()
{

	return 0;
}

   古老的写法(不推荐):

void main()
{

}

3.printf是一个库函数,专门用来打印数据的

   #include

   std--标准 i--input o--output

   VS上快速运行代码:ctrl+f5

4.调试手段:f10 

   C语言规定:mian函数是程序的入口、main函数有且只有一个

5. ctrl+k+c:注释代码

    ctrl+k+v:取消注释

三、数据类型

1.为什么写代码:解决生活中的问题

   char - 字符数据类型

   short - 短整型

   int - 整型

   long - 长整型

   long long - 更长的整型

   float - 单精度浮点型

   double - 双精度浮点型

2.为什么这么多的类型?——提高空间利用率

   每种类型的大小是多少?

int main()
{
	printf("%zu\n", sizeof(char));//1
	printf("%zu\n", sizeof(short));//2
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof(long));//4
	printf("%zu\n", sizeof(long long))//8;
	printf("%zu\n", sizeof(float));//4
	printf("%zu\n", sizeof(double));//8
	return 0;
}

   计算机中的单位 : bite-比特位 byte kb mb gb tb pb

   十进制:0 1 2 3 4 5 6 7 8 9

   二进制:0 1

   1 byte = 8 bit (其余的单位间进制都是1024)

3.怎么使用类型?

int main()
{
	int age = 20;
	double price = 66.6;
	return 0;
}

四、变量和常量

1.不变的量:身份z、性别、血型、圆周率

   变化的量:年龄、体重、薪资

2.变量分为:局部变量({ }内部定义的变量)和全局变量({ }外部定义的变量)

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

   当全局变量和局部变量名字相同的情况下,局部变量优先

   但是建议不要把全局变量的名字和局部变量写成一样的

   3.写一个代码,计算两个整数的和

      printf是一个输出函数 scanf是一个输入函数

      scanf不能通过?——建议使用scanf_s(VS自己提供的函数,非标准C)

      解决方法:代码行第一行加上  #define  _CRT_SECURE_NO_WARNINGS

      VS安装路径下有一个newc++file.cpp的文件,在工程中创建新的c或者c++文件时,都是直接拷贝这个文件的

     用everything找到这个文件,把#define  _CRT_SECURE_NO_WARNINGS写入其中

int main()
{
	int num1 = 0;
	int num2 = 0;//初始化

	//输入两个整数
	scanf("%d %d", &num1, & num2);

	//求和
	int sum = num1 + num2;
	//输出
	printf("%d\n", sum);
	return 0;
}

4. 变量的作用域和生命周期

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

     局部变量的作用域就是变量所在的局部范围

int a = 10;

void test()
{
	printf("test-->%d\n", a);
}
int main()
{
	test();
	{
		printf("a=%d\n", a);//10
	}
	printf("a=%d\n", a);//10
	return 0;
}

   全局变量的作用域是整个工程

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

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

5.常量:描述不变的量

6.字面常量

	30;
	3.14;
	'w';//字符
	"abc";//字符串

7.const修饰的常变量

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

   在C语言中,const修饰的a,本质是变量,但不能直接修改,具有常属性

	int n = 10;
	int arr[n];//err
	const int n = 10;
	int arr[n];//err

8.define定义的标识符常量

#define MAX 100
int main()
{
	printf("%d\n", MAX);
	int a = MAX;
	printf("%d\n", a);
	return 0;
}
#define STR "abcdef"
int main()
{
	printf("%s\n", STR);
	return 0;
}

9.枚举常量

enum Color
{
	RED,
	GREEN,
	BLUE
};

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Color c = RED;
	RED = 20;//err
	return 0;
}

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

1.字符串

	//char 字符类型
	//'a';
	//char ch = 'w';

   C语言中没有字符串常量——用字符数组存储

int main()
{
	char arr1[] = "abcdef";//有'	char arr2[] = { 'a','b','c','d','e','f','int main()
{
	int len = strlen("abc");//3
	printf("%d\n", len);
	return 0;
}'};//结果正常'
	char arr2[] = { 'a','b','c','d','e','f' };//无'int main()
{
	char arr1[] = "abcdef";
	char arr2[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr1));//6
	printf("%d\n", strlen(arr2));//34
	return 0;
}
'
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

	printf("abcn");//abcn
	printf("abc\n");//abc

   字符串的结束标志——\0

   strlen——求字符串长度的函数(记得引头文件 string,h)

	printf("abc0def");//abc0def
	printf("abc	printf("%s\n", "(are you ok??)");def");//abc

	printf("%s\n", "(are you ok\?\?)");//改进

2.转义字符

	printf("%c\n", '\'');

   \n——换行符

	printf("\"");

\0——字符串的结束标志

	printf("abcd\0ef");//abcdint main()
{
	printf("%c\n", '0');//X
	return 0;
}ef

三字母词——早期少数编译器中出现

??)—— ]

??(—— [

	printf("%c\n", '\x60');//`

%d——打印整型

%c——打印字符

%s——打印字符串

%f——打印float类型的数据

%lf——打印double类型的数据

%zu——打印sizeof的返回值

	printf("%d\n", strlen("qwer t"));//6
	printf("%d\n", strlen("c:\test8\test.c"));//14

\'——转义单引号,让一个单引号不是一对单引号中的一个,而是一个单独的单引号

	//创建指针变量p,并赋值为NULL
	int* p = NULL;

\"——转义双引号,让一个双引号不是一对双引号中的一个,而是一个单独的双引号

int main()
{
	int input = 0;
	printf("要好好学习吗{1/0)?");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}
	return 0;
}

\\——转义斜杠,让斜杠不是一个转义字符的一部分,而是一个单独的斜杠

路径打印一定是两个斜杠

\a——触发电脑蜂鸣

\t——水平制表符

int main()
{
	int line = 0;
	printf("开始学习\n");
	while (line < 20000)
	{
		printf("写代码:%d\n",line);
		line++;
	}
	if (line == 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("继续加油\n");
	}
	return 0;
}

\ddd——打印以八进制数字转换为十进制数字为ASCII值对应的字符

\130——1*64+3*8+0=88 ‘X’的ASCII值

int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = n1 + n2;
	//打印
	printf("%d\n",sum);
	return 0;
}

\xdd——打印以十六进制数字转换为十进制数字为ASCII值对应的字符

\x60——6*16+0=96

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = Add(n1, n2);
	//打印
	printf("%d\n",sum);
	return 0;
}

3.注释

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

C语言的注释风格:/* */

C++语言的注释风格://

C的注释优点——可以一次性注释多行

              缺点——不可以嵌套注释

注释的优点:可以梳理代码逻辑、对复杂的代码可以进行解释、既帮助自己也帮助别人

六、选择语句

	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };

C语言实现分支——if/else语句、switch语句

七、循环语句

描述循环——while循环、do-while循环、for循环

20000行有效代码的积累!

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	printf("%d\n", arr[8]);//18
	return 0;
}

C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构

八、函数(可以把函数类比成加工原材料的工厂)

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i = i + 1;
	}
	return 0;
}
int main()
{
	int n = 10;
	int arr[n];
	//C99标准之前,数组的大小都是用常量或者常量表达式来指定
	int arr2[10] = { 0 };
	int arr3[4 + 6] = { 1,2,3,4 };
	//C99标准后,支持了变长数组,这个时候允许数组的大小是变量,但这种指定方式的数组是不能初始化的
	int m = 100;
	int arr4[m];/err
	//VS对C99的支持不是很好,不支持变长数组
	return 0;
}

返回类型 函数名(函数参数)

函数体

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

九、数组

int main()
{
	float a = 7 / 2.0;
	int b = 7 % 2;
	printf("%.2f\n", a);//3.50
	printf("%d\n", b);//1
	return 0;
}

数组的下标是从0开始的

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	return 0;
}

打印数组元素

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	a = a + 3;
	printf("%d\n", a);//23
	a += 3;
	printf("%d\n", a);//26
	return 0;
}

小飞机:小飞机_牛客题霸_牛客网

#include 

int main()
{
    printf("     **     \n");
    printf("     **     \n");
    printf("************\n");
    printf("************\n");
    printf("    *  *    \n");
    printf("    *  *    \n");
    return 0;
}

输出学生信息:输出学生信息_牛客题霸_牛客网

#include 

int main()
{
    printf("Name    Age    Gender\n");
    printf("---------------------\n");
    printf("Jack    18     man\n");
    return 0;
}

发布信息:发布信息_牛客题霸_牛客网

#include 

int main()
{
    printf("I lost my cellphone!\n");
    return 0;
}

计算表达式的值:计算表达式的值_牛客题霸_牛客网

#include 

int main()
{
    int a = 40;
    int c = 212;
    printf("%d\n",((-8+22)*a-10+c/2));
    return 0;
}

变长数组

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("hehe\n");//打印
	}
	return 0;
}

写一个函数求两个整数的较大值

int Max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//求两个整数的最大值
	int r = Max(a, b);
	printf("%d\n", r);
	return 0;
}

计算y的值 计算y的值_牛客题霸_牛客网

int main()
{
    //输入
    int x = 0;
    int y = 0;
    scanf("%d",&x);
    //计算
    if(x > 0)
    {
        y = -1;
    }
    else if(x == 0)
    {
        y = 0;
    }
    else
    {
        y = 1;
    }
    //输出
    printf("%d\n",y);
    return 0;
}

十、 *** 作符

1.算术 *** 作符:+ - * / %

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

除号的两端都是整数,执行整数除法;两端有一个浮点数,执行浮点数的除法

int main()
{
	int a = 10;
	printf("%zu\n", sizeof(a));//4
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof a);//4
	//printf("%zu\n", sizeof int);//err
	int arr[10] = { 0 };
	printf("%zu\n", sizeof(arr));//40,计算的是整个数组大小,单位是字节
    printf("%zu\n", sizeof(arr[0]));//4
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 计算的是数组的元素个数
	return 0;
}

取模的两个 *** 作数只能是整数

2.移位 *** 作符——涉及位的运算,后面讲

3.赋值 *** 作符 =

int main()
{
	int a = 10;
	int b = a++;//int b = a; a = a + 1;
	//后置++,先使用,再++
	printf("%d\n", b);//10
	printf("%d\n", a);//11
	return 0;
}
int main()
{
	int a = 10;
	int b = ++a;// a = a + 1;int b = a;
	//前置++,先++,再使用
	printf("%d\n", b);//11
	printf("%d\n", a);//11
	return 0;
}

4.单目 *** 作符

a + b——双目 *** 作符

单目 *** 作符——只有一个 *** 作数的 *** 作符

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

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

!——逻辑反 *** 作符

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

+- ——不改变/改变取值的正负

sizeof不是函数,而是单目 *** 作符

int main()
{
	//int a = 3.14;//3,14字面浮点数,编译器默认理解为double类型
	int a = (int)3.14;
	printf("%d\n", a);//3
	return 0;
}
int main()
{
	int a = 10;
	if (a = 3)//赋值而不是判断是否相等
	{
		printf("hehe\n");//打印
	}
	return 0;
}
int main()
{
	int a = 0;
	int b = 20;
	if (a && b)
	{
		printf("hehe\n");//不打印
	}
	if (a || b)
	{
		printf("haha\n");//打印
	}
	return 0;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	int d = (c = a - 2, a = b + c, c - 3);//c = -2 a = 28 d = 5
	printf("%d\n", d);//5
	return 0;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 3;
	arr[n] = 20;//[]就是下标引用 *** 作符,arr和3就是[]的 *** 作数
	return 0;
}

强制类型转换

int Add(int x. int y)
{
	return x + y;
}
int main()
{
	int sum = Add(2, 3);//()就是函数调用 *** 作符,Add,2,3都是()的 *** 作数
	return 0;
}

5.关系 *** 作符

== 判断是否相等

	auto int a = 10;//自动变量(可以被省略)

6.逻辑 *** 作符

&& 逻辑与——并且

|| 逻辑或——或者

typedef unsigned int uint;

typedef struct Node
{
	int data;
	struct Node* next;
}Node;
int main()
{
	unsigned int num = 0;
	uint num2 = 0;
	struct Node n1;
	Node n2;
	return 0;
}

7.条件 *** 作符(三目 *** 作符)

三目:三个 *** 作数

exp1 ?exp2 : exp3 

exp1为真,计算exp2作为整个表达式的结果;exp2为真,计算exp3作为整个表达式的结果

int main()
{
	int a = 10;
	int b = 20;
	int r = (a > b) ? a : b;//r得到a与b的较大值
	printf("%d\n", r);
	return 0;
}

8.逗号表达式

逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果

void test()
{
	int a = 1;
	a++;
	printf("%d\n", a);//打印10个2
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

9.下标引用 *** 作符

void test()
{
	static int a = 1;
	a++;
	printf("%d\n", a);//打印2-11
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

10.函数调用 *** 作符

int g_val = 2022;//另一个源文件中

十一、常见关键字

关键字是C语言本身内置的,不是自己创建出来的,也不能自己创建

extern int g_val = 2022;//声明外部符号

int main()
{
	printf("%d\n", g_val);//2022
	return 0;
}

变量的名字:有意义 ;必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头;变量名不能是关键字

1.typedef

static int g_val = 2022;//另一个源文件中

类型重命名——别名

2.static(静态的)

extern int g_val = 2022;

int main()
{
	printf("%d\n", g_val);//err
	return 0;
}
int Add(int x, int y)
{
	return x + y;//另一个源文件中
}

static修饰局部变量时,局部变量出了作用域,不会被销毁;本质上,static修饰局部变量的时候,改变了变量的存储位置,影响了变量的生命周期,生命周期变长,和程序的生命周期一样

extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//30
	return 0;
}
static int Add(int x, int y)
{
	return x + y;//另一个源文件中
}
extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//err
	return 0;
}
int main()
{
	register int num = 3;//建议把3放在寄存器中
	return 0;
}

static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件就不能再使用到这个全局变量了

#define NUM 100

int main()
{
	printf("%d\n", NUM);//100
	int n = NUM;
	printf("%d\n", n);//100
	int arr[NUM] = { 0 };//不报错
	return 0;
}
#define ADD(x,y) ((x)+(y))


int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 10;//向内存申请4个字节,存储10
	printf("%p\n", &a);
	int* p = &a;//p就是指针变量
	return 0;
}
	char ch = 'w';
	char* pc = &ch;

一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成内部链接属性了,其他源文件就无法使用了

3.register(寄存器关键字)

电脑上的存储设备——硬盘+内存+高速缓存(cache)+寄存器(集成在CPU上)

上层存储设备空间小,造价高,运算速度快

	printf("%zu\n", sizeof(char*));//4
	printf("%zu\n", sizeof(short*));//4
	printf("%zu\n", sizeof(int*));//4
	printf("%zu\n", sizeof(float*));//4
	printf("%zu\n", sizeof(double*));//4

十二、#define定义的常量和宏

define定义的常量

struct Stu
{
	//成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	//结构体对象.成员名
	printf("%s %d %s %s", s.name, s.age, s.sex, s.tele);
	return 0;
}

define定义的宏

print(struct Stu* ps)
{
	printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
}
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	print(&s);
	return 0;
}

宏名(参数,无类型的)宏体

头文件中进行函数的声明、类型的声明、头文件的包含(.h)

源文件中进行函数的实现(.c)

浮点数的四舍五入,不能用肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存

十三、指针

1.内存

为了有效使用内存,内存会被划分为一个个的内存单元(1个内存单元的大小是一个字节),每个内存单元都有一个编号

32位电脑——32位地址线——2^32个地址序列——4G

内存单元的编号——地址——指针

存放指针(地址)的变量就是指针变量

[+++]

*说明p是指针变量,int说明p指向的对象是int类型的

[+++]

2.指针变量的大小

[+++]

不管使用什么类型的指针,都是在创建指针变量

指针变量是用来存放地址的,它的大小取决于一个地址存放的时候需要多少空间

32位机器上的地址——4byte——32bit 所以指针大小4个字节(x86)

64位机器上指针大小8个字节(x64)

十四、结构体

C语言提供了自定义类型的能力——结构体,把单一类型组合在一起

[+++]
[+++]
	//结构体指针->成员名
	printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele);

作业题:

1.swtich语句中没有continue

2.define不是C语言规定的关键字,而是预处理指令

3.计算带余除法 计算带余除法_牛客题霸_牛客网

#include 

int main()
{
    int a = 0;
    int b = 0;
    //输入
    scanf("%d %d",&a, &b);
    
    //计算
    int m = a / b;
    int n = a % b;
    
    //输出
    printf("%d %d\n", m, n);
    return 0;
}
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 78, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

一、课前的小建议:


1.养成写博客的习惯:对所学知识的总结、面试的谈资、愿意分享

2.维护github/gitee账号:大公司认可

3.学会编程≠学会C语言:(包括但不限于)计算机语言、算法和数据结构、 *** 作系统、计算机网络、数据库+项目实战

一、什么是C语言

1.语言:人与人之间交流的工具 -> 计算机语言:人与计算机之间交流的工具 (C语言实质上可以理解为一种工具 与计算机交流的方式)

2.目前已经有上千种计算机语言了,C语言只是其中一种(不过一直是流行排行榜的前三!)

3.计算机语言的发展:由低级到高级 (由难以 *** 作变得全民均可编程)

   二进制代码->汇编语言(助记符)-> B语言 -> C语言

4.C语言的国际标准 ANSI C C89 C90 C11

5.常见的编译器:Clang、GCC、MSVC、Turbo C

二、第一个C语言程序

1.注意后缀一定是.c 不然.cpp程序会以C++语法进行编译

#include 

int main()
{
	printf("hehe\n");
	return 0;
}

2.C语言代码中一定要有main函数(主函数)

   主函数的标准写法:

int main()
{

	return 0;
}

   古老的写法(不推荐):

void main()
{

}

3.printf是一个库函数,专门用来打印数据的

   #include

   std--标准 i--input o--output

   VS上快速运行代码:ctrl+f5

4.调试手段:f10 

   C语言规定:mian函数是程序的入口、main函数有且只有一个

5. ctrl+k+c:注释代码

    ctrl+k+v:取消注释

三、数据类型

1.为什么写代码:解决生活中的问题

   char - 字符数据类型

   short - 短整型

   int - 整型

   long - 长整型

   long long - 更长的整型

   float - 单精度浮点型

   double - 双精度浮点型

2.为什么这么多的类型?——提高空间利用率

   每种类型的大小是多少?

int main()
{
	printf("%zu\n", sizeof(char));//1
	printf("%zu\n", sizeof(short));//2
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof(long));//4
	printf("%zu\n", sizeof(long long))//8;
	printf("%zu\n", sizeof(float));//4
	printf("%zu\n", sizeof(double));//8
	return 0;
}

   计算机中的单位 : bite-比特位 byte kb mb gb tb pb

   十进制:0 1 2 3 4 5 6 7 8 9

   二进制:0 1

   1 byte = 8 bit (其余的单位间进制都是1024)

3.怎么使用类型?

int main()
{
	int age = 20;
	double price = 66.6;
	return 0;
}

四、变量和常量

1.不变的量:身份z、性别、血型、圆周率

   变化的量:年龄、体重、薪资

2.变量分为:局部变量({ }内部定义的变量)和全局变量({ }外部定义的变量)

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

   当全局变量和局部变量名字相同的情况下,局部变量优先

   但是建议不要把全局变量的名字和局部变量写成一样的

   3.写一个代码,计算两个整数的和

      printf是一个输出函数 scanf是一个输入函数

      scanf不能通过?——建议使用scanf_s(VS自己提供的函数,非标准C)

      解决方法:代码行第一行加上  #define  _CRT_SECURE_NO_WARNINGS

      VS安装路径下有一个newc++file.cpp的文件,在工程中创建新的c或者c++文件时,都是直接拷贝这个文件的

     用everything找到这个文件,把#define  _CRT_SECURE_NO_WARNINGS写入其中

int main()
{
	int num1 = 0;
	int num2 = 0;//初始化

	//输入两个整数
	scanf("%d %d", &num1, & num2);

	//求和
	int sum = num1 + num2;
	//输出
	printf("%d\n", sum);
	return 0;
}

4. 变量的作用域和生命周期

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

     局部变量的作用域就是变量所在的局部范围

int a = 10;

void test()
{
	printf("test-->%d\n", a);
}
int main()
{
	test();
	{
		printf("a=%d\n", a);//10
	}
	printf("a=%d\n", a);//10
	return 0;
}

   全局变量的作用域是整个工程

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

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

5.常量:描述不变的量

6.字面常量

	30;
	3.14;
	'w';//字符
	"abc";//字符串

7.const修饰的常变量

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

   在C语言中,const修饰的a,本质是变量,但不能直接修改,具有常属性

	int n = 10;
	int arr[n];//err
	const int n = 10;
	int arr[n];//err

8.define定义的标识符常量

#define MAX 100
int main()
{
	printf("%d\n", MAX);
	int a = MAX;
	printf("%d\n", a);
	return 0;
}
#define STR "abcdef"
int main()
{
	printf("%s\n", STR);
	return 0;
}

9.枚举常量

enum Color
{
	RED,
	GREEN,
	BLUE
};

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Color c = RED;
	RED = 20;//err
	return 0;
}

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

1.字符串

	//char 字符类型
	//'a';
	//char ch = 'w';

   C语言中没有字符串常量——用字符数组存储

int main()
{
	char arr1[] = "abcdef";//有'	char arr2[] = { 'a','b','c','d','e','f','int main()
{
	int len = strlen("abc");//3
	printf("%d\n", len);
	return 0;
}'};//结果正常'
	char arr2[] = { 'a','b','c','d','e','f' };//无'int main()
{
	char arr1[] = "abcdef";
	char arr2[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr1));//6
	printf("%d\n", strlen(arr2));//34
	return 0;
}
'
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

	printf("abcn");//abcn
	printf("abc\n");//abc

   字符串的结束标志——\0

   strlen——求字符串长度的函数(记得引头文件 string,h)

	printf("abc0def");//abc0def
	printf("abc	printf("%s\n", "(are you ok??)");def");//abc

	printf("%s\n", "(are you ok\?\?)");//改进

2.转义字符

	printf("%c\n", '\'');

   \n——换行符

	printf("\"");

\0——字符串的结束标志

	printf("abcd\0ef");//abcdint main()
{
	printf("%c\n", '0');//X
	return 0;
}ef

三字母词——早期少数编译器中出现

??)—— ]

??(—— [

	printf("%c\n", '\x60');//`

%d——打印整型

%c——打印字符

%s——打印字符串

%f——打印float类型的数据

%lf——打印double类型的数据

%zu——打印sizeof的返回值

	printf("%d\n", strlen("qwer t"));//6
	printf("%d\n", strlen("c:\test8\test.c"));//14

\'——转义单引号,让一个单引号不是一对单引号中的一个,而是一个单独的单引号

	//创建指针变量p,并赋值为NULL
	int* p = NULL;

\"——转义双引号,让一个双引号不是一对双引号中的一个,而是一个单独的双引号

int main()
{
	int input = 0;
	printf("要好好学习吗{1/0)?");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}
	return 0;
}

\\——转义斜杠,让斜杠不是一个转义字符的一部分,而是一个单独的斜杠

路径打印一定是两个斜杠

\a——触发电脑蜂鸣

\t——水平制表符

int main()
{
	int line = 0;
	printf("开始学习\n");
	while (line < 20000)
	{
		printf("写代码:%d\n",line);
		line++;
	}
	if (line == 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("继续加油\n");
	}
	return 0;
}

\ddd——打印以八进制数字转换为十进制数字为ASCII值对应的字符

\130——1*64+3*8+0=88 ‘X’的ASCII值

int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = n1 + n2;
	//打印
	printf("%d\n",sum);
	return 0;
}

\xdd——打印以十六进制数字转换为十进制数字为ASCII值对应的字符

\x60——6*16+0=96

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = Add(n1, n2);
	//打印
	printf("%d\n",sum);
	return 0;
}

3.注释

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

C语言的注释风格:/* */

C++语言的注释风格://

C的注释优点——可以一次性注释多行

              缺点——不可以嵌套注释

注释的优点:可以梳理代码逻辑、对复杂的代码可以进行解释、既帮助自己也帮助别人

六、选择语句

	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };

C语言实现分支——if/else语句、switch语句

七、循环语句

描述循环——while循环、do-while循环、for循环

20000行有效代码的积累!

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	printf("%d\n", arr[8]);//18
	return 0;
}

C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构

八、函数(可以把函数类比成加工原材料的工厂)

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i = i + 1;
	}
	return 0;
}
int main()
{
	int n = 10;
	int arr[n];
	//C99标准之前,数组的大小都是用常量或者常量表达式来指定
	int arr2[10] = { 0 };
	int arr3[4 + 6] = { 1,2,3,4 };
	//C99标准后,支持了变长数组,这个时候允许数组的大小是变量,但这种指定方式的数组是不能初始化的
	int m = 100;
	int arr4[m];/err
	//VS对C99的支持不是很好,不支持变长数组
	return 0;
}

返回类型 函数名(函数参数)

函数体

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

九、数组

int main()
{
	float a = 7 / 2.0;
	int b = 7 % 2;
	printf("%.2f\n", a);//3.50
	printf("%d\n", b);//1
	return 0;
}

数组的下标是从0开始的

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	return 0;
}

打印数组元素

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	a = a + 3;
	printf("%d\n", a);//23
	a += 3;
	printf("%d\n", a);//26
	return 0;
}

小飞机:小飞机_牛客题霸_牛客网

#include 

int main()
{
    printf("     **     \n");
    printf("     **     \n");
    printf("************\n");
    printf("************\n");
    printf("    *  *    \n");
    printf("    *  *    \n");
    return 0;
}

输出学生信息:输出学生信息_牛客题霸_牛客网

#include 

int main()
{
    printf("Name    Age    Gender\n");
    printf("---------------------\n");
    printf("Jack    18     man\n");
    return 0;
}

发布信息:发布信息_牛客题霸_牛客网

#include 

int main()
{
    printf("I lost my cellphone!\n");
    return 0;
}

计算表达式的值:计算表达式的值_牛客题霸_牛客网

#include 

int main()
{
    int a = 40;
    int c = 212;
    printf("%d\n",((-8+22)*a-10+c/2));
    return 0;
}

变长数组

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("hehe\n");//打印
	}
	return 0;
}

写一个函数求两个整数的较大值

int Max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//求两个整数的最大值
	int r = Max(a, b);
	printf("%d\n", r);
	return 0;
}

计算y的值 计算y的值_牛客题霸_牛客网

int main()
{
    //输入
    int x = 0;
    int y = 0;
    scanf("%d",&x);
    //计算
    if(x > 0)
    {
        y = -1;
    }
    else if(x == 0)
    {
        y = 0;
    }
    else
    {
        y = 1;
    }
    //输出
    printf("%d\n",y);
    return 0;
}

十、 *** 作符

1.算术 *** 作符:+ - * / %

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

除号的两端都是整数,执行整数除法;两端有一个浮点数,执行浮点数的除法

int main()
{
	int a = 10;
	printf("%zu\n", sizeof(a));//4
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof a);//4
	//printf("%zu\n", sizeof int);//err
	int arr[10] = { 0 };
	printf("%zu\n", sizeof(arr));//40,计算的是整个数组大小,单位是字节
    printf("%zu\n", sizeof(arr[0]));//4
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 计算的是数组的元素个数
	return 0;
}

取模的两个 *** 作数只能是整数

2.移位 *** 作符——涉及位的运算,后面讲

3.赋值 *** 作符 =

int main()
{
	int a = 10;
	int b = a++;//int b = a; a = a + 1;
	//后置++,先使用,再++
	printf("%d\n", b);//10
	printf("%d\n", a);//11
	return 0;
}
int main()
{
	int a = 10;
	int b = ++a;// a = a + 1;int b = a;
	//前置++,先++,再使用
	printf("%d\n", b);//11
	printf("%d\n", a);//11
	return 0;
}

4.单目 *** 作符

a + b——双目 *** 作符

单目 *** 作符——只有一个 *** 作数的 *** 作符

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

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

!——逻辑反 *** 作符

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

+- ——不改变/改变取值的正负

sizeof不是函数,而是单目 *** 作符

int main()
{
	//int a = 3.14;//3,14字面浮点数,编译器默认理解为double类型
	int a = (int)3.14;
	printf("%d\n", a);//3
	return 0;
}
int main()
{
	int a = 10;
	if (a = 3)//赋值而不是判断是否相等
	{
		printf("hehe\n");//打印
	}
	return 0;
}
int main()
{
	int a = 0;
	int b = 20;
	if (a && b)
	{
		printf("hehe\n");//不打印
	}
	if (a || b)
	{
		printf("haha\n");//打印
	}
	return 0;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	int d = (c = a - 2, a = b + c, c - 3);//c = -2 a = 28 d = 5
	printf("%d\n", d);//5
	return 0;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 3;
	arr[n] = 20;//[]就是下标引用 *** 作符,arr和3就是[]的 *** 作数
	return 0;
}

强制类型转换

int Add(int x. int y)
{
	return x + y;
}
int main()
{
	int sum = Add(2, 3);//()就是函数调用 *** 作符,Add,2,3都是()的 *** 作数
	return 0;
}

5.关系 *** 作符

== 判断是否相等

	auto int a = 10;//自动变量(可以被省略)

6.逻辑 *** 作符

&& 逻辑与——并且

|| 逻辑或——或者

typedef unsigned int uint;

typedef struct Node
{
	int data;
	struct Node* next;
}Node;
int main()
{
	unsigned int num = 0;
	uint num2 = 0;
	struct Node n1;
	Node n2;
	return 0;
}

7.条件 *** 作符(三目 *** 作符)

三目:三个 *** 作数

exp1 ?exp2 : exp3 

exp1为真,计算exp2作为整个表达式的结果;exp2为真,计算exp3作为整个表达式的结果

int main()
{
	int a = 10;
	int b = 20;
	int r = (a > b) ? a : b;//r得到a与b的较大值
	printf("%d\n", r);
	return 0;
}

8.逗号表达式

逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果

void test()
{
	int a = 1;
	a++;
	printf("%d\n", a);//打印10个2
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

9.下标引用 *** 作符

void test()
{
	static int a = 1;
	a++;
	printf("%d\n", a);//打印2-11
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

10.函数调用 *** 作符

int g_val = 2022;//另一个源文件中

十一、常见关键字

关键字是C语言本身内置的,不是自己创建出来的,也不能自己创建

extern int g_val = 2022;//声明外部符号

int main()
{
	printf("%d\n", g_val);//2022
	return 0;
}

变量的名字:有意义 ;必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头;变量名不能是关键字

1.typedef

static int g_val = 2022;//另一个源文件中

类型重命名——别名

2.static(静态的)

extern int g_val = 2022;

int main()
{
	printf("%d\n", g_val);//err
	return 0;
}
int Add(int x, int y)
{
	return x + y;//另一个源文件中
}

static修饰局部变量时,局部变量出了作用域,不会被销毁;本质上,static修饰局部变量的时候,改变了变量的存储位置,影响了变量的生命周期,生命周期变长,和程序的生命周期一样

extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//30
	return 0;
}
static int Add(int x, int y)
{
	return x + y;//另一个源文件中
}
extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//err
	return 0;
}
int main()
{
	register int num = 3;//建议把3放在寄存器中
	return 0;
}

static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件就不能再使用到这个全局变量了

#define NUM 100

int main()
{
	printf("%d\n", NUM);//100
	int n = NUM;
	printf("%d\n", n);//100
	int arr[NUM] = { 0 };//不报错
	return 0;
}
#define ADD(x,y) ((x)+(y))


int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 10;//向内存申请4个字节,存储10
	printf("%p\n", &a);
	int* p = &a;//p就是指针变量
	return 0;
}
	char ch = 'w';
	char* pc = &ch;

一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成内部链接属性了,其他源文件就无法使用了

3.register(寄存器关键字)

电脑上的存储设备——硬盘+内存+高速缓存(cache)+寄存器(集成在CPU上)

上层存储设备空间小,造价高,运算速度快

	printf("%zu\n", sizeof(char*));//4
	printf("%zu\n", sizeof(short*));//4
	printf("%zu\n", sizeof(int*));//4
	printf("%zu\n", sizeof(float*));//4
	printf("%zu\n", sizeof(double*));//4

十二、#define定义的常量和宏

define定义的常量

struct Stu
{
	//成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	//结构体对象.成员名
	printf("%s %d %s %s", s.name, s.age, s.sex, s.tele);
	return 0;
}

define定义的宏

print(struct Stu* ps)
{
	printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
}
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	print(&s);
	return 0;
}

宏名(参数,无类型的)宏体

头文件中进行函数的声明、类型的声明、头文件的包含(.h)

源文件中进行函数的实现(.c)

浮点数的四舍五入,不能用肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存

十三、指针

1.内存

为了有效使用内存,内存会被划分为一个个的内存单元(1个内存单元的大小是一个字节),每个内存单元都有一个编号

32位电脑——32位地址线——2^32个地址序列——4G

内存单元的编号——地址——指针

存放指针(地址)的变量就是指针变量

 

*说明p是指针变量,int说明p指向的对象是int类型的

[+++]

2.指针变量的大小

[+++]

不管使用什么类型的指针,都是在创建指针变量

指针变量是用来存放地址的,它的大小取决于一个地址存放的时候需要多少空间

32位机器上的地址——4byte——32bit 所以指针大小4个字节(x86)

64位机器上指针大小8个字节(x64)

十四、结构体

C语言提供了自定义类型的能力——结构体,把单一类型组合在一起

[+++]
[+++]
	//结构体指针->成员名
	printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele);

作业题:

1.swtich语句中没有continue

2.define不是C语言规定的关键字,而是预处理指令

3.计算带余除法 计算带余除法_牛客题霸_牛客网

#include 

int main()
{
    int a = 0;
    int b = 0;
    //输入
    scanf("%d %d",&a, &b);
    
    //计算
    int m = a / b;
    int n = a % b;
    
    //输出
    printf("%d %d\n", m, n);
    return 0;
}
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 79, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

一、课前的小建议:


1.养成写博客的习惯:对所学知识的总结、面试的谈资、愿意分享

2.维护github/gitee账号:大公司认可

3.学会编程≠学会C语言:(包括但不限于)计算机语言、算法和数据结构、 *** 作系统、计算机网络、数据库+项目实战

一、什么是C语言

1.语言:人与人之间交流的工具 -> 计算机语言:人与计算机之间交流的工具 (C语言实质上可以理解为一种工具 与计算机交流的方式)

2.目前已经有上千种计算机语言了,C语言只是其中一种(不过一直是流行排行榜的前三!)

3.计算机语言的发展:由低级到高级 (由难以 *** 作变得全民均可编程)

   二进制代码->汇编语言(助记符)-> B语言 -> C语言

4.C语言的国际标准 ANSI C C89 C90 C11

5.常见的编译器:Clang、GCC、MSVC、Turbo C

二、第一个C语言程序

1.注意后缀一定是.c 不然.cpp程序会以C++语法进行编译

#include 

int main()
{
	printf("hehe\n");
	return 0;
}

2.C语言代码中一定要有main函数(主函数)

   主函数的标准写法:

int main()
{

	return 0;
}

   古老的写法(不推荐):

void main()
{

}

3.printf是一个库函数,专门用来打印数据的

   #include

   std--标准 i--input o--output

   VS上快速运行代码:ctrl+f5

4.调试手段:f10 

   C语言规定:mian函数是程序的入口、main函数有且只有一个

5. ctrl+k+c:注释代码

    ctrl+k+v:取消注释

三、数据类型

1.为什么写代码:解决生活中的问题

   char - 字符数据类型

   short - 短整型

   int - 整型

   long - 长整型

   long long - 更长的整型

   float - 单精度浮点型

   double - 双精度浮点型

2.为什么这么多的类型?——提高空间利用率

   每种类型的大小是多少?

int main()
{
	printf("%zu\n", sizeof(char));//1
	printf("%zu\n", sizeof(short));//2
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof(long));//4
	printf("%zu\n", sizeof(long long))//8;
	printf("%zu\n", sizeof(float));//4
	printf("%zu\n", sizeof(double));//8
	return 0;
}

   计算机中的单位 : bite-比特位 byte kb mb gb tb pb

   十进制:0 1 2 3 4 5 6 7 8 9

   二进制:0 1

   1 byte = 8 bit (其余的单位间进制都是1024)

3.怎么使用类型?

int main()
{
	int age = 20;
	double price = 66.6;
	return 0;
}

四、变量和常量

1.不变的量:身份z、性别、血型、圆周率

   变化的量:年龄、体重、薪资

2.变量分为:局部变量({ }内部定义的变量)和全局变量({ }外部定义的变量)

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

   当全局变量和局部变量名字相同的情况下,局部变量优先

   但是建议不要把全局变量的名字和局部变量写成一样的

   3.写一个代码,计算两个整数的和

      printf是一个输出函数 scanf是一个输入函数

      scanf不能通过?——建议使用scanf_s(VS自己提供的函数,非标准C)

      解决方法:代码行第一行加上  #define  _CRT_SECURE_NO_WARNINGS

      VS安装路径下有一个newc++file.cpp的文件,在工程中创建新的c或者c++文件时,都是直接拷贝这个文件的

     用everything找到这个文件,把#define  _CRT_SECURE_NO_WARNINGS写入其中

int main()
{
	int num1 = 0;
	int num2 = 0;//初始化

	//输入两个整数
	scanf("%d %d", &num1, & num2);

	//求和
	int sum = num1 + num2;
	//输出
	printf("%d\n", sum);
	return 0;
}

4. 变量的作用域和生命周期

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

     局部变量的作用域就是变量所在的局部范围

int a = 10;

void test()
{
	printf("test-->%d\n", a);
}
int main()
{
	test();
	{
		printf("a=%d\n", a);//10
	}
	printf("a=%d\n", a);//10
	return 0;
}

   全局变量的作用域是整个工程

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

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

5.常量:描述不变的量

6.字面常量

	30;
	3.14;
	'w';//字符
	"abc";//字符串

7.const修饰的常变量

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

   在C语言中,const修饰的a,本质是变量,但不能直接修改,具有常属性

	int n = 10;
	int arr[n];//err
	const int n = 10;
	int arr[n];//err

8.define定义的标识符常量

#define MAX 100
int main()
{
	printf("%d\n", MAX);
	int a = MAX;
	printf("%d\n", a);
	return 0;
}
#define STR "abcdef"
int main()
{
	printf("%s\n", STR);
	return 0;
}

9.枚举常量

enum Color
{
	RED,
	GREEN,
	BLUE
};

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Color c = RED;
	RED = 20;//err
	return 0;
}

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

1.字符串

	//char 字符类型
	//'a';
	//char ch = 'w';

   C语言中没有字符串常量——用字符数组存储

int main()
{
	char arr1[] = "abcdef";//有'	char arr2[] = { 'a','b','c','d','e','f','int main()
{
	int len = strlen("abc");//3
	printf("%d\n", len);
	return 0;
}'};//结果正常'
	char arr2[] = { 'a','b','c','d','e','f' };//无'int main()
{
	char arr1[] = "abcdef";
	char arr2[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr1));//6
	printf("%d\n", strlen(arr2));//34
	return 0;
}
'
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

	printf("abcn");//abcn
	printf("abc\n");//abc

   字符串的结束标志——\0

   strlen——求字符串长度的函数(记得引头文件 string,h)

	printf("abc0def");//abc0def
	printf("abc	printf("%s\n", "(are you ok??)");def");//abc

	printf("%s\n", "(are you ok\?\?)");//改进

2.转义字符

	printf("%c\n", '\'');

   \n——换行符

	printf("\"");

\0——字符串的结束标志

	printf("abcd\0ef");//abcdint main()
{
	printf("%c\n", '0');//X
	return 0;
}ef

三字母词——早期少数编译器中出现

??)—— ]

??(—— [

	printf("%c\n", '\x60');//`

%d——打印整型

%c——打印字符

%s——打印字符串

%f——打印float类型的数据

%lf——打印double类型的数据

%zu——打印sizeof的返回值

	printf("%d\n", strlen("qwer t"));//6
	printf("%d\n", strlen("c:\test8\test.c"));//14

\'——转义单引号,让一个单引号不是一对单引号中的一个,而是一个单独的单引号

	//创建指针变量p,并赋值为NULL
	int* p = NULL;

\"——转义双引号,让一个双引号不是一对双引号中的一个,而是一个单独的双引号

int main()
{
	int input = 0;
	printf("要好好学习吗{1/0)?");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}
	return 0;
}

\\——转义斜杠,让斜杠不是一个转义字符的一部分,而是一个单独的斜杠

路径打印一定是两个斜杠

\a——触发电脑蜂鸣

\t——水平制表符

int main()
{
	int line = 0;
	printf("开始学习\n");
	while (line < 20000)
	{
		printf("写代码:%d\n",line);
		line++;
	}
	if (line == 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("继续加油\n");
	}
	return 0;
}

\ddd——打印以八进制数字转换为十进制数字为ASCII值对应的字符

\130——1*64+3*8+0=88 ‘X’的ASCII值

int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = n1 + n2;
	//打印
	printf("%d\n",sum);
	return 0;
}

\xdd——打印以十六进制数字转换为十进制数字为ASCII值对应的字符

\x60——6*16+0=96

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = Add(n1, n2);
	//打印
	printf("%d\n",sum);
	return 0;
}

3.注释

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

C语言的注释风格:/* */

C++语言的注释风格://

C的注释优点——可以一次性注释多行

              缺点——不可以嵌套注释

注释的优点:可以梳理代码逻辑、对复杂的代码可以进行解释、既帮助自己也帮助别人

六、选择语句

	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };

C语言实现分支——if/else语句、switch语句

七、循环语句

描述循环——while循环、do-while循环、for循环

20000行有效代码的积累!

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	printf("%d\n", arr[8]);//18
	return 0;
}

C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构

八、函数(可以把函数类比成加工原材料的工厂)

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i = i + 1;
	}
	return 0;
}
int main()
{
	int n = 10;
	int arr[n];
	//C99标准之前,数组的大小都是用常量或者常量表达式来指定
	int arr2[10] = { 0 };
	int arr3[4 + 6] = { 1,2,3,4 };
	//C99标准后,支持了变长数组,这个时候允许数组的大小是变量,但这种指定方式的数组是不能初始化的
	int m = 100;
	int arr4[m];/err
	//VS对C99的支持不是很好,不支持变长数组
	return 0;
}

返回类型 函数名(函数参数)

函数体

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

九、数组

int main()
{
	float a = 7 / 2.0;
	int b = 7 % 2;
	printf("%.2f\n", a);//3.50
	printf("%d\n", b);//1
	return 0;
}

数组的下标是从0开始的

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	return 0;
}

打印数组元素

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	a = a + 3;
	printf("%d\n", a);//23
	a += 3;
	printf("%d\n", a);//26
	return 0;
}

小飞机:小飞机_牛客题霸_牛客网

#include 

int main()
{
    printf("     **     \n");
    printf("     **     \n");
    printf("************\n");
    printf("************\n");
    printf("    *  *    \n");
    printf("    *  *    \n");
    return 0;
}

输出学生信息:输出学生信息_牛客题霸_牛客网

#include 

int main()
{
    printf("Name    Age    Gender\n");
    printf("---------------------\n");
    printf("Jack    18     man\n");
    return 0;
}

发布信息:发布信息_牛客题霸_牛客网

#include 

int main()
{
    printf("I lost my cellphone!\n");
    return 0;
}

计算表达式的值:计算表达式的值_牛客题霸_牛客网

#include 

int main()
{
    int a = 40;
    int c = 212;
    printf("%d\n",((-8+22)*a-10+c/2));
    return 0;
}

变长数组

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("hehe\n");//打印
	}
	return 0;
}

写一个函数求两个整数的较大值

int Max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//求两个整数的最大值
	int r = Max(a, b);
	printf("%d\n", r);
	return 0;
}

计算y的值 计算y的值_牛客题霸_牛客网

int main()
{
    //输入
    int x = 0;
    int y = 0;
    scanf("%d",&x);
    //计算
    if(x > 0)
    {
        y = -1;
    }
    else if(x == 0)
    {
        y = 0;
    }
    else
    {
        y = 1;
    }
    //输出
    printf("%d\n",y);
    return 0;
}

十、 *** 作符

1.算术 *** 作符:+ - * / %

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

除号的两端都是整数,执行整数除法;两端有一个浮点数,执行浮点数的除法

int main()
{
	int a = 10;
	printf("%zu\n", sizeof(a));//4
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof a);//4
	//printf("%zu\n", sizeof int);//err
	int arr[10] = { 0 };
	printf("%zu\n", sizeof(arr));//40,计算的是整个数组大小,单位是字节
    printf("%zu\n", sizeof(arr[0]));//4
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 计算的是数组的元素个数
	return 0;
}

取模的两个 *** 作数只能是整数

2.移位 *** 作符——涉及位的运算,后面讲

3.赋值 *** 作符 =

int main()
{
	int a = 10;
	int b = a++;//int b = a; a = a + 1;
	//后置++,先使用,再++
	printf("%d\n", b);//10
	printf("%d\n", a);//11
	return 0;
}
int main()
{
	int a = 10;
	int b = ++a;// a = a + 1;int b = a;
	//前置++,先++,再使用
	printf("%d\n", b);//11
	printf("%d\n", a);//11
	return 0;
}

4.单目 *** 作符

a + b——双目 *** 作符

单目 *** 作符——只有一个 *** 作数的 *** 作符

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

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

!——逻辑反 *** 作符

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

+- ——不改变/改变取值的正负

sizeof不是函数,而是单目 *** 作符

int main()
{
	//int a = 3.14;//3,14字面浮点数,编译器默认理解为double类型
	int a = (int)3.14;
	printf("%d\n", a);//3
	return 0;
}
int main()
{
	int a = 10;
	if (a = 3)//赋值而不是判断是否相等
	{
		printf("hehe\n");//打印
	}
	return 0;
}
int main()
{
	int a = 0;
	int b = 20;
	if (a && b)
	{
		printf("hehe\n");//不打印
	}
	if (a || b)
	{
		printf("haha\n");//打印
	}
	return 0;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	int d = (c = a - 2, a = b + c, c - 3);//c = -2 a = 28 d = 5
	printf("%d\n", d);//5
	return 0;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 3;
	arr[n] = 20;//[]就是下标引用 *** 作符,arr和3就是[]的 *** 作数
	return 0;
}

强制类型转换

int Add(int x. int y)
{
	return x + y;
}
int main()
{
	int sum = Add(2, 3);//()就是函数调用 *** 作符,Add,2,3都是()的 *** 作数
	return 0;
}

5.关系 *** 作符

== 判断是否相等

	auto int a = 10;//自动变量(可以被省略)

6.逻辑 *** 作符

&& 逻辑与——并且

|| 逻辑或——或者

typedef unsigned int uint;

typedef struct Node
{
	int data;
	struct Node* next;
}Node;
int main()
{
	unsigned int num = 0;
	uint num2 = 0;
	struct Node n1;
	Node n2;
	return 0;
}

7.条件 *** 作符(三目 *** 作符)

三目:三个 *** 作数

exp1 ?exp2 : exp3 

exp1为真,计算exp2作为整个表达式的结果;exp2为真,计算exp3作为整个表达式的结果

int main()
{
	int a = 10;
	int b = 20;
	int r = (a > b) ? a : b;//r得到a与b的较大值
	printf("%d\n", r);
	return 0;
}

8.逗号表达式

逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果

void test()
{
	int a = 1;
	a++;
	printf("%d\n", a);//打印10个2
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

9.下标引用 *** 作符

void test()
{
	static int a = 1;
	a++;
	printf("%d\n", a);//打印2-11
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

10.函数调用 *** 作符

int g_val = 2022;//另一个源文件中

十一、常见关键字

关键字是C语言本身内置的,不是自己创建出来的,也不能自己创建

extern int g_val = 2022;//声明外部符号

int main()
{
	printf("%d\n", g_val);//2022
	return 0;
}

变量的名字:有意义 ;必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头;变量名不能是关键字

1.typedef

static int g_val = 2022;//另一个源文件中

类型重命名——别名

2.static(静态的)

extern int g_val = 2022;

int main()
{
	printf("%d\n", g_val);//err
	return 0;
}
int Add(int x, int y)
{
	return x + y;//另一个源文件中
}

static修饰局部变量时,局部变量出了作用域,不会被销毁;本质上,static修饰局部变量的时候,改变了变量的存储位置,影响了变量的生命周期,生命周期变长,和程序的生命周期一样

extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//30
	return 0;
}
static int Add(int x, int y)
{
	return x + y;//另一个源文件中
}
extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//err
	return 0;
}
int main()
{
	register int num = 3;//建议把3放在寄存器中
	return 0;
}

static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件就不能再使用到这个全局变量了

#define NUM 100

int main()
{
	printf("%d\n", NUM);//100
	int n = NUM;
	printf("%d\n", n);//100
	int arr[NUM] = { 0 };//不报错
	return 0;
}
#define ADD(x,y) ((x)+(y))


int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 10;//向内存申请4个字节,存储10
	printf("%p\n", &a);
	int* p = &a;//p就是指针变量
	return 0;
}
	char ch = 'w';
	char* pc = &ch;

一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成内部链接属性了,其他源文件就无法使用了

3.register(寄存器关键字)

电脑上的存储设备——硬盘+内存+高速缓存(cache)+寄存器(集成在CPU上)

上层存储设备空间小,造价高,运算速度快

	printf("%zu\n", sizeof(char*));//4
	printf("%zu\n", sizeof(short*));//4
	printf("%zu\n", sizeof(int*));//4
	printf("%zu\n", sizeof(float*));//4
	printf("%zu\n", sizeof(double*));//4

十二、#define定义的常量和宏

define定义的常量

struct Stu
{
	//成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	//结构体对象.成员名
	printf("%s %d %s %s", s.name, s.age, s.sex, s.tele);
	return 0;
}

define定义的宏

print(struct Stu* ps)
{
	printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
}
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	print(&s);
	return 0;
}

宏名(参数,无类型的)宏体

头文件中进行函数的声明、类型的声明、头文件的包含(.h)

源文件中进行函数的实现(.c)

浮点数的四舍五入,不能用肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存

十三、指针

1.内存

为了有效使用内存,内存会被划分为一个个的内存单元(1个内存单元的大小是一个字节),每个内存单元都有一个编号

32位电脑——32位地址线——2^32个地址序列——4G

内存单元的编号——地址——指针

存放指针(地址)的变量就是指针变量

 

*说明p是指针变量,int说明p指向的对象是int类型的

 

2.指针变量的大小

[+++]

不管使用什么类型的指针,都是在创建指针变量

指针变量是用来存放地址的,它的大小取决于一个地址存放的时候需要多少空间

32位机器上的地址——4byte——32bit 所以指针大小4个字节(x86)

64位机器上指针大小8个字节(x64)

十四、结构体

C语言提供了自定义类型的能力——结构体,把单一类型组合在一起

[+++]
[+++]
	//结构体指针->成员名
	printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele);

作业题:

1.swtich语句中没有continue

2.define不是C语言规定的关键字,而是预处理指令

3.计算带余除法 计算带余除法_牛客题霸_牛客网

#include 

int main()
{
    int a = 0;
    int b = 0;
    //输入
    scanf("%d %d",&a, &b);
    
    //计算
    int m = a / b;
    int n = a % b;
    
    //输出
    printf("%d %d\n", m, n);
    return 0;
}
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 80, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

一、课前的小建议:


1.养成写博客的习惯:对所学知识的总结、面试的谈资、愿意分享

2.维护github/gitee账号:大公司认可

3.学会编程≠学会C语言:(包括但不限于)计算机语言、算法和数据结构、 *** 作系统、计算机网络、数据库+项目实战

一、什么是C语言

1.语言:人与人之间交流的工具 -> 计算机语言:人与计算机之间交流的工具 (C语言实质上可以理解为一种工具 与计算机交流的方式)

2.目前已经有上千种计算机语言了,C语言只是其中一种(不过一直是流行排行榜的前三!)

3.计算机语言的发展:由低级到高级 (由难以 *** 作变得全民均可编程)

   二进制代码->汇编语言(助记符)-> B语言 -> C语言

4.C语言的国际标准 ANSI C C89 C90 C11

5.常见的编译器:Clang、GCC、MSVC、Turbo C

二、第一个C语言程序

1.注意后缀一定是.c 不然.cpp程序会以C++语法进行编译

#include 

int main()
{
	printf("hehe\n");
	return 0;
}

2.C语言代码中一定要有main函数(主函数)

   主函数的标准写法:

int main()
{

	return 0;
}

   古老的写法(不推荐):

void main()
{

}

3.printf是一个库函数,专门用来打印数据的

   #include

   std--标准 i--input o--output

   VS上快速运行代码:ctrl+f5

4.调试手段:f10 

   C语言规定:mian函数是程序的入口、main函数有且只有一个

5. ctrl+k+c:注释代码

    ctrl+k+v:取消注释

三、数据类型

1.为什么写代码:解决生活中的问题

   char - 字符数据类型

   short - 短整型

   int - 整型

   long - 长整型

   long long - 更长的整型

   float - 单精度浮点型

   double - 双精度浮点型

2.为什么这么多的类型?——提高空间利用率

   每种类型的大小是多少?

int main()
{
	printf("%zu\n", sizeof(char));//1
	printf("%zu\n", sizeof(short));//2
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof(long));//4
	printf("%zu\n", sizeof(long long))//8;
	printf("%zu\n", sizeof(float));//4
	printf("%zu\n", sizeof(double));//8
	return 0;
}

   计算机中的单位 : bite-比特位 byte kb mb gb tb pb

   十进制:0 1 2 3 4 5 6 7 8 9

   二进制:0 1

   1 byte = 8 bit (其余的单位间进制都是1024)

3.怎么使用类型?

int main()
{
	int age = 20;
	double price = 66.6;
	return 0;
}

四、变量和常量

1.不变的量:身份z、性别、血型、圆周率

   变化的量:年龄、体重、薪资

2.变量分为:局部变量({ }内部定义的变量)和全局变量({ }外部定义的变量)

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

   当全局变量和局部变量名字相同的情况下,局部变量优先

   但是建议不要把全局变量的名字和局部变量写成一样的

   3.写一个代码,计算两个整数的和

      printf是一个输出函数 scanf是一个输入函数

      scanf不能通过?——建议使用scanf_s(VS自己提供的函数,非标准C)

      解决方法:代码行第一行加上  #define  _CRT_SECURE_NO_WARNINGS

      VS安装路径下有一个newc++file.cpp的文件,在工程中创建新的c或者c++文件时,都是直接拷贝这个文件的

     用everything找到这个文件,把#define  _CRT_SECURE_NO_WARNINGS写入其中

int main()
{
	int num1 = 0;
	int num2 = 0;//初始化

	//输入两个整数
	scanf("%d %d", &num1, & num2);

	//求和
	int sum = num1 + num2;
	//输出
	printf("%d\n", sum);
	return 0;
}

4. 变量的作用域和生命周期

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

     局部变量的作用域就是变量所在的局部范围

int a = 10;

void test()
{
	printf("test-->%d\n", a);
}
int main()
{
	test();
	{
		printf("a=%d\n", a);//10
	}
	printf("a=%d\n", a);//10
	return 0;
}

   全局变量的作用域是整个工程

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

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

5.常量:描述不变的量

6.字面常量

	30;
	3.14;
	'w';//字符
	"abc";//字符串

7.const修饰的常变量

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

   在C语言中,const修饰的a,本质是变量,但不能直接修改,具有常属性

	int n = 10;
	int arr[n];//err
	const int n = 10;
	int arr[n];//err

8.define定义的标识符常量

#define MAX 100
int main()
{
	printf("%d\n", MAX);
	int a = MAX;
	printf("%d\n", a);
	return 0;
}
#define STR "abcdef"
int main()
{
	printf("%s\n", STR);
	return 0;
}

9.枚举常量

enum Color
{
	RED,
	GREEN,
	BLUE
};

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Color c = RED;
	RED = 20;//err
	return 0;
}

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

1.字符串

	//char 字符类型
	//'a';
	//char ch = 'w';

   C语言中没有字符串常量——用字符数组存储

int main()
{
	char arr1[] = "abcdef";//有'	char arr2[] = { 'a','b','c','d','e','f','int main()
{
	int len = strlen("abc");//3
	printf("%d\n", len);
	return 0;
}'};//结果正常'
	char arr2[] = { 'a','b','c','d','e','f' };//无'int main()
{
	char arr1[] = "abcdef";
	char arr2[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr1));//6
	printf("%d\n", strlen(arr2));//34
	return 0;
}
'
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

	printf("abcn");//abcn
	printf("abc\n");//abc

   字符串的结束标志——\0

   strlen——求字符串长度的函数(记得引头文件 string,h)

	printf("abc0def");//abc0def
	printf("abc	printf("%s\n", "(are you ok??)");def");//abc

	printf("%s\n", "(are you ok\?\?)");//改进

2.转义字符

	printf("%c\n", '\'');

   \n——换行符

	printf("\"");

\0——字符串的结束标志

	printf("abcd\0ef");//abcdint main()
{
	printf("%c\n", '0');//X
	return 0;
}ef

三字母词——早期少数编译器中出现

??)—— ]

??(—— [

	printf("%c\n", '\x60');//`

%d——打印整型

%c——打印字符

%s——打印字符串

%f——打印float类型的数据

%lf——打印double类型的数据

%zu——打印sizeof的返回值

	printf("%d\n", strlen("qwer t"));//6
	printf("%d\n", strlen("c:\test8\test.c"));//14

\'——转义单引号,让一个单引号不是一对单引号中的一个,而是一个单独的单引号

	//创建指针变量p,并赋值为NULL
	int* p = NULL;

\"——转义双引号,让一个双引号不是一对双引号中的一个,而是一个单独的双引号

int main()
{
	int input = 0;
	printf("要好好学习吗{1/0)?");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}
	return 0;
}

\\——转义斜杠,让斜杠不是一个转义字符的一部分,而是一个单独的斜杠

路径打印一定是两个斜杠

\a——触发电脑蜂鸣

\t——水平制表符

int main()
{
	int line = 0;
	printf("开始学习\n");
	while (line < 20000)
	{
		printf("写代码:%d\n",line);
		line++;
	}
	if (line == 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("继续加油\n");
	}
	return 0;
}

\ddd——打印以八进制数字转换为十进制数字为ASCII值对应的字符

\130——1*64+3*8+0=88 ‘X’的ASCII值

int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = n1 + n2;
	//打印
	printf("%d\n",sum);
	return 0;
}

\xdd——打印以十六进制数字转换为十进制数字为ASCII值对应的字符

\x60——6*16+0=96

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = Add(n1, n2);
	//打印
	printf("%d\n",sum);
	return 0;
}

3.注释

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

C语言的注释风格:/* */

C++语言的注释风格://

C的注释优点——可以一次性注释多行

              缺点——不可以嵌套注释

注释的优点:可以梳理代码逻辑、对复杂的代码可以进行解释、既帮助自己也帮助别人

六、选择语句

	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };

C语言实现分支——if/else语句、switch语句

七、循环语句

描述循环——while循环、do-while循环、for循环

20000行有效代码的积累!

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	printf("%d\n", arr[8]);//18
	return 0;
}

C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构

八、函数(可以把函数类比成加工原材料的工厂)

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i = i + 1;
	}
	return 0;
}
int main()
{
	int n = 10;
	int arr[n];
	//C99标准之前,数组的大小都是用常量或者常量表达式来指定
	int arr2[10] = { 0 };
	int arr3[4 + 6] = { 1,2,3,4 };
	//C99标准后,支持了变长数组,这个时候允许数组的大小是变量,但这种指定方式的数组是不能初始化的
	int m = 100;
	int arr4[m];/err
	//VS对C99的支持不是很好,不支持变长数组
	return 0;
}

返回类型 函数名(函数参数)

函数体

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

九、数组

int main()
{
	float a = 7 / 2.0;
	int b = 7 % 2;
	printf("%.2f\n", a);//3.50
	printf("%d\n", b);//1
	return 0;
}

数组的下标是从0开始的

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	return 0;
}

打印数组元素

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	a = a + 3;
	printf("%d\n", a);//23
	a += 3;
	printf("%d\n", a);//26
	return 0;
}

小飞机:小飞机_牛客题霸_牛客网

#include 

int main()
{
    printf("     **     \n");
    printf("     **     \n");
    printf("************\n");
    printf("************\n");
    printf("    *  *    \n");
    printf("    *  *    \n");
    return 0;
}

输出学生信息:输出学生信息_牛客题霸_牛客网

#include 

int main()
{
    printf("Name    Age    Gender\n");
    printf("---------------------\n");
    printf("Jack    18     man\n");
    return 0;
}

发布信息:发布信息_牛客题霸_牛客网

#include 

int main()
{
    printf("I lost my cellphone!\n");
    return 0;
}

计算表达式的值:计算表达式的值_牛客题霸_牛客网

#include 

int main()
{
    int a = 40;
    int c = 212;
    printf("%d\n",((-8+22)*a-10+c/2));
    return 0;
}

变长数组

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("hehe\n");//打印
	}
	return 0;
}

写一个函数求两个整数的较大值

int Max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//求两个整数的最大值
	int r = Max(a, b);
	printf("%d\n", r);
	return 0;
}

计算y的值 计算y的值_牛客题霸_牛客网

int main()
{
    //输入
    int x = 0;
    int y = 0;
    scanf("%d",&x);
    //计算
    if(x > 0)
    {
        y = -1;
    }
    else if(x == 0)
    {
        y = 0;
    }
    else
    {
        y = 1;
    }
    //输出
    printf("%d\n",y);
    return 0;
}

十、 *** 作符

1.算术 *** 作符:+ - * / %

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

除号的两端都是整数,执行整数除法;两端有一个浮点数,执行浮点数的除法

int main()
{
	int a = 10;
	printf("%zu\n", sizeof(a));//4
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof a);//4
	//printf("%zu\n", sizeof int);//err
	int arr[10] = { 0 };
	printf("%zu\n", sizeof(arr));//40,计算的是整个数组大小,单位是字节
    printf("%zu\n", sizeof(arr[0]));//4
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 计算的是数组的元素个数
	return 0;
}

取模的两个 *** 作数只能是整数

2.移位 *** 作符——涉及位的运算,后面讲

3.赋值 *** 作符 =

int main()
{
	int a = 10;
	int b = a++;//int b = a; a = a + 1;
	//后置++,先使用,再++
	printf("%d\n", b);//10
	printf("%d\n", a);//11
	return 0;
}
int main()
{
	int a = 10;
	int b = ++a;// a = a + 1;int b = a;
	//前置++,先++,再使用
	printf("%d\n", b);//11
	printf("%d\n", a);//11
	return 0;
}

4.单目 *** 作符

a + b——双目 *** 作符

单目 *** 作符——只有一个 *** 作数的 *** 作符

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

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

!——逻辑反 *** 作符

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

+- ——不改变/改变取值的正负

sizeof不是函数,而是单目 *** 作符

int main()
{
	//int a = 3.14;//3,14字面浮点数,编译器默认理解为double类型
	int a = (int)3.14;
	printf("%d\n", a);//3
	return 0;
}
int main()
{
	int a = 10;
	if (a = 3)//赋值而不是判断是否相等
	{
		printf("hehe\n");//打印
	}
	return 0;
}
int main()
{
	int a = 0;
	int b = 20;
	if (a && b)
	{
		printf("hehe\n");//不打印
	}
	if (a || b)
	{
		printf("haha\n");//打印
	}
	return 0;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	int d = (c = a - 2, a = b + c, c - 3);//c = -2 a = 28 d = 5
	printf("%d\n", d);//5
	return 0;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 3;
	arr[n] = 20;//[]就是下标引用 *** 作符,arr和3就是[]的 *** 作数
	return 0;
}

强制类型转换

int Add(int x. int y)
{
	return x + y;
}
int main()
{
	int sum = Add(2, 3);//()就是函数调用 *** 作符,Add,2,3都是()的 *** 作数
	return 0;
}

5.关系 *** 作符

== 判断是否相等

	auto int a = 10;//自动变量(可以被省略)

6.逻辑 *** 作符

&& 逻辑与——并且

|| 逻辑或——或者

typedef unsigned int uint;

typedef struct Node
{
	int data;
	struct Node* next;
}Node;
int main()
{
	unsigned int num = 0;
	uint num2 = 0;
	struct Node n1;
	Node n2;
	return 0;
}

7.条件 *** 作符(三目 *** 作符)

三目:三个 *** 作数

exp1 ?exp2 : exp3 

exp1为真,计算exp2作为整个表达式的结果;exp2为真,计算exp3作为整个表达式的结果

int main()
{
	int a = 10;
	int b = 20;
	int r = (a > b) ? a : b;//r得到a与b的较大值
	printf("%d\n", r);
	return 0;
}

8.逗号表达式

逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果

void test()
{
	int a = 1;
	a++;
	printf("%d\n", a);//打印10个2
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

9.下标引用 *** 作符

void test()
{
	static int a = 1;
	a++;
	printf("%d\n", a);//打印2-11
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

10.函数调用 *** 作符

int g_val = 2022;//另一个源文件中

十一、常见关键字

关键字是C语言本身内置的,不是自己创建出来的,也不能自己创建

extern int g_val = 2022;//声明外部符号

int main()
{
	printf("%d\n", g_val);//2022
	return 0;
}

变量的名字:有意义 ;必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头;变量名不能是关键字

1.typedef

static int g_val = 2022;//另一个源文件中

类型重命名——别名

2.static(静态的)

extern int g_val = 2022;

int main()
{
	printf("%d\n", g_val);//err
	return 0;
}
int Add(int x, int y)
{
	return x + y;//另一个源文件中
}

static修饰局部变量时,局部变量出了作用域,不会被销毁;本质上,static修饰局部变量的时候,改变了变量的存储位置,影响了变量的生命周期,生命周期变长,和程序的生命周期一样

extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//30
	return 0;
}
static int Add(int x, int y)
{
	return x + y;//另一个源文件中
}
extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//err
	return 0;
}
int main()
{
	register int num = 3;//建议把3放在寄存器中
	return 0;
}

static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件就不能再使用到这个全局变量了

#define NUM 100

int main()
{
	printf("%d\n", NUM);//100
	int n = NUM;
	printf("%d\n", n);//100
	int arr[NUM] = { 0 };//不报错
	return 0;
}
#define ADD(x,y) ((x)+(y))


int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 10;//向内存申请4个字节,存储10
	printf("%p\n", &a);
	int* p = &a;//p就是指针变量
	return 0;
}
	char ch = 'w';
	char* pc = &ch;

一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成内部链接属性了,其他源文件就无法使用了

3.register(寄存器关键字)

电脑上的存储设备——硬盘+内存+高速缓存(cache)+寄存器(集成在CPU上)

上层存储设备空间小,造价高,运算速度快

	printf("%zu\n", sizeof(char*));//4
	printf("%zu\n", sizeof(short*));//4
	printf("%zu\n", sizeof(int*));//4
	printf("%zu\n", sizeof(float*));//4
	printf("%zu\n", sizeof(double*));//4

十二、#define定义的常量和宏

define定义的常量

struct Stu
{
	//成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	//结构体对象.成员名
	printf("%s %d %s %s", s.name, s.age, s.sex, s.tele);
	return 0;
}

define定义的宏

print(struct Stu* ps)
{
	printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
}
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	print(&s);
	return 0;
}

宏名(参数,无类型的)宏体

头文件中进行函数的声明、类型的声明、头文件的包含(.h)

源文件中进行函数的实现(.c)

浮点数的四舍五入,不能用肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存

十三、指针

1.内存

为了有效使用内存,内存会被划分为一个个的内存单元(1个内存单元的大小是一个字节),每个内存单元都有一个编号

32位电脑——32位地址线——2^32个地址序列——4G

内存单元的编号——地址——指针

存放指针(地址)的变量就是指针变量

 

*说明p是指针变量,int说明p指向的对象是int类型的

 

2.指针变量的大小

 

不管使用什么类型的指针,都是在创建指针变量

指针变量是用来存放地址的,它的大小取决于一个地址存放的时候需要多少空间

32位机器上的地址——4byte——32bit 所以指针大小4个字节(x86)

64位机器上指针大小8个字节(x64)

十四、结构体

C语言提供了自定义类型的能力——结构体,把单一类型组合在一起

[+++]
[+++]
	//结构体指针->成员名
	printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele);

作业题:

1.swtich语句中没有continue

2.define不是C语言规定的关键字,而是预处理指令

3.计算带余除法 计算带余除法_牛客题霸_牛客网

#include 

int main()
{
    int a = 0;
    int b = 0;
    //输入
    scanf("%d %d",&a, &b);
    
    //计算
    int m = a / b;
    int n = a % b;
    
    //输出
    printf("%d %d\n", m, n);
    return 0;
}
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 81, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

一、课前的小建议:


1.养成写博客的习惯:对所学知识的总结、面试的谈资、愿意分享

2.维护github/gitee账号:大公司认可

3.学会编程≠学会C语言:(包括但不限于)计算机语言、算法和数据结构、 *** 作系统、计算机网络、数据库+项目实战

一、什么是C语言

1.语言:人与人之间交流的工具 -> 计算机语言:人与计算机之间交流的工具 (C语言实质上可以理解为一种工具 与计算机交流的方式)

2.目前已经有上千种计算机语言了,C语言只是其中一种(不过一直是流行排行榜的前三!)

3.计算机语言的发展:由低级到高级 (由难以 *** 作变得全民均可编程)

   二进制代码->汇编语言(助记符)-> B语言 -> C语言

4.C语言的国际标准 ANSI C C89 C90 C11

5.常见的编译器:Clang、GCC、MSVC、Turbo C

二、第一个C语言程序

1.注意后缀一定是.c 不然.cpp程序会以C++语法进行编译

#include 

int main()
{
	printf("hehe\n");
	return 0;
}

2.C语言代码中一定要有main函数(主函数)

   主函数的标准写法:

int main()
{

	return 0;
}

   古老的写法(不推荐):

void main()
{

}

3.printf是一个库函数,专门用来打印数据的

   #include

   std--标准 i--input o--output

   VS上快速运行代码:ctrl+f5

4.调试手段:f10 

   C语言规定:mian函数是程序的入口、main函数有且只有一个

5. ctrl+k+c:注释代码

    ctrl+k+v:取消注释

三、数据类型

1.为什么写代码:解决生活中的问题

   char - 字符数据类型

   short - 短整型

   int - 整型

   long - 长整型

   long long - 更长的整型

   float - 单精度浮点型

   double - 双精度浮点型

2.为什么这么多的类型?——提高空间利用率

   每种类型的大小是多少?

int main()
{
	printf("%zu\n", sizeof(char));//1
	printf("%zu\n", sizeof(short));//2
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof(long));//4
	printf("%zu\n", sizeof(long long))//8;
	printf("%zu\n", sizeof(float));//4
	printf("%zu\n", sizeof(double));//8
	return 0;
}

   计算机中的单位 : bite-比特位 byte kb mb gb tb pb

   十进制:0 1 2 3 4 5 6 7 8 9

   二进制:0 1

   1 byte = 8 bit (其余的单位间进制都是1024)

3.怎么使用类型?

int main()
{
	int age = 20;
	double price = 66.6;
	return 0;
}

四、变量和常量

1.不变的量:身份z、性别、血型、圆周率

   变化的量:年龄、体重、薪资

2.变量分为:局部变量({ }内部定义的变量)和全局变量({ }外部定义的变量)

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

   当全局变量和局部变量名字相同的情况下,局部变量优先

   但是建议不要把全局变量的名字和局部变量写成一样的

   3.写一个代码,计算两个整数的和

      printf是一个输出函数 scanf是一个输入函数

      scanf不能通过?——建议使用scanf_s(VS自己提供的函数,非标准C)

      解决方法:代码行第一行加上  #define  _CRT_SECURE_NO_WARNINGS

      VS安装路径下有一个newc++file.cpp的文件,在工程中创建新的c或者c++文件时,都是直接拷贝这个文件的

     用everything找到这个文件,把#define  _CRT_SECURE_NO_WARNINGS写入其中

int main()
{
	int num1 = 0;
	int num2 = 0;//初始化

	//输入两个整数
	scanf("%d %d", &num1, & num2);

	//求和
	int sum = num1 + num2;
	//输出
	printf("%d\n", sum);
	return 0;
}

4. 变量的作用域和生命周期

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

     局部变量的作用域就是变量所在的局部范围

int a = 10;

void test()
{
	printf("test-->%d\n", a);
}
int main()
{
	test();
	{
		printf("a=%d\n", a);//10
	}
	printf("a=%d\n", a);//10
	return 0;
}

   全局变量的作用域是整个工程

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

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

5.常量:描述不变的量

6.字面常量

	30;
	3.14;
	'w';//字符
	"abc";//字符串

7.const修饰的常变量

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

   在C语言中,const修饰的a,本质是变量,但不能直接修改,具有常属性

	int n = 10;
	int arr[n];//err
	const int n = 10;
	int arr[n];//err

8.define定义的标识符常量

#define MAX 100
int main()
{
	printf("%d\n", MAX);
	int a = MAX;
	printf("%d\n", a);
	return 0;
}
#define STR "abcdef"
int main()
{
	printf("%s\n", STR);
	return 0;
}

9.枚举常量

enum Color
{
	RED,
	GREEN,
	BLUE
};

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Color c = RED;
	RED = 20;//err
	return 0;
}

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

1.字符串

	//char 字符类型
	//'a';
	//char ch = 'w';

   C语言中没有字符串常量——用字符数组存储

int main()
{
	char arr1[] = "abcdef";//有'	char arr2[] = { 'a','b','c','d','e','f','int main()
{
	int len = strlen("abc");//3
	printf("%d\n", len);
	return 0;
}'};//结果正常'
	char arr2[] = { 'a','b','c','d','e','f' };//无'int main()
{
	char arr1[] = "abcdef";
	char arr2[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr1));//6
	printf("%d\n", strlen(arr2));//34
	return 0;
}
'
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

	printf("abcn");//abcn
	printf("abc\n");//abc

   字符串的结束标志——\0

   strlen——求字符串长度的函数(记得引头文件 string,h)

	printf("abc0def");//abc0def
	printf("abc	printf("%s\n", "(are you ok??)");def");//abc

	printf("%s\n", "(are you ok\?\?)");//改进

2.转义字符

	printf("%c\n", '\'');

   \n——换行符

	printf("\"");

\0——字符串的结束标志

	printf("abcd\0ef");//abcdint main()
{
	printf("%c\n", '0');//X
	return 0;
}ef

三字母词——早期少数编译器中出现

??)—— ]

??(—— [

	printf("%c\n", '\x60');//`

%d——打印整型

%c——打印字符

%s——打印字符串

%f——打印float类型的数据

%lf——打印double类型的数据

%zu——打印sizeof的返回值

	printf("%d\n", strlen("qwer t"));//6
	printf("%d\n", strlen("c:\test8\test.c"));//14

\'——转义单引号,让一个单引号不是一对单引号中的一个,而是一个单独的单引号

	//创建指针变量p,并赋值为NULL
	int* p = NULL;

\"——转义双引号,让一个双引号不是一对双引号中的一个,而是一个单独的双引号

int main()
{
	int input = 0;
	printf("要好好学习吗{1/0)?");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}
	return 0;
}

\\——转义斜杠,让斜杠不是一个转义字符的一部分,而是一个单独的斜杠

路径打印一定是两个斜杠

\a——触发电脑蜂鸣

\t——水平制表符

int main()
{
	int line = 0;
	printf("开始学习\n");
	while (line < 20000)
	{
		printf("写代码:%d\n",line);
		line++;
	}
	if (line == 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("继续加油\n");
	}
	return 0;
}

\ddd——打印以八进制数字转换为十进制数字为ASCII值对应的字符

\130——1*64+3*8+0=88 ‘X’的ASCII值

int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = n1 + n2;
	//打印
	printf("%d\n",sum);
	return 0;
}

\xdd——打印以十六进制数字转换为十进制数字为ASCII值对应的字符

\x60——6*16+0=96

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = Add(n1, n2);
	//打印
	printf("%d\n",sum);
	return 0;
}

3.注释

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

C语言的注释风格:/* */

C++语言的注释风格://

C的注释优点——可以一次性注释多行

              缺点——不可以嵌套注释

注释的优点:可以梳理代码逻辑、对复杂的代码可以进行解释、既帮助自己也帮助别人

六、选择语句

	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };

C语言实现分支——if/else语句、switch语句

七、循环语句

描述循环——while循环、do-while循环、for循环

20000行有效代码的积累!

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	printf("%d\n", arr[8]);//18
	return 0;
}

C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构

八、函数(可以把函数类比成加工原材料的工厂)

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i = i + 1;
	}
	return 0;
}
int main()
{
	int n = 10;
	int arr[n];
	//C99标准之前,数组的大小都是用常量或者常量表达式来指定
	int arr2[10] = { 0 };
	int arr3[4 + 6] = { 1,2,3,4 };
	//C99标准后,支持了变长数组,这个时候允许数组的大小是变量,但这种指定方式的数组是不能初始化的
	int m = 100;
	int arr4[m];/err
	//VS对C99的支持不是很好,不支持变长数组
	return 0;
}

返回类型 函数名(函数参数)

函数体

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

九、数组

int main()
{
	float a = 7 / 2.0;
	int b = 7 % 2;
	printf("%.2f\n", a);//3.50
	printf("%d\n", b);//1
	return 0;
}

数组的下标是从0开始的

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	return 0;
}

打印数组元素

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	a = a + 3;
	printf("%d\n", a);//23
	a += 3;
	printf("%d\n", a);//26
	return 0;
}

小飞机:小飞机_牛客题霸_牛客网

#include 

int main()
{
    printf("     **     \n");
    printf("     **     \n");
    printf("************\n");
    printf("************\n");
    printf("    *  *    \n");
    printf("    *  *    \n");
    return 0;
}

输出学生信息:输出学生信息_牛客题霸_牛客网

#include 

int main()
{
    printf("Name    Age    Gender\n");
    printf("---------------------\n");
    printf("Jack    18     man\n");
    return 0;
}

发布信息:发布信息_牛客题霸_牛客网

#include 

int main()
{
    printf("I lost my cellphone!\n");
    return 0;
}

计算表达式的值:计算表达式的值_牛客题霸_牛客网

#include 

int main()
{
    int a = 40;
    int c = 212;
    printf("%d\n",((-8+22)*a-10+c/2));
    return 0;
}

变长数组

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("hehe\n");//打印
	}
	return 0;
}

写一个函数求两个整数的较大值

int Max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//求两个整数的最大值
	int r = Max(a, b);
	printf("%d\n", r);
	return 0;
}

计算y的值 计算y的值_牛客题霸_牛客网

int main()
{
    //输入
    int x = 0;
    int y = 0;
    scanf("%d",&x);
    //计算
    if(x > 0)
    {
        y = -1;
    }
    else if(x == 0)
    {
        y = 0;
    }
    else
    {
        y = 1;
    }
    //输出
    printf("%d\n",y);
    return 0;
}

十、 *** 作符

1.算术 *** 作符:+ - * / %

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

除号的两端都是整数,执行整数除法;两端有一个浮点数,执行浮点数的除法

int main()
{
	int a = 10;
	printf("%zu\n", sizeof(a));//4
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof a);//4
	//printf("%zu\n", sizeof int);//err
	int arr[10] = { 0 };
	printf("%zu\n", sizeof(arr));//40,计算的是整个数组大小,单位是字节
    printf("%zu\n", sizeof(arr[0]));//4
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 计算的是数组的元素个数
	return 0;
}

取模的两个 *** 作数只能是整数

2.移位 *** 作符——涉及位的运算,后面讲

3.赋值 *** 作符 =

int main()
{
	int a = 10;
	int b = a++;//int b = a; a = a + 1;
	//后置++,先使用,再++
	printf("%d\n", b);//10
	printf("%d\n", a);//11
	return 0;
}
int main()
{
	int a = 10;
	int b = ++a;// a = a + 1;int b = a;
	//前置++,先++,再使用
	printf("%d\n", b);//11
	printf("%d\n", a);//11
	return 0;
}

4.单目 *** 作符

a + b——双目 *** 作符

单目 *** 作符——只有一个 *** 作数的 *** 作符

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

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

!——逻辑反 *** 作符

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

+- ——不改变/改变取值的正负

sizeof不是函数,而是单目 *** 作符

int main()
{
	//int a = 3.14;//3,14字面浮点数,编译器默认理解为double类型
	int a = (int)3.14;
	printf("%d\n", a);//3
	return 0;
}
int main()
{
	int a = 10;
	if (a = 3)//赋值而不是判断是否相等
	{
		printf("hehe\n");//打印
	}
	return 0;
}
int main()
{
	int a = 0;
	int b = 20;
	if (a && b)
	{
		printf("hehe\n");//不打印
	}
	if (a || b)
	{
		printf("haha\n");//打印
	}
	return 0;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	int d = (c = a - 2, a = b + c, c - 3);//c = -2 a = 28 d = 5
	printf("%d\n", d);//5
	return 0;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 3;
	arr[n] = 20;//[]就是下标引用 *** 作符,arr和3就是[]的 *** 作数
	return 0;
}

强制类型转换

int Add(int x. int y)
{
	return x + y;
}
int main()
{
	int sum = Add(2, 3);//()就是函数调用 *** 作符,Add,2,3都是()的 *** 作数
	return 0;
}

5.关系 *** 作符

== 判断是否相等

	auto int a = 10;//自动变量(可以被省略)

6.逻辑 *** 作符

&& 逻辑与——并且

|| 逻辑或——或者

typedef unsigned int uint;

typedef struct Node
{
	int data;
	struct Node* next;
}Node;
int main()
{
	unsigned int num = 0;
	uint num2 = 0;
	struct Node n1;
	Node n2;
	return 0;
}

7.条件 *** 作符(三目 *** 作符)

三目:三个 *** 作数

exp1 ?exp2 : exp3 

exp1为真,计算exp2作为整个表达式的结果;exp2为真,计算exp3作为整个表达式的结果

int main()
{
	int a = 10;
	int b = 20;
	int r = (a > b) ? a : b;//r得到a与b的较大值
	printf("%d\n", r);
	return 0;
}

8.逗号表达式

逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果

void test()
{
	int a = 1;
	a++;
	printf("%d\n", a);//打印10个2
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

9.下标引用 *** 作符

void test()
{
	static int a = 1;
	a++;
	printf("%d\n", a);//打印2-11
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

10.函数调用 *** 作符

int g_val = 2022;//另一个源文件中

十一、常见关键字

关键字是C语言本身内置的,不是自己创建出来的,也不能自己创建

extern int g_val = 2022;//声明外部符号

int main()
{
	printf("%d\n", g_val);//2022
	return 0;
}

变量的名字:有意义 ;必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头;变量名不能是关键字

1.typedef

static int g_val = 2022;//另一个源文件中

类型重命名——别名

2.static(静态的)

extern int g_val = 2022;

int main()
{
	printf("%d\n", g_val);//err
	return 0;
}
int Add(int x, int y)
{
	return x + y;//另一个源文件中
}

static修饰局部变量时,局部变量出了作用域,不会被销毁;本质上,static修饰局部变量的时候,改变了变量的存储位置,影响了变量的生命周期,生命周期变长,和程序的生命周期一样

extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//30
	return 0;
}
static int Add(int x, int y)
{
	return x + y;//另一个源文件中
}
extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//err
	return 0;
}
int main()
{
	register int num = 3;//建议把3放在寄存器中
	return 0;
}

static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件就不能再使用到这个全局变量了

#define NUM 100

int main()
{
	printf("%d\n", NUM);//100
	int n = NUM;
	printf("%d\n", n);//100
	int arr[NUM] = { 0 };//不报错
	return 0;
}
#define ADD(x,y) ((x)+(y))


int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 10;//向内存申请4个字节,存储10
	printf("%p\n", &a);
	int* p = &a;//p就是指针变量
	return 0;
}
	char ch = 'w';
	char* pc = &ch;

一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成内部链接属性了,其他源文件就无法使用了

3.register(寄存器关键字)

电脑上的存储设备——硬盘+内存+高速缓存(cache)+寄存器(集成在CPU上)

上层存储设备空间小,造价高,运算速度快

	printf("%zu\n", sizeof(char*));//4
	printf("%zu\n", sizeof(short*));//4
	printf("%zu\n", sizeof(int*));//4
	printf("%zu\n", sizeof(float*));//4
	printf("%zu\n", sizeof(double*));//4

十二、#define定义的常量和宏

define定义的常量

struct Stu
{
	//成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	//结构体对象.成员名
	printf("%s %d %s %s", s.name, s.age, s.sex, s.tele);
	return 0;
}

define定义的宏

print(struct Stu* ps)
{
	printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
}
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	print(&s);
	return 0;
}

宏名(参数,无类型的)宏体

头文件中进行函数的声明、类型的声明、头文件的包含(.h)

源文件中进行函数的实现(.c)

浮点数的四舍五入,不能用肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存

十三、指针

1.内存

为了有效使用内存,内存会被划分为一个个的内存单元(1个内存单元的大小是一个字节),每个内存单元都有一个编号

32位电脑——32位地址线——2^32个地址序列——4G

内存单元的编号——地址——指针

存放指针(地址)的变量就是指针变量

 

*说明p是指针变量,int说明p指向的对象是int类型的

 

2.指针变量的大小

 

不管使用什么类型的指针,都是在创建指针变量

指针变量是用来存放地址的,它的大小取决于一个地址存放的时候需要多少空间

32位机器上的地址——4byte——32bit 所以指针大小4个字节(x86)

64位机器上指针大小8个字节(x64)

十四、结构体

C语言提供了自定义类型的能力——结构体,把单一类型组合在一起

 
[+++]
	//结构体指针->成员名
	printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele);

作业题:

1.swtich语句中没有continue

2.define不是C语言规定的关键字,而是预处理指令

3.计算带余除法 计算带余除法_牛客题霸_牛客网

#include 

int main()
{
    int a = 0;
    int b = 0;
    //输入
    scanf("%d %d",&a, &b);
    
    //计算
    int m = a / b;
    int n = a % b;
    
    //输出
    printf("%d %d\n", m, n);
    return 0;
}
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
初识C语言_C_内存溢出

初识C语言

初识C语言,第1张

一、课前的小建议:


1.养成写博客的习惯:对所学知识的总结、面试的谈资、愿意分享

2.维护github/gitee账号:大公司认可

3.学会编程≠学会C语言:(包括但不限于)计算机语言、算法和数据结构、 *** 作系统、计算机网络、数据库+项目实战

一、什么是C语言

1.语言:人与人之间交流的工具 -> 计算机语言:人与计算机之间交流的工具 (C语言实质上可以理解为一种工具 与计算机交流的方式)

2.目前已经有上千种计算机语言了,C语言只是其中一种(不过一直是流行排行榜的前三!)

3.计算机语言的发展:由低级到高级 (由难以 *** 作变得全民均可编程)

   二进制代码->汇编语言(助记符)-> B语言 -> C语言

4.C语言的国际标准 ANSI C C89 C90 C11

5.常见的编译器:Clang、GCC、MSVC、Turbo C

二、第一个C语言程序

1.注意后缀一定是.c 不然.cpp程序会以C++语法进行编译

#include 

int main()
{
	printf("hehe\n");
	return 0;
}

2.C语言代码中一定要有main函数(主函数)

   主函数的标准写法:

int main()
{

	return 0;
}

   古老的写法(不推荐):

void main()
{

}

3.printf是一个库函数,专门用来打印数据的

   #include

   std--标准 i--input o--output

   VS上快速运行代码:ctrl+f5

4.调试手段:f10 

   C语言规定:mian函数是程序的入口、main函数有且只有一个

5. ctrl+k+c:注释代码

    ctrl+k+v:取消注释

三、数据类型

1.为什么写代码:解决生活中的问题

   char - 字符数据类型

   short - 短整型

   int - 整型

   long - 长整型

   long long - 更长的整型

   float - 单精度浮点型

   double - 双精度浮点型

2.为什么这么多的类型?——提高空间利用率

   每种类型的大小是多少?

int main()
{
	printf("%zu\n", sizeof(char));//1
	printf("%zu\n", sizeof(short));//2
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof(long));//4
	printf("%zu\n", sizeof(long long))//8;
	printf("%zu\n", sizeof(float));//4
	printf("%zu\n", sizeof(double));//8
	return 0;
}

   计算机中的单位 : bite-比特位 byte kb mb gb tb pb

   十进制:0 1 2 3 4 5 6 7 8 9

   二进制:0 1

   1 byte = 8 bit (其余的单位间进制都是1024)

3.怎么使用类型?

int main()
{
	int age = 20;
	double price = 66.6;
	return 0;
}

四、变量和常量

1.不变的量:身份z、性别、血型、圆周率

   变化的量:年龄、体重、薪资

2.变量分为:局部变量({ }内部定义的变量)和全局变量({ }外部定义的变量)

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

   当全局变量和局部变量名字相同的情况下,局部变量优先

   但是建议不要把全局变量的名字和局部变量写成一样的

   3.写一个代码,计算两个整数的和

      printf是一个输出函数 scanf是一个输入函数

      scanf不能通过?——建议使用scanf_s(VS自己提供的函数,非标准C)

      解决方法:代码行第一行加上  #define  _CRT_SECURE_NO_WARNINGS

      VS安装路径下有一个newc++file.cpp的文件,在工程中创建新的c或者c++文件时,都是直接拷贝这个文件的

     用everything找到这个文件,把#define  _CRT_SECURE_NO_WARNINGS写入其中

int main()
{
	int num1 = 0;
	int num2 = 0;//初始化

	//输入两个整数
	scanf("%d %d", &num1, & num2);

	//求和
	int sum = num1 + num2;
	//输出
	printf("%d\n", sum);
	return 0;
}

4. 变量的作用域和生命周期

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

     局部变量的作用域就是变量所在的局部范围

int a = 10;

void test()
{
	printf("test-->%d\n", a);
}
int main()
{
	test();
	{
		printf("a=%d\n", a);//10
	}
	printf("a=%d\n", a);//10
	return 0;
}

   全局变量的作用域是整个工程

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

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

5.常量:描述不变的量

6.字面常量

	30;
	3.14;
	'w';//字符
	"abc";//字符串

7.const修饰的常变量

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

   在C语言中,const修饰的a,本质是变量,但不能直接修改,具有常属性

	int n = 10;
	int arr[n];//err
	const int n = 10;
	int arr[n];//err

8.define定义的标识符常量

#define MAX 100
int main()
{
	printf("%d\n", MAX);
	int a = MAX;
	printf("%d\n", a);
	return 0;
}
#define STR "abcdef"
int main()
{
	printf("%s\n", STR);
	return 0;
}

9.枚举常量

enum Color
{
	RED,
	GREEN,
	BLUE
};

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Color c = RED;
	RED = 20;//err
	return 0;
}

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

1.字符串

	//char 字符类型
	//'a';
	//char ch = 'w';

   C语言中没有字符串常量——用字符数组存储

int main()
{
	char arr1[] = "abcdef";//有'	char arr2[] = { 'a','b','c','d','e','f','int main()
{
	int len = strlen("abc");//3
	printf("%d\n", len);
	return 0;
}'};//结果正常'
	char arr2[] = { 'a','b','c','d','e','f' };//无'int main()
{
	char arr1[] = "abcdef";
	char arr2[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr1));//6
	printf("%d\n", strlen(arr2));//34
	return 0;
}
'
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

	printf("abcn");//abcn
	printf("abc\n");//abc

   字符串的结束标志——\0

   strlen——求字符串长度的函数(记得引头文件 string,h)

	printf("abc0def");//abc0def
	printf("abc	printf("%s\n", "(are you ok??)");def");//abc

	printf("%s\n", "(are you ok\?\?)");//改进

2.转义字符

	printf("%c\n", '\'');

   \n——换行符

	printf("\"");

\0——字符串的结束标志

	printf("abcd\0ef");//abcdint main()
{
	printf("%c\n", '0');//X
	return 0;
}ef

三字母词——早期少数编译器中出现

??)—— ]

??(—— [

	printf("%c\n", '\x60');//`

%d——打印整型

%c——打印字符

%s——打印字符串

%f——打印float类型的数据

%lf——打印double类型的数据

%zu——打印sizeof的返回值

	printf("%d\n", strlen("qwer t"));//6
	printf("%d\n", strlen("c:\test8\test.c"));//14

\'——转义单引号,让一个单引号不是一对单引号中的一个,而是一个单独的单引号

	//创建指针变量p,并赋值为NULL
	int* p = NULL;

\"——转义双引号,让一个双引号不是一对双引号中的一个,而是一个单独的双引号

int main()
{
	int input = 0;
	printf("要好好学习吗{1/0)?");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}
	return 0;
}

\\——转义斜杠,让斜杠不是一个转义字符的一部分,而是一个单独的斜杠

路径打印一定是两个斜杠

\a——触发电脑蜂鸣

\t——水平制表符

int main()
{
	int line = 0;
	printf("开始学习\n");
	while (line < 20000)
	{
		printf("写代码:%d\n",line);
		line++;
	}
	if (line == 20000)
	{
		printf("好offer\n");
	}
	else
	{
		printf("继续加油\n");
	}
	return 0;
}

\ddd——打印以八进制数字转换为十进制数字为ASCII值对应的字符

\130——1*64+3*8+0=88 ‘X’的ASCII值

int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = n1 + n2;
	//打印
	printf("%d\n",sum);
	return 0;
}

\xdd——打印以十六进制数字转换为十进制数字为ASCII值对应的字符

\x60——6*16+0=96

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int n1 = 0;
	int n2 = 0;
	//输入
	scanf("%d %d", &n1, &n2);
	//求和
	int sum = Add(n1, n2);
	//打印
	printf("%d\n",sum);
	return 0;
}

3.注释

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

C语言的注释风格:/* */

C++语言的注释风格://

C的注释优点——可以一次性注释多行

              缺点——不可以嵌套注释

注释的优点:可以梳理代码逻辑、对复杂的代码可以进行解释、既帮助自己也帮助别人

六、选择语句

	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };

C语言实现分支——if/else语句、switch语句

七、循环语句

描述循环——while循环、do-while循环、for循环

20000行有效代码的积累!

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	printf("%d\n", arr[8]);//18
	return 0;
}

C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构

八、函数(可以把函数类比成加工原材料的工厂)

int main()
{
	int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i = i + 1;
	}
	return 0;
}
int main()
{
	int n = 10;
	int arr[n];
	//C99标准之前,数组的大小都是用常量或者常量表达式来指定
	int arr2[10] = { 0 };
	int arr3[4 + 6] = { 1,2,3,4 };
	//C99标准后,支持了变长数组,这个时候允许数组的大小是变量,但这种指定方式的数组是不能初始化的
	int m = 100;
	int arr4[m];/err
	//VS对C99的支持不是很好,不支持变长数组
	return 0;
}

返回类型 函数名(函数参数)

函数体

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

九、数组

int main()
{
	float a = 7 / 2.0;
	int b = 7 % 2;
	printf("%.2f\n", a);//3.50
	printf("%d\n", b);//1
	return 0;
}

数组的下标是从0开始的

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	return 0;
}

打印数组元素

int main()
{
	int a = 0;//初始化
	a = 20;//赋值
	a = a + 3;
	printf("%d\n", a);//23
	a += 3;
	printf("%d\n", a);//26
	return 0;
}

小飞机:小飞机_牛客题霸_牛客网

#include 

int main()
{
    printf("     **     \n");
    printf("     **     \n");
    printf("************\n");
    printf("************\n");
    printf("    *  *    \n");
    printf("    *  *    \n");
    return 0;
}

输出学生信息:输出学生信息_牛客题霸_牛客网

#include 

int main()
{
    printf("Name    Age    Gender\n");
    printf("---------------------\n");
    printf("Jack    18     man\n");
    return 0;
}

发布信息:发布信息_牛客题霸_牛客网

#include 

int main()
{
    printf("I lost my cellphone!\n");
    return 0;
}

计算表达式的值:计算表达式的值_牛客题霸_牛客网

#include 

int main()
{
    int a = 40;
    int c = 212;
    printf("%d\n",((-8+22)*a-10+c/2));
    return 0;
}

变长数组

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("hehe\n");//打印
	}
	return 0;
}

写一个函数求两个整数的较大值

int Max(int x, int y)
{
	if (x > y)
		return x;
	else
		return y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//求两个整数的最大值
	int r = Max(a, b);
	printf("%d\n", r);
	return 0;
}

计算y的值 计算y的值_牛客题霸_牛客网

int main()
{
    //输入
    int x = 0;
    int y = 0;
    scanf("%d",&x);
    //计算
    if(x > 0)
    {
        y = -1;
    }
    else if(x == 0)
    {
        y = 0;
    }
    else
    {
        y = 1;
    }
    //输出
    printf("%d\n",y);
    return 0;
}

十、 *** 作符

1.算术 *** 作符:+ - * / %

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

除号的两端都是整数,执行整数除法;两端有一个浮点数,执行浮点数的除法

int main()
{
	int a = 10;
	printf("%zu\n", sizeof(a));//4
	printf("%zu\n", sizeof(int));//4
	printf("%zu\n", sizeof a);//4
	//printf("%zu\n", sizeof int);//err
	int arr[10] = { 0 };
	printf("%zu\n", sizeof(arr));//40,计算的是整个数组大小,单位是字节
    printf("%zu\n", sizeof(arr[0]));//4
    printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 计算的是数组的元素个数
	return 0;
}

取模的两个 *** 作数只能是整数

2.移位 *** 作符——涉及位的运算,后面讲

3.赋值 *** 作符 =

int main()
{
	int a = 10;
	int b = a++;//int b = a; a = a + 1;
	//后置++,先使用,再++
	printf("%d\n", b);//10
	printf("%d\n", a);//11
	return 0;
}
int main()
{
	int a = 10;
	int b = ++a;// a = a + 1;int b = a;
	//前置++,先++,再使用
	printf("%d\n", b);//11
	printf("%d\n", a);//11
	return 0;
}

4.单目 *** 作符

a + b——双目 *** 作符

单目 *** 作符——只有一个 *** 作数的 *** 作符

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

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

!——逻辑反 *** 作符

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

+- ——不改变/改变取值的正负

sizeof不是函数,而是单目 *** 作符

int main()
{
	//int a = 3.14;//3,14字面浮点数,编译器默认理解为double类型
	int a = (int)3.14;
	printf("%d\n", a);//3
	return 0;
}
int main()
{
	int a = 10;
	if (a = 3)//赋值而不是判断是否相等
	{
		printf("hehe\n");//打印
	}
	return 0;
}
int main()
{
	int a = 0;
	int b = 20;
	if (a && b)
	{
		printf("hehe\n");//不打印
	}
	if (a || b)
	{
		printf("haha\n");//打印
	}
	return 0;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	int d = (c = a - 2, a = b + c, c - 3);//c = -2 a = 28 d = 5
	printf("%d\n", d);//5
	return 0;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 3;
	arr[n] = 20;//[]就是下标引用 *** 作符,arr和3就是[]的 *** 作数
	return 0;
}

强制类型转换

int Add(int x. int y)
{
	return x + y;
}
int main()
{
	int sum = Add(2, 3);//()就是函数调用 *** 作符,Add,2,3都是()的 *** 作数
	return 0;
}

5.关系 *** 作符

== 判断是否相等

	auto int a = 10;//自动变量(可以被省略)

6.逻辑 *** 作符

&& 逻辑与——并且

|| 逻辑或——或者

typedef unsigned int uint;

typedef struct Node
{
	int data;
	struct Node* next;
}Node;
int main()
{
	unsigned int num = 0;
	uint num2 = 0;
	struct Node n1;
	Node n2;
	return 0;
}

7.条件 *** 作符(三目 *** 作符)

三目:三个 *** 作数

exp1 ?exp2 : exp3 

exp1为真,计算exp2作为整个表达式的结果;exp2为真,计算exp3作为整个表达式的结果

int main()
{
	int a = 10;
	int b = 20;
	int r = (a > b) ? a : b;//r得到a与b的较大值
	printf("%d\n", r);
	return 0;
}

8.逗号表达式

逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果

void test()
{
	int a = 1;
	a++;
	printf("%d\n", a);//打印10个2
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

9.下标引用 *** 作符

void test()
{
	static int a = 1;
	a++;
	printf("%d\n", a);//打印2-11
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

10.函数调用 *** 作符

int g_val = 2022;//另一个源文件中

十一、常见关键字

关键字是C语言本身内置的,不是自己创建出来的,也不能自己创建

extern int g_val = 2022;//声明外部符号

int main()
{
	printf("%d\n", g_val);//2022
	return 0;
}

变量的名字:有意义 ;必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头;变量名不能是关键字

1.typedef

static int g_val = 2022;//另一个源文件中

类型重命名——别名

2.static(静态的)

extern int g_val = 2022;

int main()
{
	printf("%d\n", g_val);//err
	return 0;
}
int Add(int x, int y)
{
	return x + y;//另一个源文件中
}

static修饰局部变量时,局部变量出了作用域,不会被销毁;本质上,static修饰局部变量的时候,改变了变量的存储位置,影响了变量的生命周期,生命周期变长,和程序的生命周期一样

extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//30
	return 0;
}
static int Add(int x, int y)
{
	return x + y;//另一个源文件中
}
extern int Add(int x, int y);

int main()
{
	int a = 10;
	int b = 20;
	int z = Add(a, b);
	printf("%d\n", z);//err
	return 0;
}
int main()
{
	register int num = 3;//建议把3放在寄存器中
	return 0;
}

static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件就不能再使用到这个全局变量了

#define NUM 100

int main()
{
	printf("%d\n", NUM);//100
	int n = NUM;
	printf("%d\n", n);//100
	int arr[NUM] = { 0 };//不报错
	return 0;
}
#define ADD(x,y) ((x)+(y))


int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 10;//向内存申请4个字节,存储10
	printf("%p\n", &a);
	int* p = &a;//p就是指针变量
	return 0;
}
	char ch = 'w';
	char* pc = &ch;

一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成内部链接属性了,其他源文件就无法使用了

3.register(寄存器关键字)

电脑上的存储设备——硬盘+内存+高速缓存(cache)+寄存器(集成在CPU上)

上层存储设备空间小,造价高,运算速度快

	printf("%zu\n", sizeof(char*));//4
	printf("%zu\n", sizeof(short*));//4
	printf("%zu\n", sizeof(int*));//4
	printf("%zu\n", sizeof(float*));//4
	printf("%zu\n", sizeof(double*));//4

十二、#define定义的常量和宏

define定义的常量

struct Stu
{
	//成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	//结构体对象.成员名
	printf("%s %d %s %s", s.name, s.age, s.sex, s.tele);
	return 0;
}

define定义的宏

print(struct Stu* ps)
{
	printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
}
int main()
{
	struct Stu s = { "zhangsan",20,"nan","1596684533" };
	print(&s);
	return 0;
}

宏名(参数,无类型的)宏体

头文件中进行函数的声明、类型的声明、头文件的包含(.h)

源文件中进行函数的实现(.c)

浮点数的四舍五入,不能用肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存

十三、指针

1.内存

为了有效使用内存,内存会被划分为一个个的内存单元(1个内存单元的大小是一个字节),每个内存单元都有一个编号

32位电脑——32位地址线——2^32个地址序列——4G

内存单元的编号——地址——指针

存放指针(地址)的变量就是指针变量

 

*说明p是指针变量,int说明p指向的对象是int类型的

 

2.指针变量的大小

 

不管使用什么类型的指针,都是在创建指针变量

指针变量是用来存放地址的,它的大小取决于一个地址存放的时候需要多少空间

32位机器上的地址——4byte——32bit 所以指针大小4个字节(x86)

64位机器上指针大小8个字节(x64)

十四、结构体

C语言提供了自定义类型的能力——结构体,把单一类型组合在一起

 
 
	//结构体指针->成员名
	printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele);

作业题:

1.swtich语句中没有continue

2.define不是C语言规定的关键字,而是预处理指令

3.计算带余除法 计算带余除法_牛客题霸_牛客网

#include 

int main()
{
    int a = 0;
    int b = 0;
    //输入
    scanf("%d %d",&a, &b);
    
    //计算
    int m = a / b;
    int n = a % b;
    
    //输出
    printf("%d %d\n", m, n);
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2889712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-14
下一篇 2022-09-14

发表评论

登录后才能评论

评论列表(0条)

保存