Bootstrap

初始C语言

都是介绍C语言的一些基础,许多知识都很浅,后续会单独的写文章深入的介绍C语言的各个知识!!!


C语言介绍

C语言是一种编译型语言

一.main主函数

C语言代码中一定要有main函数,main函数就是主函数,C语言规定main函数是程序的入口,main函数有且只有一个。

标准的主函数写法:

#include <stdio.h>

int main()
{
  printf("");

  return 0;
}

C语言其实还有一种写法,但是这种写法太古老了,所以不推荐使用,当然如果想尝试的话也可以。

主函数古老的写法:

#include <stdio.h>

void main()
{
  printf("");

  return 0;
}

#include <stdio.h>在C语言中被称为编译预处理命令,它在告诉C编译器在编译时包含stdio.h文件,如果在代码中,调用了这个头文件中的函数或者宏定义,则需引用该头文件。

#include <stdio.h>

std -标准

i - input

o - output

printf("");是一个库函数,在C语言中专门打印数据的,printf("");包含在#include <stdio.h>头文件中的,如果没有头文件就不能使用printf("");

printf(" ");

二.变量和常量的概念

变量

什么是变量?

在程序运行过程中会发生改变的数据,就称为变量

变量的命名

1.有意义的
int age;
float salary;
2.名字必须是字母,数字,下划线组成,不能有特殊字符,同时不能以数字开头

3.变量名不能是关键字

变量分为:

  1. 局部变量 - {}里面的变量
  2. 全局变量 - {}外面的变量

例:

#include <stdio.h>

int b = 10;//全局变量
int main()
{
  int a = 20;//局部变量
  printf("");

  return 0;
}

注意:不要将全局变量和局部变量的名字写成一样!!!

如果全局变量和局部变量名字相同

#include <stdio.h>

int a = 10;
int main()
{
  int a = 20;
  printf("%d\n",a);//当全局变量和局部变量名字相同的情况下,局部优先打印

  return 0;
}

​

例题:写一个代码,计算2个整数的值

1.scanf();是一个输入函数

2.printf();是一个输出函数

3.scanf_s();这个函数是VS编译器自己提供的函数非标准C提供的函数,那也就是只有VS编译器认识,其他编译器不认识!建议使用scanf

 #define _CRT_SECURE_NO_WARNINGS 这个一定要放在最上面,不然会报错!!!

//与scanf对应
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

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

  int sun = 0;//两数相加的和存放在该变量里

  //用户输入两个数
  printf("输入两个整数:");
  //scanf_s("%d %d",&num1,&num2);
  scanf("%d %d",&num1,&num2);

  //求和
  sun = num1 + num2;

  //打印输出
  printf("%d/n",sum);
  
  return 0;
}
变量的作用域

1.局部变量

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

2.全局变量

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

变量的生命周期
  • 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
  • 全局变量的生命周期是:整个程序的生命周期

第一个源文件:

#include <stdio.h>
extern int a;//extern是一个声明来自外部的符号,这一段的意思是获取另外一个源文件中变量int a
void test()
{
  printf("test--%d\n", a);
}

int main()
{
  test()
  {
     printf("%d\n", a);
  }

  return 0;
}

第二个源文件:

int a = 10;

常量

什么是常量?

在程序运行过程中不会发生改变的数据,就称为常量

在C语言中常量分为:

  1. 字面常量
  2. const修饰的常变量
  3. #define定义的标识符常量
  4. 枚举常量
1.字面常量

30;

11.5;

‘w’;

"abc"

...

这些都是字面常量

2.const修饰的常变量

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

const int a = 10;

a = 20;

printf("%d\n", a);//报错:左值指定const对象

例子:

 [ ]里面必须含有常量值,放入n报错,因为被const修饰的n本质上是一个变量,所以会报错

注意:被const修饰的常变量在C语言中只是在语法层面限制了变量不能直接被改变,但是本质上还是一个变量,所以叫常变量

const int n = 10;

int arr[n] = {0};

3.#define定义的标识符常量

#define MAX 100

#define STR "abcdef"

...

#include <stdio.h>

#define MAX 100
#define STR "abcdef"

int main()
{
  printf("%d\n", MAX);
  int a = MAX;
  printf("%d\n", a);
  printf("%d\n", STR);
  MAX = 200;//报错

  return 0;
}
4.枚举常量
#include <stdio.h>

enum Color
{
  //枚举常量
  RED,
  GREEN,
  BLUE
}

int main()
{
  //三原色
  //RGB Red Green Blue
  int num = 10;
  enum Color c = RED;
  RED = 20;//报错 把新的值赋给了枚举常量,常量的值是不会发生改变的,也不能发生改变,不然会报错!
  
  return 0;
}

 三.char字符类型

问:C语言中有字符串类型吗?

没有

