C语言概括(初识C语言)

一、何为C语言

1.大致介绍

C语言是一门通用计算机编程语言,用于人与计算机交流广泛应用于底层开发。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的
C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。

2.其常见编译器

C语言编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

二、第一个程序及详解


下面展示 程序源码

#include <stdio.h>
int main()
{
         //大括号里面写函数体
    printf("hello bit\n");
    printf("he he\n");
    return 0;
}

调试结果:
在这里插入图片描述

详解:

#include <stdio.h>
这个意思是引用 stdio.h(stdio.h 就是standard input output.header,也就是“标准输入、输出头文件) 。
注:.h代表头文件                        .c代表源文件

main函数
是程序的入口,并且一个程序中有且只能有一个

printf函数
printf函数是一个库函数,使用前必须引用stdio.h文件 , 称为格式输出函数,其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。

注:每个语句后面都要加上:

三、数据类型


常见类型大小
char 字符数据类型1
short 短整型2
int 整形4
long 长整形4/8(具体看环境)
long long 更长的整形8/16(具体看环境)
float 单精度浮点数4
double 双精度浮点数8
long double 高精度浮点数8

下面用程序验证:

提一嘴(后续会讲): sizeof是一个操作符,可以以字节形式给出了其操作数的存储大小

#include <stdio.h>
int main()
{
	printf("%d\n", sizeof(char));
	printf("%d\n", sizeof(short));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(long));
	printf("%d\n", sizeof(long long));
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));
	printf("%d\n", sizeof(long double));
	return 0;
}

测试结果:
在这里插入图片描述

其中为什么长整型为什么和整形同样的字节大小呢? 因为在定义时(字节大小)long>=int,所以有的地方显示long类型数据类型占四个字节。在linux系统上则是八个字节。

注意:存在这么多的类型,其实是为了更加丰富的表达生活中的各种值

四、常变量

生活中存在很多量 常量有:圆周率,一天多少小时等
而变量也有一些:你的年龄,身高等
所以C语言中也有常变量表达那些量

1.变量

1)变量的定义方法

数据类型 变量名 (= 0)

注:最好先行赋值,如果不主动赋值,系统会随机自动给变量一个值,而随机给的这个值可能会导致系统报错,等一系列麻烦。

2)变量的命名

需要以下条件:

1.首字母只能是     ‘_’(下划线) 或者 字母.,不能以数字开头。
2.C语言变量是分大小写的 ADD 和 add 看起来差不多 实际表达的是两个变量
3.长度不能超过63个字符。。
4.变量名不能使用关键字。

: 变量名最好有意义,这样才能让别人理解你的代码更容易,在合作时效率也会更高

3)变量的类型

变量分为 局部变量全局变量

如图所示:

我们同时创建了 全局变量(在函数体外) 和 局部变量

并且可以看出来都是变量a,而这个程序没有报错,说明可以这么创建,而编译结果为10,说明当局部变量和全局变量同名的时候,局部变量优先使用。

在这里插入图片描述

3)变量的使用

如图所示:
变量可以用来输入你想输入的值,也可以用来使用操作符运算。

在这里插入图片描述

4)变量的作用域

变量的作用域是其所在函数体的范围,出了这个作用域,那么这个函数就不起作用了。

1>局部变量

如图所示:在main函数的大括号里就是局部变量a的作用域
在这里插入图片描述

而在第二个代码中,创建b在第二个大括号中,并且在第二个括号里外打印b,结果回会发现会报错,这就是因为b只在第二个大括号里面有用,出了大括号就没用了,不能打印。
在这里插入图片描述
在这里插入图片描述

由此可以看出局部变量的作用域局部变量所在的局部范围

2>全局变量

我们创建了一个全局变量b,而调试结果显示即使他在局部也能使用

在这里插入图片描述
不仅如此,即使不在同一个文件,只要引用下,全局变量也是可以使用的
在这里插入图片描述

由此可以看出全局变量的作用域整个工程,整个程序。

5)变量的生命周期

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

全局变量生命周期:整个程序开始,整个程序结束他的生命周期也结束。

2.常量

1)字面常量

虽然见的不多,但也要记得在后面加分号

在这里插入图片描述

2) const修饰的常量

cost修饰过的变量会有常量的属性,正常的赋值运算将会报错(报错显示是第二张图)。


在这里插入图片描述

3)枚举常量

记得形式
enum typeName { valueName1, valueName2, valueName3, … };

例子:
在这里插入图片描述
由结果可以看出枚举变量的格式

注:他会默认里面元素从0开始,如果给他赋一个初始值,下面的也会跟着+1

在这里插入图片描述

而如果从把中间的数赋值,上面的元素怒不会受影响,重新赋值的那个元素下面的元素会受影响。
在这里插入图片描述

4)define 定义的标识符常量

格式:
# define 变量名 常量大小 不加分号,切记

这个定义方式是有好处的,举例说明:
在这里插入图片描述

这里面的 M N都有可能发生改变 如果都写成字面常数的话,需要一个一个改,而用define定义的标识符常量则简单许多。

五、字符和字符串 / 转义字符

