本文是笔者在学习C语言过程做的笔记总结,将简要讲述C语言的基础知识,内容清晰易理解,相信你也能轻松的学会C语言的入门基础知识内容。同时也希望这篇文章对你起到帮助,相信你一定会有所学成的。现在让我们一起来看看吧!
C语言作为目前最流行的一门编程语言,它具有良好的可移植性、功能多样性、执行效率高效性等特点深受开发者们的喜爱。
现在,跟着这篇文章,让我们一起来学习C语言吧!
内容较多,如果你觉得本文对你起到帮助,别忘了点赞收藏+关注噢。
提示:以下是本篇文章正文内容,下面案例可供参考。
俗话说的好:流水的开发者,铁打的"Hello World。"许多开发者第一句代码都是在向这个美好的世界打一个招呼。咱们开始入门C语言的同时,我们也用C语言输出一次"Hello World"吧!
# include
int main() {
printf("Hello world\n");
return 0;
}
简单的5行代码,就能够简单的完成了一个开发者向这个世界问好的操作。那么这上面的代码是什么意思呢?我们分为两个部分,分为 # include部分和int main() { }部分让我们来一起探讨了解以下吧!
第一部分:
# include 是表示即将引入头文件stdio.h 通常写在文件开头,表示着 <编译前的预处理> 接下来也会详解。
那么为什么是写成include呢?
include在英文中表示:包括,那么我们是不是可以理解成即将包括这个文件呢?
所以以后我们在引入一个头文件的适合,需要在开头写入# include表示即将包含 【这个文件】
那么stdio.h的头文件是做什么的呢?
如果我们把stdio.h文件名称拆分出来理解,或许就很好理解它的用处了。
stdio.h >>> Standard +input +output =标准输出模式。【.h】则是头文件的后缀名
这是一个标准输入输出的头文件,如果我们以后要用到例如printf(),scanf()的指令时,我们就需要引入这个头文件。例如我们就用到了printf()的操作。
同时stdio.h文件功能还包括有【文件访问、二进制输入/输出、格式化和非格式化输入/输出、文件定位、错误处理、文件操作等】。
并且,圈住 stdio.h的尖括号<>,尖括号是表示内容,是必须的!
综上所述,第一部分的 # include == 即将执行的代码中,将会引入 stdio.h文件
第二部分
第二部分的int main(){ }是定义一个主函数。
它的标准格式写法应该是:
int main() {
return 0;
}
其中,main是表示这是一个主函数,在C语言程序当中,有且仅有一个main主函数;因为main主函数是C语言的程序入口。
C语言程序由main函数开始,也由main函数运行截止而结束。所以main主函数有且仅有一个!
另外的 int main中的int是表示整型函数,寓为即将函数返回值为一个整型值。
也许你会发现它结尾总是带着分号(;)。在C语言中,分号(;)代表语句结束;
return 即是表示返回的意思,那么在这里return 0;就是对应着上一句的int main返回整型值。
return 同时表示函数运行到这里就会停止,并将结果内容返回。return不仅支持返回整型值,还能传回表达式(这里不多赘述敬请发现体验)。
大括号{}是表示作用区域,大括号括住的区域表示该函数的区域,超出该区域的不算该函数区域。大括号的位置可以任意,没有具体要求。
在括号内,我们写出了printf(),printf是C语言中的标准输出函数,对应着将内容输出到控制器内。\n表示换行,这也将会在后续内容中讲解。
综上所述,第二部分的 表示定义一个主函数,大括号内容表示着函数需要执行的内容,return表示运行停止。
C语言中,# 号代表着指令。# include意思为 即将执行的代码中,将会引入xxx内容。例如# include
是一个文件, 意思为 Standard +input +output =标准输出模式,尖括号是表示内容,是必须的!
综上 # include == 即将执行的代码中,将会引入 stdio.h文件
#define宏定义通常用在程序中是用于替换指定常量内容
若程序中有定义∶#define N 100
在编译系统对C源程序进行预处理时,用 100 替换 N,只要遇到N就用100替换。
设有宏定义命令∶ #define RES 30-5 则表达式RES*5+30值为35
RES*5+30=30-5*5+30=30-25+30=35
设有宏定义∶#define TESTC) yy,则表达式TEST(4-2)的值为6
TEST(4-2)被替换为 4-2*4-2=4-8-2=-6
另外的
在VSCode中需要用到scanf可能会直接报错,可以用到宏定义放在程序前面避免报错:
# define _CRT_SECURE_NO_WARNINGS 1
标识符概念:(变量、函数、数组) 的名称
命名规则:
以字母或下划线( _ )开头;
只能使用字母,数字和下划线( _ );
与关键字大小写不同
关键字不同
auto | int | double | long | char | float | short | signed |
---|---|---|---|---|---|---|---|
unsigned | struct | union | enum | static | switch | case | default |
break | continue | register | const | valatile | typedef | extern | return |
void | do | while | if | else | for | goto | sizeof |
C语言最基本的数据类型有三种:整型(整数)、实型(小数/浮点数)、字符型。
每种数据类型都有常量和变量
数据类型 | 类型名称 | 对应输出方式 | 占用字节数 |
---|---|---|---|
字符型 | char | %c | 1 |
整型 | int | %d | 2/4 |
整型 | short | %d | 2 |
整型 | long | %d | 4 |
整型 | long int | %d | 4 |
整型 | long long | %d | 8 |
实型 | float | %f (精确n位小数:%.nf) | 4 |
实型 | double | %lf (精确n位小数:%.nlf) | 8 |
sizeof()函数,用来求括号内的内容占用的字节数。
小tips:如果需要用到sizeof()函数,需要用到头文件string.h,这个时候我们需要编译预处理引入string.h文件。
例如:
# include
# include
sizeof(char) // output : 1
通常来说,就是我们想要表达的内容叫做常量
合法字符常量:
'\n','1','a'
// 字面常量
int main(){
'3' // 没有直接定义内容的,叫做字面常量
'a' // 没有直接定义内容的,叫做字面常量
return 0;
}
合法字符串常量
"boy","i am a boy","when i was young"
计算字符常量占用字节数:
例如:字符串"boy\0s"
在内存中占用的字节数是4,其中b+o+y+\0=1+1+1+1=4。因为s在\0之后,所以不算在字符串之内。
char s="\t\"Name\Address\"\n"
当sizeof(s)时,输出的值为17
其中:\t =1,\"=1,Name=4,\=1,Address=7,\"=1,\n=1
1+1+4+1+7+1+1+1=17
例如:
// 先定义再赋值
char a1;
a1 ='From here to University'
// 连续定义
int x1,y1;
// 同时定义+赋值
float y2=5.28;
int x2=5,y2=-9;
// 连续定义赋值
double y3=x3=3;
// 另外的,若存在一个变量
int a,b; b=a=3,5;
//执行过后,a和b的值分别是3,3
//因为定义的是 b = a = 3 , 5;是表示 b 等于 a 等于3 ,其中 5没有发生作用。
如果一个变量已经在工程内其他文件中定义好,那么我们可以用extern关键字去调用其他文件中的变量。
关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数。
例如:
# include
// 假设存在文件 t.c
int num = 10;
// 假设存在文件 main.c
int main(){
extern int num;
printf("%d",num);
return 0;
}
在我们平时定义的变量当中,我们是可以对其常量的内容进行修改的。
现在我们将介绍一种无法被修改的变量:const 常变量
int main(){
const int n = 10; // 定义了一个常变量,用const表示一个常变量
// 定义后的常变量,无法被修改
n = 20; //程序此处会报错,因为n的值无法被修改
return 0;
}
枚举类型是C语言中的一种特殊类型;
枚举类型可以让我们的程序使用一些固定长度和固定数值的变量值范围;
枚举类型里面存着我们需要一 一列举的常量内容(可以想象成这是一个容器,里面存着常量);
定义枚举类型的方法:
enum 枚举类型 {枚举值列表};
例如:
enum month{
// 放入枚举表里的变量,会默认依次赋值常量为0 1 2 3......
// 对应着有n个枚举常量,就赋值到n-1。
January,
February,
March,
// 我们也可以对内容进行赋予新的常量内容
April = 4,
May = 5,
June = 7,
};
// 我们该如何使用呢?
int main(){
enum month Jan = January;
enum month June = 6;
printf("Jan = %d\n",Jan);
printf("Feb = %d\n",February);
printf("Mar = %d\n",March+1); //同样可以做正常相加减
printf("Jun = %d\n",June) // 可以做修改值的内容
return 0;
}
引入
- 局部变量:作用域是变量所在的局部范围;
- 全局变量:作用域是在整个工程内;
局部变量和全局变量尽量不要同名;
【局部变量和全局变量相同时,局部变量优先】;
局部变量的声明
# include
int main() {
int num = 10; // 在函数内的变量,是一个局部变量,可以在函数内使用。
printf("%d",num);
{
int num2 = 20; // 在一个括号内的变量,是一个局部变量,可以在括号中使用。
}
return 0;
}
全局变量的声明
# include
int num = 10; // 在函数外围定义的变量,叫做全局变量,可以在程序内部任意使用。
int main(){
printf("%d",num);
return 0;
}
变量的执行生命周期是什么时候呢?接下来我们将介绍作用域的概念,会更方便你理解变量执行的生命周期。那么我们一起来看看吧!
C语言编写代码中,大括号{ }圈出的区域通常表示作用域
通过上面的一些例子,我们可以观察到,main 函数会用大括号{ }圈住内容是函数的执行区,我们可以理解成,作用域就是该内容的有意义的区域。
同样的,变量也是如此
在作用域内的变量只可在作用域中使用,如果超出作用域调用变量则无法使用。
例如:
# include
int main(){
{
//作用域 入口
int num =5; // 局部变量 num
}//作用域 出口
printf("num = %d",num);
return 0;
}
//此处代码会报错,因为int num = 5是在main函数里的一块作用域中,printf在其外围,所以无法调用到num的数值。
在作用域内的输出语句可以输出作用域以外之前的内容
# include
int main(){
int num =5; // main函数内的局部变量
{
//作用域 入口
printf("num = %d",num);
}//作用域 出口
return 0;
}
// 输出: num = 5
综上四个关于局部和全局变量的例子,我们做个变量的生命周期的总结。
转义字符 | 释义 | ASCII码值(十进制) |
---|---|---|
? | 在书写连续多个问号时使用,防止他们被解析成三字母词; | 063 |
\’ | 用于表示字符常量( ’ ); | 039 |
\’’ | 用于表示一个字符串内部的双引号; | 034 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符; | 092 |
\a | 警告字符,播放系统提示音; (巧记:Attention ) | 007 |
\b | 退格符; (巧记:backspace ) | 008 |
\f | 进纸符; | 012 |
\n | 换行; (巧记:newline) | 010 |
\r | 回车; (巧记:return) | 013 |
\t | 水平制表符,控4个空格,形如一个TAB键; (巧记:tab) | 009 |
\v | 垂直制表符; | 011 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 X; | 三位八进制 |
\xdd | dd表示2个十六进制数字。 如: \x30 0; | 十六进制 |
C语言中的转义字符,对应的占用1个字节的内存空间
我们生活中经常用到的计算的符号,计算机语言来源于我们生活中自然也是服务于我们的生活。本处我们将会介绍C语言中的运算符,让我们一起来看看吧!
形如数学计算中的括号
依次对应 加 减 乘 除
取余运算符,取运算余数 例如7%3 ===> 对应7÷3 :2x3 = 6,余数1,那么7%3结果为1.
常用于判断奇偶数
每次运算+1,常用在for,while语句当中
每次运算-1,常用在for,while语句当中
赋值常量给到变量
并列关系,两个同时存在,常用在区间表示,例如1<=x<=5 :x>=1&&x<=5.
A||B,A、B均可成立结果
判断非该内容,运行成立
对应大小比较
相等判断 判断 a和b是否相等,用 a==b
小tips: 一个等号 = 是赋值,两个等号 == 是相等
非等于判断:如果 a 非(不)等于(!=) b
其中,
判定成立则 结果为 1
判定不成立 结果为 0
若 a=10,b=20,则表达式 !(a>1
1>1
a+=b ==> a=a+b
a-=b ==> a=a-b
a*=b ==> a=a x b
a/=b ==>a=a/b
a %= b ==> a=a%b
从左往右计算,取最右边的值。
例如:
当已知定义变量int a=1, b=2,(a + 3,b=a+ b,b+5,a+ b)的值为4
a+3 >>>1+3
b=a+b >>b=1+2=3
b+5 >>>2+5
a+b >>>1+3=4
表达式x=(a=3,6*a)执行结束后,a的值是3,x的值是18
运算规则: 先执行A,如果A为真,执行 B;如果A为假,则执行C。
使用方法:
A?B:C; //分号不能丢
举例:
int main(){
int a=1,b=3,c;
c =a>b?a:b; //先判断a>b是否成立,a
printf("%d",c); // outpu: c=3
return 0;
}
在平时生活中,我们难免会进行选择,不同的选择将是不一样的结果。编程语言来源于我们的生活,那么C语言中的选择结构是如何呢?让我们来一起看看吧!
if (条件1为真 判定成立) >>>执行语句1 如为假 执行下一语句或else()语句
简单的if-else语句
# include
int main() {
int a, b, c;
a = 3;
b = 2;
c = 6;
if (c == a + b) {
printf("yes\n");
}
else {
printf("no\n");
}
return 0;
}
当if 或 else 后面有多个语句时,用{ }把这多个语句括起来;
C语言对嵌套if语句的规定是∶else总是与其之前最近且不带 else 的 if 配对
int main() {
int a, b, c;
a = 3;
b = 2;
c = 6;
if (c == a + b) {
printf("yes\n");
}
else {
if (c >= a + b) {
c = c - (a + b);
printf("C大过ab=%d\n", c);
printf("Done!\n");
}
else {
printf("no");
}
}
return 0;
}
多重嵌套方式
int main() {
float a, b, c, delta;
scanf_s("%f %f %f", &a, &b, &c);
delta = b * b - 4 * a * c;
if (delta > 0) {
printf("delta=%f,方程有两个实数根\n", delta);
}
else if (delta ==0) {
printf("delta =0,方程有一个实数根\n");
}
else {
printf("deleta =%f,方程无实根\n", delta);
}
return 0;
}
循环结构是我们编程之中常用的一种结构,它可以完成一段命令能够反复执行多次,知道得到我们想要的结果。本处我们将会简要介绍C语言中的循环结构。
while语句 使用规则:
while(条件为真){
循环体;
}
while语句 使用方法归纳:
简单举例:
int main(){
int i;
i = 1;
while(i<=10){
printf("%5d",i);
i++;
}
return 0;
}
// output 1 2 3 4 5...... 10
使用规则:for(初始值;条件为真;变量更新){ 循环体 }
for 语句使用技巧:
举例:
int main(){
int i;
for(i=1,i<=10,i++){ // 初始i为1,i<=10时for成立,每次i+1
printf("%3d",i);
}
return 0;
}
定义数组∶ 数据类型 数组名【元素个数】; a[3]、a[]。
可以从键盘上输入数组的元素,用 for循环逐个赋值;
或直接赋值,用大括号{ }在其中输入数据值;
单独使用数组中的某个元素的方法∶数组名【标号】;
长度为n的数组内元素下标的范围是0 ~ n-1 ;
我们来简单做几个一维数组的练习项目练练手吧:
// 计算并输出一维整型数组array[5]中所有元素的平均值;
// 首先,定义了一个数组,名称array,内容为5个
int main() {
float array[5];
float num;
float sum = 0;
float avg;
for (int i = 0; i < 5; i++) {
scanf("%f", &array[i]);
}
for (int i = 0; i < 5; i++) {
num = array[i];
sum += num;
}
avg = sum / 5.0;
printf("%.2f", avg);
return 0;
}
// input 1 2 3 4 5
// output 3.00
//求出数组最大值,并输出其位置下标;
int main(){
int a[6]={
10,7,15,20,3,1};
int i,max,num;
max =a[0];
num =0;
for(i=1;i<6;i++){
if(a[i]>max){
max=a[i];
num=i;
}
}
printf("最大值:%d\n",max);
printf("下标 %d\n",num);
return 0;
}
// output 最大值20,下标 3
数据类型 数组名【数组行】【数组列】;
未被赋予的元素会自动设置为0;
若二维数组a有m列,则在a[i][j]前的元素个数为 m*i+j
例如:
a[][3]={1,2,3,4,5,6,7};
数组应该是:
1 2 3
4 5 6
7 0 0
// 行数不限制,列数排满进入下一行
// 行数可以不表示,但是列数一定要表示!否则就形同一维了。
// 数组定义:二维数组名称 [数组行数] [数组列数]
//可以理解成:生成一个叫名字xx 的 n 行 n列的二维数组。
a[2][3] ={
{1,2,3},{4,5,6}} // 最外围的大括号圈住内的括号数量代表行数,圈住的括号内数据代表列数据
//对应着矩阵排列可以如下
a[3][4] ={
{1,2,3,4},{4,5,6},{7,8}};
// 注意,这里声明的是第一行4个数据,第二行3个数据,缺少的列数数据自动补0
1 2 3 4 //{1,2,3,4}
4 5 6 0 //{4,5,6}
7 8 0 0 //{7,8}
提取数组内数据,对应了:数组名【数组n-1行】【数组n-1列】
从0 开始看
例如:
a[3][3]={1,2,3,4,5,6,7,8,9}; //三行三列
1 2 3
4 5 6
7 8 9
//提出5
a[1][1];
定义方式:数据类型 数组名【元素个数】;
例如char s[20]={"a","b","c","1","2","3","\0"}; // \0表示结束,系统会自动添加
也可以char s[20]="abc123" //自动生成同上方法。此处s[20] ,内容未满20个,则末尾自动补0。
char s[3] ='abc\0' 到达数组末尾,需要加上\0
声明格式:
返回值类型 任意函数名(数据类型 形式参数,......){
return 返回值;
}
// return的返回值的是返回至调用处,返回值的数据类型必须要和函数声明的返回值类型一致。
函数小Tips::
函数可以定义在main 函数的前面或后面,如在main后面需要在main函数里声明存在该函数,例如下;
//main函数后需要在main函数里声明存在该函数
int f(int a);
int main(){
int a,b
b =f(a); // 调用后返回的参数,叫做实参
return 0;
}
int f(int a){
// int a ,a为形参,在调用时传入的参数叫做形参
return a*a;
}
函数的返回值类型由函数所定义的函数类型。
返回类型为void(空),不写return语句,但不建议这种写法作为主函数的写法
形式参数和实际参数之间是单向值传递,使用函数指针可以变成双向传递;
函数内定义的变量只在本函数中有效,函数内的变量称作局部变量,全局变量需要在main函数外围定义
凡是函数中未指定存储类别的局部变量,其隐含的存储类型为(auto)。
凡是函数中未指定存储类别的全局变量,其隐含的存储类型为(extern)。
在C语言中,若未对函数类型进行声明,则函数的隐含类型为int类型。
函数的定义不允许嵌套,但函数的调用可以嵌套;
main函数不能被其他函数调用
函数调用,因为程序是由上到下浏览的,且函数第一个入口就是main函数,如果要在main函数后写函数,需要声明存在该函数
// 写在main函数后 需要做声明
int f(int a); //存在一函数,名为f,传入整型a
int main(){
int a,b
b =f(a); // 调用函数
return 0;
}
int f(int a){
//
return a*a;
}
//写在main函数前 无需做声明
int f(int a){
//
return a*a;
}
int main(){
int a,b
b =f(a); // 调用函数
return 0;
}
本篇文章就要接近尾声了,那么我们不妨来做一个小总结和小知识提醒!!~
main 函数基础
main 函数 = 程序主函数;
C语言程序是由函数构成的;
C语言程序有且仅有一个main函数;
C语言程序将从main函数开始执行;
C语言main函数将在return 0处结束执行;
C语言main函数要被大括号{}包围起来,括号位置不会影响程序运行。
主函数main为程序编写当中的main函数,不可另外声明其他函数为main函数;
main函数不可作为用户标识符;
main函数可以出现在程序任意位置,但在开头时调用其他函数需要另外在main函数里声明该函数名称。
C语言是高级语言,C语言编程就是把高级语言转成机器语言(0101);
C语言三种循环方式,不能互相嵌套!
8比特(bit)为1个字节(B);
C语言在英文输入法下输入;
C语言中分号(;)代表语句结束;
程序要求写大小写转化时,根据ASCII码:小写转大写:-32;大写转小写:+32;
C语言有3种结构:顺序结构(由上至下)、选择结构(分支结构)、循环结构。
C语言条件成立:非零整数(1)
C语言条件不成立:0
任意长度的数字,提取个位数的数字n // 1 % 10;
任意长度的数字,提取十位数的数字n // 10 % 10;
任意长度的数字,提取百位数的数字n // 100 % 10;
任意长度的数字,提取千位数的数字n // 1000 % 10,以此类推;
编辑源程序;
编译源程序;
连接目标程序;
运行可执行程序
源程序:后辍是.c
目标文件:后辍是.obj
可执行文件:后辍是.exe
本文写到这里就要结束啦,很高兴我们在这里再次相遇!
本文是C语言的基础入门笔记。但C语言的学习并不止步如此。学习路漫漫,希望在看这篇文章的你每一天都有新的进步,祝你也祝我哈哈哈!~
本文是笔者的学习笔记,如有纰漏或错误之处还希望能在评论区指出,让我们一起进步吧!~
创作不易,如果你觉得本文对你起到帮助,别忘了点赞收藏+关注噢。你的鼓励就是我的继续创作的动力,后续我也会继续分享我的学习经历以及许多有趣的Python或C语言的编程项目噢。