字符串就是由一对双引号括起来的一串字符

注意:字符串的结束标志是一个 \0的转义字符,在计算字符串长度的时候\0是结束标志,不算作字符串内容

#include <stdio.h>
#include <string.h>

int main()
{
   char arr1[] = "abcdef";
   char arr2[] = { 'a','b','c','d','e','f' };
   char arr3[] = { 'a','b','c','d','e','f','\0'};

   printf("%s\n", arr1);//a b c d e f \0
   printf("%s\n", arr2);//a b c d e f 烫烫烫烫烫烫烫烫烫烫烫慄资 ,因为f后面没有\0作为结束标,所以还会持续打印
   printf("%s\n", arr3);//a b c d e f


   int len = strlen("abc");//求字符串长度的一个函数 string length    头文件 string.h
   printf("%d\n", len);

   int arrs1 = strlen(arr1);
   printf("%d\n", arrs1);//6

   int arrs2 = strlen(arr2);
   printf("%d\n", arrs2);//38

   int arrs3 = strlen(arr3);
   printf("%d\n", arrs3);//6

   return 0;
}

四.转义字符

%d - 打印整型
%c - 打印字符
%s - 打印字符串
%f - 打印float类型的数据
%lf - 打印double类型的数据
%zu - 打印sizeof的返回值

1.转义字符:\'用于表示字符常量'

2.转义字符:\"用于表示一个字符串内部的双引号"
3.转义字符:\\用于表示一个反斜杠 \ ,防止它被解释为转义序列符

4.转义字符:\a警告字符,蜂鸣

5.转义字符:\b退格符

6.转义字符:\f进纸符(没什么用)

7.转义字符:\n换行

8.转义字符:\r回车

9.转义字符:\t水平制表符

10.转义字符:\v垂直制表符

11.转义字符:\ddd ddd表示1~3个八进制的数字。如:\130X
printf("%c", '\130');//打印X 为什么呢?因为130这个八进制转换十进制88之后,作为ASCII值代表一个字符X

12.转义字符:\xdd dd表示两个十六进制数字。如:\x30 0
printf("%c", '\x63');//打印c

请问输出多少字符?

解析:\t它在字符串里面是一个字符,它的效果相当于4个字符

printf("%d\n", strlen("c:\test\628\test.c"));// 14

五.注释

1.代码中有不需要的代码可以直接删除,也可以注释掉
2.代码中有些代码比较难懂,可以加一下注释文字

  • C语言的注释风格:/* */  (不可嵌套)
  • C++语言的注释风格://

写注释的好处:
1.注释可以梳理代码
2.对复杂的代码进行解释
3.写代码的时候写注释,是帮助自己,也帮助别人

六.选择语句和循环语句

C语言是【结构化】的程序设计语言
  -顺序结构
  -选择结构
  -循环结构

C语言如何实现选择呢?

  • if else
  • switch

C语言如何实现循环呢?

  • while语句
  • for语句
  • do...while语句

七.函数

int 返回类型
Add 函数名
(int x, int y) 函数参数

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", sum);


	return 0;
}

八.数组

C语言中给了数组的定义:一组相同类型元素的集合

int main()
{
	//存入0~9
	//数组的定义
	int arr[10] = {0,1,2,3,4,5,6,7,8,9 };
	char ch[5];
	double d[10];
	//C语言规定:数组的每个元素都有一个下标,下标是从0开始的
	// 数组可以通过下标来访问
	// []中不写数字也可以,下标的长度通过给定的数值的多少来决定(根据后面出什么内容来决定)
	//printf("%d\n", arr[8]);
	//循环打印
	int i = 0;
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i++;
	}

	return 0;
}

0 - 数字0
'0' - 字符0 -ASCII值是48
'\0' - 字符 - ASCII值是0
 EOF - end of file 文件的结束标志 值是-1

#include <stdio.h>

int main()
{
	int arr[10];//10个元素  这是整型类型的数组,所以它不以\0来当结束标志
	int arr2[] = { 1,2,3 };//arr2数组有3个元素  根据初始化的多少来决定数组有几个元素

	return 0;
}

代码输出什么?
随机值 

#include <stdio.h>
#include <string.h>

int main()
{
    //char arr[] = { 'b', 'i', 't' };//这是char(字符)类型的数组
    //[b i t] 后面还有字符,直到找到 \0才结束
    //strlen 求的是字符串的长度
 
 
    char arr[4] = { 'b', 'i', 't' };//打印 3
    //不完全初始化,剩余的部分默认初始化为0(这个0与\0没区别,遇到就结束)
 
    printf("%d\n", strlen(arr));//随机值
    return 0;
}

VS对C99中的一些语法支持不是很好,不支持变长数组

#include <stdio.h>