1、字符和字符串

'a'
这种由单引号引起来的是字符
"Hello world"
上面这种由双引号引起来的就是常见的字符串

注:这种字符串最后都有\0,因为它是字符串结束的标志。

例:
'a'"a"
这俩完全不是一个意思 因为’a’是字符在结尾后面不会有\0,而正如上面说,"a"是字符串在结尾处会有\0。

2、 转义字符

转义字符顾名思义就是转变意思。而且有很多类型。

常见的如下表:

转移字符含义
\n表示换行的意思
\b退格键的意思,把前面的字符删掉
\a警告字符,会发出蜂鸣的声音
\用来防止打印不出\
\r回车
\t水平制表符
\v垂直制表符
\aaaaaa表示1~3个八进制的数字。 如: \130 X
\xaaaa表示2个十六进制数字。

六、语句

本节只是大致介绍一下各个语句,让各位有个大致掌握,后续会专门讲解。

1、 选择语句

1)if语句

if语句可以实现单分支及多分支。

if语句常见的格式:

if(判断条件)
{
 语句
}
else if(判断条件)
{
 语句
}

else 切记else后面没有()
{
 语句
}

2)switch语句

switch(整型表达式)
{
    语句项;
}
case 整形常量表达式:
    语句;
case 整形常量表达式:
    语句;

2、 循环语句

1)while循环

while格式是:

	while( 判断条件 )
		{
			循环体
		}
}

2)for循环

for(初始化定义; 判断条件; 调整部分)
{
 循环语句;
 }

1)do…while循环

do
{
循环体语句
}
while( 判断条件 )

注:这个循环容易遗忘的地方就是在while()后面容易忘加分号(;)

七、函数

1、函数的定义

例如现在要创建一个让数字相加的函数

#include<stdio.h>

//下面这一部分就是完成函数
int add(int a, int b)
{
	return a + b;
}

int main()
{
	int i1 = 0;
	int i2 = 0;
	int c = 0;
	scanf("%d %d", &i1, &i2);
	c = add(i1, i2);
	printf("%d", c);
}

其中要注意的就是实参和形参。
实参
实参全称叫做“实际参数”,顾名思义就是实际存在的参数,实参可以是常量、变量、表达式、类等,实参必须要有确定的值。

形参
形参全称叫做“形式参数”,也是一个虚拟的参数,在定义方法的时候使用的参数,形参是方法被调用时用于接收实参值的变量。

在上面代码中 add里面的a,b就是形参,而main函数里面的i1和i2就是实参。

八、数组

1、数组的类型

常见的数组类型有:字符数组,整型数组,二维数组,指针数组·······
数组的类型有很多,此处不深究。

2、数组的定义

格式是:
数据类型 数组名[ 常量 ] = {初始化内容}

注: [ ]里面必须是常量,不然会报错

数组的定义有三种方式:

1、完全初始化定义:

int arr[4] = (1, 2, 3, 4);

数组大小和内容都初始化了。
1.1、不完全初始化:

int arr[4];

这个是只初始化常量的部分,后面内容不定义,里面存的是随机值

1.2、不完全初始化:

int arr[] = (1, 2, 3, 4);

只初始化后面的内容,前面变量的部分会默认根据初始化的大小规定大小。如上面这个常量实际就是4。

3、数组的下标

在这里插入图片描述
如果你想查找数组中的某个元素必须用正确使用下标,例如:你想找第一个元素就要写用arr[0],第二个元素就要用arr[1]。

1、数组的使用

例如:

#include<stdio.h>

int main()
{
	int i = 0;
	int arr[3] = { 0, 1, 2 };

	for (i = 0; i < 3; i++)
	{
		printf("%d ", arr[i]);

	}
}

运行结果:

在这里插入图片描述
数组可以按照你的需求把固定位置储存的元素打印出来。

九、操作符(只讲了部分常见的)

1、算数操作符

操作符作用
+(加)让两个数相加
-(减)让两个数相减
*(乘)让两个数相乘
/(除)让两个数相除
%(取余)求余数

2、移位操作符

操作符作用
     <<让两个数相加
    >>让两个数相减

例子:
int i<<2 来讲

1的2进制本来是是
000…0001
左移2位之后变成:
000…0100,

3、位操作符

1)按位与:&

1.它的作用:按位比较两个运算对象,生成新值

(1)对于每个位:只有两个运算对象相应的位都是1,结果才是1。
(2)对于真假:只有两个位都是真,结果才是真。

2.示例
表达式:(10110111) & (11001101)
结果值:(10000101)

2)按位或:|

1.它的作用:按位比较两个运算对象,生成新值

(1)对于每个位:如果两个运算对象中的相应的位至少存在一个1,则结果为1。
(2)对于真假:如果两个运算对象的相应一个位为真或两个位都为真,则结果为真。

3.示例
表达式:(10110111) | (11001101)
结果值:(11111111)

3)按位异或:^

1.它的作用:按位比较两个运算对象,生成新值

(1)对于每个位:如果两个运算对象中的相应的位相同则输出0,不相同则输出1。
(2)对于真假:如果两个运算对象的相应两个位一个为真且另一个为假,则结果为真。

