C语言基础

本文详细介绍了C语言的基础概念,包括其历史、可执行文件的形成过程、main()函数的作用、库函数、ASCII码表、数据类型与变量、操作符使用、编译与链接等,为初学者提供了一个全面的学习指南。
摘要由CSDN通过智能技术生成

在这里插入图片描述
编程环境由Visual studio 2022独家赞助

本节我将会介绍C语言常见概念和C语⾔数据类型和变量的相关问题:

在这里插入图片描述

一.C语言常见概念

1、C语言的历史

C 语⾔最初是作为 Unix 系统的开发⼯具⽽发明的

在这里插入图片描述

2.可执行文件的形成过程

C语言的源代码通常以.c为后缀的文本文件形式存在,⽂本⽂件本⾝⽆法执⾏,必须通过编译
翻译和链接器的链接,⽣成⼆进制的可执⾏⽂件,可执⾏⽂件才能执⾏

在这里插入图片描述

3.main()函数

·main函数是程序的⼊⼝,程序是从main()函数的第一行开始执行

·main函数是函数(主函数)

·main函数有且仅有⼀个

·main()函数通过return语句返回一个整数值作为程序的退出状态码。返回值为0表示程序正常终止,非零值表示异常终止

·main()函数可以选择性地接受命令行参数,常用形式为: int main(int argc, char* argv[ ], char* envp[ ])

在这里插入图片描述

4.库函数

库函数(Library functions)是事先编写好的可重复使用的函数,它们被封装到库文件中,以便在程序中进行调用和使用。库函数提供了一系列常用的功能和算法,可以加快开发过程并提高代码的可维护性。

库函数可以分为两种类型:

  1. C标准库函数(C Standard Library Functions):C标准库提供了一组常用的函数,涵盖了基本的输入输出操作、字符串处理、内存管理、数学计算以及其他常用的功能。这些函数被定义在C标准库头文件(例如<stdio.h>、<stdlib.h>、<string.h>等)中,可以直接在C程序中使用。

  2. 扩展库函数(Third-party Library Functions):扩展库是由第三方开发者或组织创建的库,用于提供特定领域的功能和算法支持。例如,图形界面库(如Qt、GTK+)、网络编程库(如libcurl、Boost.Asio)、数据处理和科学计算库(如NumPy、SciPy)、加密库(如OpenSSL)等。这些库函数通常需要通过链接库文件和包含相应的头文件来使用。

使用库函数的优点包括:

  1. 提高开发效率:库函数提供了许多已经实现的功能,可以节省开发者的时间和精力,避免重复劳动。

  2. 代码复用性:库函数可以在多个项目中被重复使用,提高了代码的复用性和可维护性。

  3. 避免重复实现:许多功能和算法已经在库函数中进行了实现和测试,使用库函数可以避免自己重新实现。

  4. 提供标准化接口:库函数提供了一套标准的接口和规范,降低了程序开发的复杂度和学习成本。

当使用库函数时,需要确保正确地链接库文件和包含相应的头文件,以便在程序中正确调用和使用库函数的功能。

参考链接:https://cplusplus.com/reference/clibrary

5.关键字

·关键字都有特殊的意义,是保留给C语⾔使⽤的

·程序员⾃⼰在创建标识符的时候是不能和关键字重复的

·关键字也是不能⾃⼰创建的

C语言的32个关键字:

在这里插入图片描述

在C99标准中又加入了5个关键字:

inline、 restrict 、 _Bool 、 _Comploex 、 _Imaginary

参考链接:https://zh.cppreference.com/w/c/keyword

6.ASCII码表

以前,不同的计算机厂商和系统使用不同的字符编码方式,导致在跨平台和跨系统间的文本传输和显示中出现混乱和不兼容性。ASCII码表的出现将字符的编码进行了统一,使得不同系统之间的文本交换变得更加简单和可靠

在这里插入图片描述
参考链接:https://zh.cppreference.com/w/cpp/language/ascii

·在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察

·换⾏ \n 的ASCII值是:10

·数字字符0-9的ASCII码值从48~57

·字符A-Z的ASCII码值从65~90

·字符a-z的ASCII码值从97~122

·对应的⼤⼩写字符(a和A)的ASCII码值的差值是32

编写程序展示ASCII码值从32~127的可打印字符:

在这里插入图片描述

7.转义字符

由特定字符加上反斜杠‘ \ ’构成:

在这里插入图片描述
参考链接;https://zh.cppreference.com/w/c/language/escape

8.语句和分类

C语⾔的代码是由⼀条⼀条的语句构成的,C语⾔中的语句可为以下五类:
• 空语句
在这里插入图片描述

• 表达式语句

这是一条表达式
在这里插入图片描述
加上 ‘ ; ’后,这是一条表达式语句
在这里插入图片描述

