C语言基础知识

 前言

        本作者为一只初入IT界的小菜鸟,此篇记录自己在学习过程中的知识与心得,如有理解错误的地方,欢迎指出,我会及时改正同时也感谢你的指出。


一、什么是C语言?

        所为语言就是事物与事物,交流的媒介。人有人与人交流的语言,动物有动物与动物交流的语言,而C语言就是人与计算机交流的语言。1988年美国国家标(ANSI)正式将C语言标准化,标志C语言开始稳定和规范化。


二、Main函数

        Main 函数是程序的入口,不管有多少代码都是从Mian 函数的第一行执行

        Main一个程序只能只有一个,即使⼀个项⽬中有多个.c⽂件,但是只能有⼀个Main函数 

我这边使用VS2022举例: 
可以看到此时我在一个工程文件中创建了三个.cpp文件并且每一个文件中我都有书写一个Main主函数。

此时但我们运行test文件时:

它会提示我们无法启动程序,原因就是我们在一个工程文件当中创建了多个Main文件。当我把其他连个.cpp文件当中的Main函数注释或者删除,就可以正常运行程序了


三、关键字

C语言中有一类保留的符号,这一类符号被称为关键字或者保留字,这些关键字是有特殊意义的,是专门留下来给C语言自己使用的,因此程序员不能自己创造关键字与程序员⾃⼰在创建标识符的时候是不能和关键字重复

C语言中常用的32个关键字:

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

注:https://zh.cppreference.com/w/c/keyword(C语言全部关键字介绍)


四、字符串 与 \0 

C语言中称使⽤双引号括起来的⼀串字符就被称为字符串,虽然C语言中有字符串这一个概念,但是C语言本身是没有字符串这种数据类型的。

字符串可以使用 %s 的格式进行打印        例如:printf(“%s”,arr)

C语言是怎样存储字符串的?

字符串是用字符数组进行存储,数组是一块内存空间,用字符数组来存放字符串

#include <stdio.h>

int main() 
{

    // 定义格式
	char test[] = "abcdefg";
    // 打印字符串
    printf("%s\n", test);

	return 0;
}

 C语言中的字符串有一个特殊的小知识,C语言中的字符串的末尾隐藏了一个 \0 字符,这个 \0 就是字符串的结束标志

通过调试我们可以很清楚的看到在字符串的末尾有一个隐藏的 \0 ,因此 \0 是字符串的结束标志,在打印字符串或者统计字符串的长度的时候只有遇到 \0 时才会结束打印或者统计

这里来看实例:

#include <stdio.h>