3.示例
表达式:(10110111) | (11001101)
结果值:(01111010)

4、逻辑操作符

1)逻辑与:&&

必须两边同时满足
真 && 真 ——>真(逻辑与只有全为真才为真,其他都为假)

而且如果第一个为假,则后面的不会判断直接为假

例如:

#include<stdio.h>

int main()
{
	int b = 1;
	int c = 3;

	(--b) && (++c);

	printf("%d", c);

}

由结果可以看出 本来按照运算c应该变成4的,可是它并没有,说明第一个b变成0后判断为假后,后面的不运行了。
在这里插入图片描述

2)逻辑或:||

只需要满足其中一个为真就可以
假 || 假 ——> 假(逻辑或只有全为假才为假,其他都为真)

逻辑或与逻辑与有一个相似的特点:如果前面为真,后面的不会判断真假直接跳过后面。

#include<stdio.h>

int main()
{
	int b = 1;
	int c = 3;

	(b == 1) || (++c);

	printf("%d", c);

}

结果如下:
在这里插入图片描述

5、赋值操作符

操作符作用
+=相加
-=相减
*=相乘
/=相除
%=余数

例子:
在下面代码中 b+=a 实际就是 b=a+b
在这里插入图片描述

6、关系操作符

操作符作用
!=判断是否不等于
==判断是否等于

7、条件操作符

常见格式:exp1 ? exp2 : exp3

作用:判断条件1,真则进行条件2,假则进行条件3
计算结果:根据真假进行到最后的条件2或3的结果

例子:
在这里插入图片描述

8、逗号操作符

格式:exp1, exp2, exp3, …expN

作用:从左往右逐个计算表达式,、
计算结果:最后一个表达式。

例子:
在这里插入图片描述

9、补充:

还可以从单目,双目,三目分类。

例如:

单目操作符

    !      逻辑反操作
    -      负值
    +      正值
    &      取地址
    sizeof      操作数的类型长度(以字节为单位)
    ~      对一个数的二进制按位取反
    *      间接访问操作符(解引用操作符)
    (类型)      强制类型转换
    – 前置、后置–
    ++ 前置、后置++

十、常见关键字

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

注:C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的

1、typedef

作用:重命名

在这里面 un_64和 unsigned long 是同一数据类型
在这里插入图片描述

2、static

1) 修饰局部变量

例子:
对比以下两个代码
在这里插入图片描述
不难看出只有一个地方发生的改变,那就是在void函数里面一个int用static修饰了,另一个并没有。
而他俩结果也是显然不同的

有static修饰的结果:
在这里插入图片描述
无static修饰的结果:
在这里插入图片描述

所以不难看出它会使局部变量的生命周期发生改变。它让静态局部变量出了作用域依然存在,直到程序结束,生命周期才结束。

2) 修饰全局变量

例子:
同样是对比两组代码
在这里插入图片描述
在这里插入图片描述
第一个正常运行,第二个报错,并且这两组代码也只是变量有无static修饰的区别,可以看出后者报错原因是:static修饰后,全局变量作用域反而小了,只能在自己所在的文件使用

3) 修饰函数

因为同理,便不再举例

static修饰函数与修饰全局变量类似:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

十一、指针

1、前言

在讲指针前必须对一些知识有所了解才能更方便的听懂指针

1)内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。

所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
在这里插入图片描述
变量是创建内存中的(在内存中分配空间的)
创建变量的实质就是给其有效地址,并把值储存在内存中

下面就是取出地址的方法:
在这里插入图片描述
上面代码需要注意的几个点:

&num就是给num取地址的意思
%p是以地址形式打印出来的意思

2、指针的使用

1)存储地址

int num = 10;
int* p;//p为一个整形指针变量
p=&num;

在这里插入图片描述
不难看出
p储存的是num的地址
*p对应的是num的数值

注: *是解引用的意思

2)指针的用处

例:
在这里插入图片描述

3、指针的大小

在这里插入图片描述
这里不难看出,不管什么类型他的指针大小都是8个字节

注:
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)

十二、结构体

结构体一般用于解决复杂类型的数据
例如你要写一个同学的个人信息( 姓名-性别-年龄)这种情况就要用到结构体

结构体的常见结构是

struct 结构体名
{
结构体所包含的变量或数组
};

例如这种就是:

1、定义

struct stu
{
char name[]; //姓名
int num; //学号
int age; //年龄
};

2、初始化

struct Stu s= {“张三”,“20180101”, 20};

3、访问 结构体成员

方法一:

printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);

方法二:

这个方法利用到了数组

struct Stu*ps=&s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);

十三、define定义的常量和宏

1、define定义常量

下面这个就是define常量

用define定义有很多好处:
1.方便程序的修改 (用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改)
2.提高程序的运行效率(使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率)
在这里插入图片描述

1、define定义函数

可以简便程序,更高效的达到预期
在这里插入图片描述

十四、结合性和优先级

优先级从1-15,等级越来越

结合性分为从左往右和从右往左

此图图表用的一位CSDN里叫 根号五 的博主的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值