目录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
从C语言最基础的开始,带你一步步认识C语言,了解每一个函数,关键词,变量,函数体,指针,结构与它们的作用
一、C语言是什么?
1.C语言简介
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言
广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。
2.编写第一段代码开始
我使用的是Visual Studio2022编辑器
认识第一段代码
首先是主函数main,main翻译成中文是最主要的,最重要的意思
双斜杠后面是注释,把自己写的代码解释或者说出这段代码的用途
#include<stdio.h>
int main() //这里是主函数
{
return 0; //函数的返回值
}
3.什么是函数
函数不是数学中的函数,我们把函数看成一个盒子
1.开始执行的时候,函数可以被输入一些值
2.执行的过程中,函数可以做一些事情
3.执行完成后,函数返回一些值
#include<stdio.h>
int main()//括号里面就是函数的输入值 这里面什么都没有输入
{
printf("Hello World\n");//这一段是做点什么 这里主函数打印一行字到屏幕上
return 0;//主函数返回了一个值0
}
函数的写法公式:
函数返回值类型 函数名(函数输入参数值)
{
做点什么;
return 函数返回值;
}
既然我们理解了函数的写法公式,那我们根据公式写一段代码
#include<stdio.h>
int cpp(int a,int b)//我这里定义一个int整形的返回值类型 还有两个整数输入值a,b
{
return a+b;//这里返回a+b的和
}
#include<stdio.h>
int cpp(int a,int b)
{
return a+b;
}
int main()
{
int ter; //定义一个整形的变量名为ter,名字可以为下划线,数字,大小写字母,跟它们的组合
ter=cpp(5,4); //定义a和b的值,把它们赋值给定义的变量ter
printf("d",ter); //把cpp的值装进了ter,所以把ter直接打印到控制台上
return 0; //返回值类型是int,所以是返回0;
}
4.什么是变量
变量可以看成一个空的箱子,里面可以装任何其他跟它类型一样的值
=等号在C语言中是赋值运算符,在代码里面的功能就是把右边的值赋值给左边
在cpp函数计算完之后,要有一个东西接受cpp所返回的值,所以我们要在cpp前面声明一个变量,为int整形变量
5.标识符跟关键词
标识符是自己命名的特殊标识,用于表示一个变量,函数或者其他实体的名称
比如我刚刚把自定义函数名写成cpp,将变量名写成ter
在C语言中,标识符的可以按照你的喜好自己随意命名,但是必须遵循以下规则: 标识符可以用小写字母、大写字母、数字和下划线来命名。但是,标识符的第一个字符必须是字母或下 划线,而不是数字。并且,标识符区分大小写。
-----
关键词
上面代码int的就是一个关键词,关键词不能作为标识符使用
下面的C语言的关键词表
auto | _Bool | break | case |
char | _Complex* | const | continue |
default | restrict* | do | double |
else | enum | extern | float |
for | goto | if | _lmaginary* |
inline* | int | long | register |
return | short | signed | sizeof |
static | struct | switch | typedef |
union | unsigned | void | volatile |
while |
6.printf函数跟#include命令
printf("hello world\n"); // \n表示换行,就是从下一行开始再继续打印
printf是系统自带的函数,我们把字符串常量“hello world\n”传给了printf函数,运行的时候,我们在屏幕上看到这行字,printf函数的作用就是将字符串输出到控制台上
printf 由单词 print(打印) 和单词 format(格式) 的首字母f组成,意为格式化打印。
printf公式是printf("XXX占位1 XXX 占位2 XXX占位3", 替换1, 替换2, 替换3);
整型int的占位符为 %d 。后面的替换参数,会依次替换前面的占 位。
比如printf("a=%d\n b=%d\n",1,2);结果为
a=1
b=2
#include
printf函数 并不是我们定义的函数,而是系统自带的函数。这个函数被写在文件 stdio.h 中,我们要使 用 printf 就必须先让编译器理解 printf 。 我们假定 printf 的函数定义写在文件 stdio.h 中,用 #include 命令,可以将文件 stdio.h 的代码复制 到我们的代码中。(我的理解就是在stdio文件中,已经有printf函数了,所以编译器就可以调用他)有什么不对可以指正~~~
总结上面内容:
从上面内容,我们了解了从第一段代码开始了解C语言,知道了定义函数,函数体,变量是什么等等,理解了最简单的hello world输出到控制台上中的步骤。理解了一个单词一个单词到组合在一起的可以做什么事情。
一段代码从最简单开始,虽然非常无趣,但当你写的代码一点错误都没有打印到控制台上的时候,你就会发现有小小的成就感。从无到有,我们一步一步来,总会有成就的!(以上全部为总自己的理解)
二、数据类型
1.整形数据类型
在上面的代码中,int就是一个整形,在C语言中还有这几种整形数据类型
类型名称 | C语言中的关键词 | 注释 |
字符型 | char | 用于表示一个很小的整数 |
短整型 | short | 用于表示一个不怎么大的整数 |
整形 | int | 生活中一般的整数都可以表示 |
长整型 | long | 较大的整数 |
加长整型 | long long | 非常大的整数 |
可以用sizeof(关键词)来测量C语言数据类型的字节大小
printf("int=%d\n",sizeof(int)); //测量int类型所占字节的大小
整形类型的数值范围是多少?
类型 | sizeof大小 | 二进制位数 | 取值范围 |
char | 1 | 1x8=8位 | -128~+127 |
short | 2 | 2x8=16位 | -32768~+32767 |
int | 4 | 4x8=32位 | -2147483648~+2147483647 |
long | 4 | 4x8=32位 | -2147483648~+2147483647 |
long long | 8 | 8x8=64位 | -9223372036854775808~9223372036854775808 |
次方数比位数少一,是因为最高位被用去做符号位了。
无符号整形:就是没有负数的整形,表明这个数据类型不带有符号位(就是不带正负加减的) 用unsigned关键词
类型 | sizeof大小 | 二进制位数 | 取值范围 |
unsigned char | 1 | 1x8=8位 | 0~+255 |
unsigned short | 2 | 2x8=16位 | 0~+65535 |
unsigned int | 4 | 4x8=32位 | 0~+4294967295 |
unsigned long | 4 | 4x8=32位 | 0~+4294967295 |
unsigned long | 4 | 4x8=64位 | 0~+18446744073709551615 |
无符号整形:unsigned
2.浮点数据类型
浮点类型就是类似于3.1415926,0.0054这些非整数的数据
浮点类型关键词为:float(能表示最少6位有效数字) 4字节
#inclued<stdio.h>
int main()
{
flort q=3.1415926; //定义一个浮点型,值为3.141592
printf("%f\n",q); //浮点型占位符为%f
return 0;
}
q=3.1415927 //浮点型并不能表示无限的精确,会有一定的误差
另一个浮点类型:double(双精度浮点型) 占位符一样为(%f) 8字节
double精度比flort高,但也有精度范围,更高的也会有误差
总结数据类型:
在上面内容中,我们理解了整形和浮点型的基本概念跟意义,知道了它们的数据范围,在编程时能够更好的运用数据类型。
三.字符常量和字符变量
1.字符常量
字符就是'a'(用单引号包括),常量是一个不变的量,通常字符常量是单独一个字符
printf("%c\n",'a') //输出到控制台上为a
字符占位类型为%c 字符常量一般为整形,占用1,4个字节或者其他字节
字符常量通常用于存储ASCII字符集中的字符。每个字符都对应一个唯一的数值,这个数值就是该字符在ASCII表中的位置。例如,字符 'A' 的ASCII值是65,字符 'a' 的ASCII值是97
2.字符变量
变量就是可以变的量,比如
char sh1='a';
printf("sh1=%c\n",sh1);
sh1=a //输出到控制台上为a
字符变量跟常量不一样,它的值可以在执行程序的时候被改变
四.C语言中printf的使用
1.printf函数使用公式
在前面的代码中,我已经使用了很多次printf函数的使用,具体公式为
printf("xx占位1 xx占位2",替换体1,替换体2);
自己编写一个试试?
#include<stdio.h>
int main()
{
int a=100;
float b=3.14159;
printf("整形a为%d 浮点型b为%f",a,b);
return 0;
}
整形a为100
浮点型b为3.14159
printf是一个变参函数
printf的参数个数跟同参数类型都是不确定的,比如上面的代码有两个参数,两个类型
占位符的类型和数量需要跟后面的参数类型跟数量对应
占位符%d,它的类型为整形int,因为100是整数,占位符%f,它的类型为浮点型float,因为3.14159是带小数的
在printf函数中,有符号位的整型 char , short ,传入 printf 的可变参数时,会被提升为 int 。(因为在整形变量中,char,short,int都是整形,int比它们两个更高级,所以会提升为int)而比 int 更高级的 整型则不发生变化。
转换规范% printf可以根据 转换操作 使用不同的 转换方式 ,取 n字节的二进制数据 并转换成字符。
转换操作 | 转换方式 |
%c (int) | 数值对应ASCII字符 |
%d,%i (int) | 有符号十进制整形 |
%e, %E (double) | 双精度浮点型,e计数法表示 |
%f (double) | 双精度浮点型,十进制浮点数 |
%s (char) | 字符串 |
%u (unsigned int) | 无符号十进制整型 |
%x, %X (unsigned int) | 无符号十六进制整形 |
2.无符号整形替换
1.无符号数据表示数量,只有正值
2.unsigned无符号标识不会改变数据类型的字节大小
3.无符号型数据打印要将之前的%d,全部替换成%u,如果在vs中没有注意转换,将无符号型用%d输出,那么编译器会做优化,将无符号型按有符号型进行输出
最高位为数据位
结论: unsigned char,unsigned short,unsigned int使用 %u
unsigned long使用 %lu
unsigned long long使用 %llu
特别注意 ! ! !
有符号整形int跟无符号整形的取值范围不一样,会导致数据类型跟转换操作出错误的转换结果
int的取值范围为-2147483648~2147483647。 unsigned int的取值范围为0~4294967295。
比如unsigned int a=-38945
打印的结果为38945
3.scanf输入函数
与printf函数相反,scanf就是输入函数。scanf将键盘输入的字符串根据转换规范,转换成二进制表示的整数、浮点数、字符或 字符串等。
#include<stdio.h>
int main()
{
char q;
int r;
float w;
scanf("%hhd %d %f", &q, &r, &w);
printf("%d %d %f\n", q, r, w);
return 0;
}
输出的结果为
运行程序后,在键盘输入:"1 3 3.14" 。scanf函数将字符串"1 3 3.14",根据转换规范, 分别转换为各类二进制数据,并存储到变量中。
printf函数将这些变量,按照转换规范,再转换为字符串,输出到控制台。
scanf函数使用公式
1. scanf是一个变参函数。
2. scanf的第一个参数是字符串。
3. scanf的第一个参数内容为匹配字符以及转换规范。
4. scanf的后续参数,是转换完成后,数据的存放位置。
5. 转换规范的写法与数量,需要与后续的参数类型和数量对应。
scanf将转换后的二进制存储到基本变量当中,请在变量名前加&。将字符串存储到字符数组中,字符数组名不用加&。()
关于字符串、字符数组后面会讲
scanf("%d %f",&a,&b); //如果在字符串" "里面用空格隔开,在控制台输入时就应使用空格隔开输入
scanf("%d,%f",&a,&b); //如果使用逗号,输入时就应该使用逗号隔开!
在vs中无法使用scanf函数的,是编译器认为这类函数不安全,解决方式如下: 1. 解决方案下,工程点右键,进入属性。 2. 展开C/C++,选择预处理器。 3. 点击预处理器定义【编辑】。 4. 将_CRT_SECURE_NO_WARNINGS加入预处理定义。
4.运算符和表达式
在C语言中,一个或多个运算对象与零个或多个运算符组成表达式。表达式后面加上分号构成表达式语句。
运算符 加法+、减法- 符号运算符 +、- +100; // 表达式结果为100
乘法运算符 * 表达式结果:乘法表达式的结果为左右表达式结果相乘。
int a,b; a=100;b=10; a*b; //结果为1000
除法运算符 / 表达式结果:除法表达式的结果为左运算对象除以右运算对象。
如果无法整除,那就是数据类型出现了问题,3.14这个数是浮点型float,你写成了int
求余运算符 % 表达式结果:求余表达式的结果为左运算对象除以右运算对象的余数。
例如:5%3,5除以3,等于3余1。,表达式结果为1
赋值运算符 = = 为赋值运算符,它左右各需要一个运算对象,构成 赋值运算符表达式 。
a=50, 表达式的结果为等号右边的运算对象的值。结果为50
自增、自减运算符++、--(有前缀,有后缀)
在左边为前缀例如++i 在右边为前缀例如
两者的表达式结果是一样的
#include<stdio.h>
int main()
{
int a,b;
a=50;
b=40;
printf("%d %d\n",a++,b--);
printf("%d %d\n",++a,--b);
}
51 39
51 39
在C语言中,用1表示为真,用0表示为假
大于 > 和 小于 < 大于等于 >= 和 小于等于 <=
等于 == 和 不等于 !=
由于 = 等号已经被作为赋值运算符,所以相等在C语言里面用 == 来表示,而不相等则使用 != 。
printf("%d\n",50==50);
printf("%d\n",50!=50);
50==50,50=50,表达式结果为真,结果为1
50!=50,50不等于50,表达式结果为假,结果为0
逻辑或 || 和 逻辑与 &&
逻辑与运算&&,要求两边均为真,整个表达式结果才为真。
逻辑非 ! printf("%d\n", 2 != 3); printf("%d\n", !(2 != 3));
2 != 3,2不等于3,表达式结果为真。 !(2 != 3),将结果真取反向,表达式结果为假。
常用的运算符优先级表格,优先级越高的,在运算里面,需要被优先处理。
标记 | 操作符 | 优先级 |
++、-- | 自增,自减(前缀) | 16 |
++、-- | 自增,自减(后缀) | 15 |
+、- | 正号,负号 | 15 |
* / % | 乘、除、取余 | 13 |
+、- | 加、减 | 12 |
<> <= >= | 关系 | 10 |
== != | 相等、不相等 | 9 |
&& | 逻辑与 | 5 |
|| | 逻辑或 | 4 |
?: | 条件 | 3 |
= | 赋值 | 2 |
5.结构
1.分支结构
if(测试条件)
条件为真
测试条件,如果我们输入一个数,让这个数满足条件10<=a<=50
我们要让子表达是=式10<=a和a<=50同时成立,,那么要在表达式中间加上逻辑运算符与&&。
代码如下
#include<stdio.h>
int main()
{
int q; //定义一个整数变量q
scanf("%d\n", &q); //输入一个整形变量
if (10 <= q && q <= 50) //判断条件
printf("yes\n"); //如果这个整数在条件的范围内,输出yas
return 0;
}
输入一个整数在10<=q<=50之间,那么结果为yes
else关键词(否则)
if(测试条件)
条件为真
else
条件为假
#include<stdio.h>
int main()
{
int q; //定义一个整数变量q
scanf("%d\n", &q); //输入一个整形变量
if (10 <= q && q <= 50) //判断条件
printf("yes\n"); //如果这个整数在条件的范围内,输出yas
else //判断条件
printf("no\n"); //否则输出为no
return 0;
}
如果在条件语句下面有多条语句,那么要使用{}大括号来包裹
for()
{
printf();
printf();
}
else
{
printf();
printf();
}
嵌套层次更多的代码,我们可以简化代码,比如那种条件语句多的
例如:
输入一个学生的分数x。
x < 60,输出不及格。
60 <= x < 70,输出及格。
70 <= x < 80,输出一般。
80 <= x < 90,输出良好。
90 <= x <= 100,输出优秀。
if (x < 60)
{
printf("不及格"\n);
}
else
{
if (x >= 60 && x < 70)
{
printf("及格"\n);
}
else
{
if (x >= 70 && x < 80)
{
printf("一般"\n);
}
else
{
if (x >= 80 && x < 90)
{
printf("良好"\n);
}
else
{
printf("优秀"\n);
}
}
}
}
如果想这样层层嵌套,不容易理解,下面是简化代码
if (x < 60)
{
printf("不及格"\n);
}
else if (x >= 60 && x < 70)
{
printf("及格"\n);
}
else if (x >= 70 && x < 80)
{
printf("一般"\n);
}
else if (x >= 80 && x < 90)
{
printf("良好"\n);
}
else
{
printf("优秀"\n);
}
2.循环结构
如果我们要计算一个1一直加到100的数,我们可以用循环语句来实现
while(测试条件)
循环行为
#include <stdio.h>
int main()
{
int a = 1, cpp = 0; //声明两个变量a,cpp,初始化为1,0
while(i <= 100) //测试条件语句,如果i在1到100之间,表达式为真,就可以进入循环
{
cpp = a + cpp; //计算a+cpp,将结果赋值给cpp
a++; //a每次自增1
}
printf("%d %d\n", a, cpp);
return 0;
}
a=1时,表达式结果为1<=100,结果为真,继续进入循环,cpp的值为1+0,a为2
a=50时,表达式结果为50<=100,结果为真,继续进入循环,cpp的值为50+0,a为51
直到a的值为101时,表达式101<=100为假,条件不成立,停止循环,返回0;
记住非0就是真
3.for循环
我们可以用更简单的方法写循环,我们将上面的求和代码用for写
#inclued<stdio.h>
{
int a,cpp=0; //初始化条件
for(i=1;i<=100;i++) //设置初值i=1,循环的条件是i<=100,i自增
{
cpp=a+cpp; //循环行为
}
printf("%d %d\n",a,cpp);
return 0;
}
for条件语句结构:
for (计数器设置初始值; 循环条件; 计数器更新)
循环行为
(如果有多条循环行为,也要用大括号将它们合在一起)
for循环中,计数器初始值在开始执行一次,运行完后更新计数器
循环条件成立的话立即进入循环,否则结束循环
注意一定不能在while和for循环后面加分号
目录
总结
从主函数main开始。主函数是程序的入口点,程序的执行从这里开始。我们可以定义其他函数来完成特定的任务,并在主函数中调用这些函数。函数可以接收输入参数,执行一些操作,并返回结果。
在C语言中,变量是用来存储数据的容器,它们有特定的数据类型。数据类型决定了变量可以存储的数据种类和范围。C语言支持多种数据类型,包括整型、浮点型、字符型等。每种数据类型都有其特定的内存大小和取值范围。
字符常量和字符变量是C语言中用于处理字符数据的两种形式。字符常量是用单引号括起来的单个字符,而字符变量则是可以存储字符的变量。它们通常用于存储ASCII字符集中的字符。
printf函数是C语言中用于输出数据的函数。它可以根据指定的格式将数据打印到控制台上。在printf函数中,我们使用占位符来表示要输出的数据,并在后面提供相应的参数。占位符的类型和数量需要与后面的参数类型和数量对应,以确保正确的输出。
无符号整型数据的使用和打印。无符号整型数据只表示正值,其取值范围与有符号整型不同。在打印无符号整型数据时,需要使用相应的转换规范,以避免出现错误的转换结果。
未完待续。。。