int main() 
{
	// 字符串一
	char arr1[] = "abc";

	// 字符串二
	char arr2[] = { 'a','b','c' };

	// 同时打印连个字符串
	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

一般按照我们正常来看 arr1 与 arr2 字符串应该是一样的,那么它们打印出来应该也是一样的,而事实真的是这样吗?

 由结果可以很直观的发现 arr1 正常打印而 arr2 后面打印了一些乱七八糟的东西

观察调试结果:

我们可以发现 arr1 比 arr2 的结尾多出了一个 \0 ,也正是这个 \0 才导致了最终的两个结果,此时也不难理解在打印字符串或者统计字符串的长度的时候只有遇到 \0 时才会结束打印或者统计。arr2的最后没有 \0 所以编译器会在内存中 arr2 存放的地址一直向后打印,直到遇到 \0 才结束

注:只有字符串中才会有 \0 这种概念


 五、转义符

C语言的字符中有一组特殊的字符叫转义符转义字符顾名思义:转变原来的意思的字符

转义符作用
\'
⽤于表⽰字符常量'
\"
⽤于表⽰字符常量"
\\
⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符
\a
使终端发出警报声或出现闪烁
\b
退格键,光标回退⼀个字符,但不删除字符
\f
换⻚符,光标移到下⼀⻚
\n转行符
\r
回⻋符,光标移到同⼀⾏的开头
\t
制表符,光标移到下⼀个⽔平制表位,通常是下⼀个4/8的倍数
\v
垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列

    其中有两个特殊一点的转义符:

  •  \ddd : d d d 表示1~3 八进制数字
// \ddd: d d d 表示1~3 八进制数字
printf("%d\n", '\130');//88
//打印的为88,因为八进制的 130 表示的就是 88
  •  \xdd: d d 表示2个十六进制数字
// \xdd: d d 表示2个十六进制数字
printf("%d\n", '\x24');//36
//打印的为36,因为十六进制的 24 表示的就是36

这里有一个小知识点:转义字符在计算字符串长度时,会被统计为一个字符

int main()
{
	char str[] = "C:\nesn\bbcc\123\test.c";
	printf("%d\n", strlen(str));
	// 在统计此字符串时 \n \b \123 \t 会被统计为一个字符,所以此字符串的长度为17
	return 0;
}
转义字符参考: https://zh.cppreference.com/w/c/language/escape

六、数据类型

 1. 数据类型

     所谓“类型”,就是相似的数据所拥有的共同特征,C语言中的数据类型主要分为两大类:

内置类型自定义类型
字符型数组
整数型结构体
浮点型枚举
布尔型联合体

        1.1 字符型

char;
signed char; // 有符号 char 型
unsigned char; // 无符号 char 型

        1.2 整数型

short; // 短整型
signed short; // 有符号短整型
unsigned short; // 无符号短整型

int; // 整形
signed int; // 有符号整形
unsigned int; // 无符号整形

long; // 长整型
signed long; // 有符号长整型
unsigned long; // 无符号长整形

// C99中引入
long long; // 长长整形
signed long long; // 有符号长长整型
unsigned long long; // 无符号长长整形

        1.3 浮点型

float; // 单精度浮点型
double; // 双精度浮点型
long double; // 长双精度浮点型

        1.4 布尔型

        C语言在C99之前并没有布尔类型,使用整数0表示假,非0值表示真

        C99之后引入了布尔类型,专门表示真假,需要引入头文件<stdbool.h>

true; // 表示真
false; // 表示假

        1.5 signed和unsigned

        C语言中使用signed和unsigned关键字修饰字符型和整形类型,浮点型和布尔型没有

        signed关键字,表示一个类型带有正负号,unsigned关键字,表示一个类型不带有正负号,只有正数,因为 unsigned  不带有正负号,所以同样⻓度的内存能够表⽰的最⼤整数值,增⼤了⼀倍

        默认情况下为signed,一般省略了signed,也就是 int 等同于 signed int

2. 数据类型的长度

每⼀种数据类型都有⾃⼰的⻓度,存储的数据范围就有所差异。 Sizeof()关键字——专门用来计算类型的长度,单位是字节。

计算机的单位:

        Bit——Byte——KB——MB——GB——TB.....

         8Bit = 1Byte

        1024Byte  = 1KB

        1024KB = 1MB

        1024MB = 1GB

        1024GB = 1TB

sizeof(char); // 1
sizeof(short); // 2
sizeof(int); // 4
sizeof(long); // 4
sizeof(long long); // 8
sizeof(float); // 4
sizeof(double); // 8
sizeof(true); // 1
sizeof(false); // 1
类型长度(字节)
char1
short2
int4
long4
long long8
float4
double8
true1
false1

七、变量

        数据类型是创建变量的基础,只有知道了数据的类型我们才能创建相对应的变量

        C语言中把经常变化的值称为变量,不变值称为常量,变量的本质是向内存申请空间,空间的大小由变量的类型大小决定

变量的分类:

  • 全局变量:在大括号外部定义的变量称为全局变量

全局变量的使用范围非常的广,整个工程都可以使用

  • 局部变量:在大括号内部定义的变量称为全局变量

局部变量的使用范围比较有限,只有自己所在的局部空间才可以使用

  • C语言中局部变量如果不初始化一般都是随机值,而全局变量如果不初始化默认为0
#include <stdio.h>

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

 那么这里就会引出一个问题:如果局部和全局变量,名字相同会优先使用谁?

#include <stdio.h>

// 全局变量
int a = 100;
int main() 
{
	// 局部变量
	int a = 10;
	printf("%d\n", a);
	{
		// 局部变量
		int a = 1;
		printf("%d\n", a);
	}
	return 0;
}

由此可以显而易见的 得出结论:当局部变量与全局变量同名时,局部变量会优先使用

 八、操作符

        1.算数操作符

                +        -        *        /        %

        C语言中的 +、 -、 *  都是与数学中的用法一样,这里就不都介绍了,其中 / 与 % 会有一些差异 

        /(除):

        当除号两端都是整数的时候,是按照整数的方式进行运算的,得到的结果是商

        当除号的两端有一个是浮点数,是按照浮点数的方式进行运算的,得到的是小数

int main()
{
	//当除号两端都是整数的时候,是按照整数的方式进行运算的,得到的结果是商
	//当除号的两端有一个是浮点数,是按照浮点数的方式进行运算的,得到的是小数
	int a = 10;
	int b = 4;
	printf("%d\n", a / b); // 2
	printf("%lf\n", a / (b * 1.0)); // 2.50000
    printf("%lf\n", a / 4.0); // 2.50000
}

         %:

        只能用于整数不能用于浮点数

        当%两端都是整数的时候,得到的结果是相除之后的余数

int main()
{
    // 只能用于整数不能用于浮点数
    // 当%两端都是整数的时候,得到的结果是相除之后的余数
    int a=10;
    int b=4;
    printf("%d",a % b); // 2
    return 0;
}

         2.赋值操作符

        =

int main()
{
	int a = 10;// 这个 = 不算为赋值,叫初始化
	a = 100;// 此时才叫赋值

	// C语言支持连续赋值,顺序为从右到左依次赋值
	int b = 0;
	int c = 99;
	c = b = a + 100;
	return 0;
}

        3.复合赋值操作符

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

int main()
{
	int num1 = 1;
	int num2 = 2;
	// 我们可能有时会对一些想要的数值进行自加或自减时
	// 方法一:可以使用赋值操作符进行自加或自减
	num1 = num1 + 100;
	num2 = num2 - 100;
	// C语言还提供了一种更为便捷的方法
	// 使用复合赋值操作符进行自加或自减
	num1 += 100;
	num2 -= 100;
	// 这两种方法都可以实现自加或自减,其他复合赋值操作符都是异曲同工之妙的
	return 0;
}

         4.单目操作符

        ++        --        +(正号)        -(负号)

        不管是前置++,还是后置++,都会使得操作数加1

        后置++,先使用,后++

        前置++,先++,后使用

int main()
{
	int a = 1;
	// 不管是前置++,还是后置++,都会使得a加1
	a++;
	printf("%d\n", a);
	++a;
	printf("%d\n", a);

	int b = a++;// 后置++,先使用,后++
	printf("%d\n", a);//2
	printf("%d\n", b);//1

	int b = ++a;// 前置++,先++,后使用
	printf("%d\n", a);//2
	printf("%d\n", b);//2

}

        5.强制类型转换

        (类型)

int main()
{
	int a = 1.1;// 编译器会报警告,此时就可以使用强制类型转换
	double b = 99 / 8;// 此时除号两边会采用整数的运算方式,得到的是商
	double c = 99 / (double)8;// 此时除号两边会采用浮点数的运算方式
	printf("%d\n", a);
	printf("%lf\n", b);
	printf("%lf\n", c);
    //我们使⽤强制类型转换都是万不得已的时候使⽤,如果不需要强制类型转化就能实现代码,这样⾃然更好的
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值