int main()
{
	//C99标准之前,数组的大小都是用常量或者常量表达式来指定
	//C99标准之后,支持了变长数组,这个时候允许数组的大小是变量,但是这种指定方式的数组是不能初始化的
	int n = 10;
	int arr[n] = { 0 };//初始化就报错了

	return 0;
}

九.操作符

C语言是非常灵活的
C语言提供了非常丰富的操作符,使得使用起来就比较灵活

#include <stdio.h>
int main()
{
	int a = 7 / 2;
	int b = 7 % 2;//取模
	printf("%d", a);//打印3
	printf("%d", b);//打印1

	//除号的两端都是整数的时候,执行的是整数除法,如果两端只要有一个浮点数就执行浮点数的除法
	float a = 7 / 2.0;
	//取模操作符的两个操作数只能是整数
	int b = 7 % 2;//取模
	printf("%.1f", a);//打印3.5
	printf("%d", b);

	return 0;
}
#include <stdio.h>
int main()
{
	int a = 0;//第一次赋值就是初始化
	a = 20;//最后的都是赋值

	//a + b  两个操作数相加,这个时候 + //双目操作符
	//单目操作符 - 只有一个操作数



	return 0;
}

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

sizeof操作符

#include <stdio.h>
int main()
{
	//sizeof是操作符,是单目操作符
	//是一个判断数据类型或者表达式长度的运算符(计算变量所占空间大小)
	int a = 10;
	printf("%d\n", sizeof(a));
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));//40  计算的是整个数组的大小,一个整型有4个字节,单位是字节
	printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 数组的元素个数


	return 0;
}

前置++,后置++,前置--,后置--,的使用

#include <stdio.h>
int main()
{
	int a = 10;
	int b = a++;//后置++,先使用,后++
	//b=a,a=a+1

	printf("%d\n", b);//10
	printf("%d\n", a);//11

	int a = 10;
	int b = ++a;//前置++,先++,后使用
	//a=a+1,b=a

	printf("%d\n", b);//11
	printf("%d\n", a);//11

  int a = 10;
	int b = a--;//后置--,先使用,后--
	//b=a,a=a-1

	printf("%d\n", b);//10
	printf("%d\n", a);//9
 
  int a = 10;
	int b = --a;//前置--,先--,后使用
	//a=a-1,b=a

	printf("%d\n", b);//9
	printf("%d\n", a);//9
 
	return 0;
}

强制类型转换

#include <stdio.h>

int main()
{
	//只要写的是浮点类型的,编译器就默认为是double类型的值
	int a = 3.14;
	//3.14 字面浮点数 编译器默认理解为double类型

	//强制类型转换
	int a = (int)3.14;
	//int a = int(3.14)这种写法是错误的	
	printf("%d\n", a);

	return 0;
}

逻辑与和逻辑或

#include <stdio.h>

int main()
{
	//&& 逻辑与 - 并且
	//|| 逻辑或 - 或者
	//例子:如果有个东西需要搬,我说张三并且李四来帮忙,张三和李四都要过来帮忙,张三或者李四过来帮忙,张三来可以,李四来也可以,张三李四一起来也可以

	return 0;
}

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

#include <stdio.h>

int main()
{
	int a = 10;
	int b = 20;
	//表达式 ? 操作数1 : 操作数2
	//表达式为真时,结果为操作数1
	//表达式为假时,结果为操作数2
	int r = a > b ? a : b;

    printf("%d", r);//打印20

	return 0;
}

逗号表达式:逗号隔开的表达式

逗号表达式的特点是:从左到右依次计算,整个表达式的结果是最后一个表达式的结果

#include <stdio.h>

int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	//从左到右依次计算,整个表达式的结果是最后一个表达式的结果
	//       c=8        a=28       5
	int d = (c = a - 2, a = b + c, c - 3);
	printf("%d\n", d);//5

	return 0;
}

[ ]下标引用操作符

#include <stdio.h>

int main()
{
	//int arr[10]定义数组语法形式
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//下面才是作一个操作符
	//访问元素的时候下标可以用变量
	int n = 3;//这里为什么可以用变量?因为变量的值一定是程序运行起来才有的
	arr[n] = 2;//[]就是下标引用操作符 arr和3就是[]的操作数

	return 0;
}

( )函数调用操作符

#include <stdio.h>

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

	return 0;
}

关键字

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

#include <stdio.h>

int main()
{
	//局部变量默认是自动变量,即auto
	//所有的局部变量都是auto类型
	int a = 10;//自动变量 变量自动创建自动销毁,auto省略了

	return 0;
}

常见关键字

const 常属性
signed 有符号的
unsigned 无符号的
extern 声明外部符号
register 寄存器
static 静态的
return 函数返回值
enum 枚举
struct 结构体
union 联合体(共用体)
typedef 类型重命名
void 无(函数的返回类型,函数参数)

;