• 函数调⽤语句
在这里插入图片描述

• 复合语句

复合语句(Compound Statement)是用大括号 {} 包围起来的一组语句,在C语言中使用。它们被视为一个独立的代码块,可以包含多条语句,并按顺序执行

• 控制语句
1. 条件判断语句也叫分⽀语句:if语句、switch语句;
2. 循环执⾏语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。

9.注释

提高代码的可读性
1./**/ 的形式
2.// 的形式

二、C语⾔数据类型和变量

1.数据类型的介绍

在这里插入图片描述

2.单目操作符sizeof

·sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof操作符数的类型⻓度的,单位是字节

·sizeof 操作符的操作数可以是类型,也可是变量或者表达式

在这里插入图片描述

·sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的

·sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩

·sizeof 的计算结果是 size_t 类型的

在这里插入图片描述
计算类型长度:

#include <stdio.h>

int main()
{
   printf(“%zd\n”, sizeof(char));
   printf(“%zd\n”, sizeof(_Bool));
   printf(“%zd\n”, sizeof(short));
   printf(“%zd\n”, sizeof(int));
   printf(“%zd\n”, sizeof(long));
   printf(“%zd\n”, sizeof(long long));
   printf(“%zd\n”, sizeof(float));
   printf(“%zd\n”, sizeof(double));
   printf(“%zd\n”, sizeof(long double));
   return 0;
}

在VS2022的X64环境下输出的结果为:

在这里插入图片描述

3.signed 和 unsigned

· signed 关键字,表⽰⼀个类型带有正负号,包含负值;

· unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。

· int类型默认是signed类型的,其它类型有无符号由系统决定,使用unsigned类型时可使变量的取值范围扩大一倍,如:

在这里插入图片描述

4.变量

4.1 变量的创建

在这里插入图片描述
在这里插入图片描述

创建变量时给它赋一个值(初始化)是一个好习惯:

1 int age = 18;
2 char ch = ‘w’;
3 double weight = 48.0;
4 unsigned int height = 100;

4.2 变量的分类

• 全局变量:在⼤括号外部定义的变量就是全局变量
可以在整个⼯程中使⽤。

• 局部变量:在⼤括号内部定义的变量就是局部变量
在⾃⼰所在的局部范围内使⽤的。

在这里插入图片描述

4.3 注意事项

在全局变量和局部变量名字相同时,局部变量优先

局部变量和全局变量在内存中的存储:

我么先介绍内存中的三个区域:栈区、堆区、静态区。

  1. 局部变量是放在内存的栈区
  2. 全局变量是放在内存的静态区
  3. 堆区是⽤来动态内存管理的

在这里插入图片描述

5.操作符

