编程环境由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)是事先编写好的可重复使用的函数,它们被封装到库文件中,以便在程序中进行调用和使用。库函数提供了一系列常用的功能和算法,可以加快开发过程并提高代码的可维护性。
库函数可以分为两种类型:
-
C标准库函数(C Standard Library Functions):C标准库提供了一组常用的函数,涵盖了基本的输入输出操作、字符串处理、内存管理、数学计算以及其他常用的功能。这些函数被定义在C标准库头文件(例如<stdio.h>、<stdlib.h>、<string.h>等)中,可以直接在C程序中使用。
-
扩展库函数(Third-party Library Functions):扩展库是由第三方开发者或组织创建的库,用于提供特定领域的功能和算法支持。例如,图形界面库(如Qt、GTK+)、网络编程库(如libcurl、Boost.Asio)、数据处理和科学计算库(如NumPy、SciPy)、加密库(如OpenSSL)等。这些库函数通常需要通过链接库文件和包含相应的头文件来使用。
使用库函数的优点包括:
-
提高开发效率:库函数提供了许多已经实现的功能,可以节省开发者的时间和精力,避免重复劳动。
-
代码复用性:库函数可以在多个项目中被重复使用,提高了代码的复用性和可维护性。
-
避免重复实现:许多功能和算法已经在库函数中进行了实现和测试,使用库函数可以避免自己重新实现。
-
提供标准化接口:库函数提供了一套标准的接口和规范,降低了程序开发的复杂度和学习成本。
当使用库函数时,需要确保正确地链接库文件和包含相应的头文件,以便在程序中正确调用和使用库函数的功能。
参考链接: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语言中使用。它们被视为一个独立的代码块,可以包含多条语句,并按顺序执行
• 控制语句
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 注意事项
在全局变量和局部变量名字相同时,局部变量优先
局部变量和全局变量在内存中的存储:
我么先介绍内存中的三个区域:栈区、堆区、静态区。
- 局部变量是放在内存的栈区
- 全局变量是放在内存的静态区
- 堆区是⽤来动态内存管理的
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)转义字符
- 一般的转义字符\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.结束语
转眼间已经步入大学半年之久,感慨时间飞逝,希望以后的日子里可以珍惜时间,努力学习新的技术,提升自己的能力,与君共勉!