• 算术操作符: + 、- 、* 、/ 、%
• 移位操作符: <<  >>
• 位操作符: &   |  ^   `
• 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
• 单⽬操作符: !、++、–、&、
、+、-、~ 、sizeof、(类型)
• 关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逻辑操作符: && 、||
• 条件操作符: ?  :
• 逗号表达式: ,
• 下标引⽤: []
• 函数调⽤: ()
• 结构成员访问: . 、->

5.1 运算符 / ⽤来完成除法:

除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数:

6 / 4 得到的结果是 1 ,⽽不是1.5 。原因就在于 C 语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。
如果 flaot x = 6 / 4;此时x等于1.000000浮点数默认保留六位小数

如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法:

6.0 / 4 表⽰进⾏浮点数除法,得到的结果就是 1.5
如果 int x = 6.0 / 4:此时x等于1,计算结果直接舍弃小数位,不进行四舍五入

5.2 运算符 % 表⽰求模运算

即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。


负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
#include <stdio.h>
int main()
{
printf(“%d\n”, 11 % -5);     // 1
printf(“%d\n”, -11 % -5);   // -1
printf(“%d\n”, -11 % 5);   // -1
return 0;
}

5.3 赋值操作符:=

int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。

5.4 复合赋值

+= -=
*= /= %=
//下⾯的操作符后期讲解

= <<=
&= |= ^=

5.5 单⽬操作符:++、–、+、-

++是⼀种⾃增的操作符,⼜分为前置++和后置++,–是⼀种⾃减的操作符,也分为前置- -和后置- -.

int a = 10;
int b = ++a; //++的操作数是a,是放在a的前⾯的,就是前置++
printf(“a=%d b=%d\n”,a , b);
计算⼝诀:先+1,后使⽤;
a原来是10,先+1,后a变成了11,再使⽤就是赋值给b,b得到的也是11,所以计算技术后,a和b都
是11.


int a = 10;
int b = a++; //++的操作数是a,是放在a的后⾯的,就是后置++
printf(“a=%d b=%d\n”,a , b);
计算⼝诀:先使⽤,后+1
a原来是10,先使⽤,就是先赋值给b,b得到了10,然后再+1,然后a变成了11,所以直接结束后a是
11,b是10.

5.6 + 和 -

这⾥的+是正号,-是负号,都是单⽬操作符。

运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。

运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负
数。

5.7 强制类型转换

在这里插入图片描述

5.8 操作符学习指南

在这里插入图片描述
其它操作符在后续遇到相关内容再做介绍,也可通过下方链接进行学习

参考:https://zh.cppreference.com/w/c/language/operator_precedence

三、一些题目和解析

题目

(1)源文件 .c 头文件 .h

有且只有一个主函数main()是程序运行的起点
(.c的源文件)编译 ------->
(.obj的目标文件)链接------>
(.exe的可执行程序)执行(只有.exe的可执行程序可以运行)

(2)标识符(你自己为变量的名字)

1.标识符是由字母,数字,下划线组成的;
2.数字不能开头
3.不能用关键字作为标识符
4.区分大小写

(3)实型数据(小数)

1.小数两边有一个是零的话,可以省略
如: 1.0 可以写成 1.  .1 可以写成 .1
2.e前e后必有数,e后必为整数(e E 大小写都行)

(4)数据类型的大小

Int整形   float单精度浮点型 4个字节   short短整型 2字节
double双精度浮点型占8个字节   char字符型1个字节

(5)算术表达式 “/” “%”

1.“/”两边是整型,结果是整型,小数位舍去
2.“/”两边有小数,结果是小数,小数位保留
3.“%”取余,两边的操作数必须为整型
(“%”不能操作float和double类型的数据)

(6)赋值表达式

a=b=1; √
Int a= b=1; ×(定义时不能连续赋值)
1 = a; × (赋值时等式的左边不能是常数)
a * = 2 + 3; a = a * (2 + 3)
x += x + x x = x + ( x + x)

(7)自增,自减 i = 1;

前置++   后置++   j = i++;   ( j = 1 , i = 2 )
前置- -   后置- -    j = ++i;   ( j = 2 , i = 2 )

(8)逗号表达式 (2, 3, 4)表达式的值为4

z = (2, 3 , 4)     z = 4
z = 2 , 3 , 4     z = 2

(9)强制类型转换

(int)a √
  int (a) ×
  (int)(a + b) //把a+b的和强制类型转换成int类型
  (int)a + b //a强制类型转换成int型在于b相加
  int a = 3.9 //a=3整型只取整数部分
  Double a,float b, int c, char d;
  执行c=(d+b)*c-a后,c还是最初定义的int型,不变

(10)注释//…

注释不是C语言不占用运行时间

(11)字符型’单引号’引起来

计算时要转成对应的ASCII值
‘0’- 0 = 48
‘A’= 65    ‘a’ = 97
大小写字母间ASCII值相差32
‘字符型’与“字符串型”结尾有‘\0’的区别
在这里插入图片描述

(12)转义字符

  1. 一般的转义字符\t \n \’ \” \\
    2.八进制转义字符:‘\141’是合法的,前导的0不能写
    3.十六进制转义字符:‘\x6d’是合法的,前导的0不能写,并且x是小写
    4.转义字符是一个字符
    在这里插入图片描述

(13)printf(“%…”,   )

%0d加0空格替换成0
%-d右对齐
printf(“%d”,x, y);   //只输出第一个x的值
Sscanf(“%…”, &…)
scanf(“a=%d, b=%d”,&a,&b)//原模原样输入
括号内都有双引号,scanf要取地址&

(14)进制

0      八进制
d   十进制
ox    十六进制

在这里插入图片描述

在这里插入图片描述

(15)putchar()   getchar()
用字符型变量a接收getchar()从键盘获得的值:

char a = getchar();

用putcha()将变量a中接收的字符打印出来:

putchar(a);

用putchar()直接打印字符时需要加单引号:

putchar(‘x’)

思考

我们都知道不同的数据类型,要用对应类型的变量进行接收,用对应占位符进行打印,但是…

为什么char类型的变量a可以用%d来打印?


在这里插入图片描述


那是因为在C语言中,char类型是整数类型的一种。它使用1个字节的内存来存储,表示范围是-128到127,或者是0到255(若char类型为无符号)。因此,char类型的变量实际上可以存储整数值,而不仅仅是字符。

四、一些分享和结束语

1.C和C++参考手册

链接:https://zh.cppreference.com

2.结束语

在这里插入图片描述

在这里插入图片描述

转眼间已经步入大学半年之久,感慨时间飞逝,希望以后的日子里可以珍惜时间,努力学习新的技术,提升自己的能力,与君共勉!

在这里插入图片描述

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羚尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值