发布时间:2023-02-19 16:30
目录
1.什么是C语言?为什么学习C语言?
什么是C语言?
2.第一个C语言程序
3.数据类型
4.变量、常量
定义变量的方法
变量的分类
变量的使用
变量的作用域和生命周期
常量
5.字符串、转义字符
字符串
转义字符
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超 级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好地支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
为什么学习C语言?
在了解编程之前,大多数人一直认为编程是程序员的事情,与自己的学习工作并不沾边。然而事实并不是这样的:对于大多数理工科而言,利用编程可以让计算机去处理大量、复杂的数据,省时省力。而文科生亦可以通过学习编程锻炼自己的逻辑思维,并且用一些简单的函数去记录、处理大量的文献。
在本科生毕业阶段,如果能熟练掌握一门编程语言,便能从众多应聘者中脱颖而出;而在研究生学习期间,编程更是学习的基础,所有的理论知识到最后都要通过编程在计算机上实现。
C语言的学习内容基础、系统,并且C语言的运行速度快可以满足大多数理工科专业的需求。正所谓C生万物,通过学习C语言打好良好的编程底子,之后再转去别的编程语言的学习也会非常的轻松。
任何学习的过程都不是一蹴而就的,C语言的学习更是如此。在学习C语言期间需要反复练习、不断巩固复习、以及要养成写博客,记录自己学习过程的良好习惯。C语言的学习大概需要一年左右的时间,相信这一年的付出最终会给各位带来丰厚的回报。
#include//引入头文件
int main()//主函数入口,一个项目只能有一个主函数
{
printf(\"Hello World\\n\");//打印“Hello World”
return 0;//返回一个整型,与int呼应
}
头文件:如果想调用头文件中的函数,例如“printf”,则需要在开头用#include引入头文件,如果未引用头文件执行程序,编译器则会报错:“printf”未定义。
主函数:主函数代表程序的入口,一个项目只能有一个主函数main,新版C语言用int来定义主函数,在结尾返回一个整型值与之呼应,一般默认返回值是0,返回0则代表程序成功,非0则报错。(老版教材中void main()已不适用)
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
如此多的数据类型,是为了应对生活中各种各样的数值。在写代码的过程中,尽量为我们的变量赋予合适的数据类型。通过sizeof操作符可以查询这些数据类型的大小,单位是字节。
#include
int main()
{
printf(\"%d\\n\", sizeof(char));//1
printf(\"%zd\\n\", sizeof(short));//2
printf(\"%zd\\n\", sizeof(int));//4
printf(\"%zd\\n\", sizeof(long));//4
printf(\"%zd\\n\", sizeof(long long));//8
printf(\"%zd\\n\", sizeof(float));//4
printf(\"%zd\\n\", sizeof(double));//8
printf(\"%zd\\n\", sizeof(long double));//8
return 0;
}
注:sizeof返回的值是无符号整型,在打印的时候可以用%d,程序可成功运行并不会报错,但是会报警告。这时只需要将%d改为%zu即可。(此为C99标准)
顾名思义,变化的量称为变量(身高、体重、年龄、余额),不变的量称为常量(圆周率,证件号码)。
#include
int main()
{
char ch = \'a\';//单个字符用单引号
char name1[] = \"王久久\";//字符串用双引号
int age = 23;
return 0;
}
注:在定义变量时,如果一开始不需要为变量赋值,最好为变量进行初始化。例:int age =0;有些老版教材喜欢用int age;这种方法,不给变量初始化,在之后的编程过程中很容易出现bug。
变量分为全局变量和局部变量。
全局变量:定义在函数外部的变量为全局变量。
局部变量:定义在函数内部的变量称为全局变量。
#include
int num = 100;//全局变量
int main()
{
int num = 99;//局部变量
printf(\"%d\\n\", num);//当局部变量和全局变量冲突时,以局部变量优先,这里显示num的是99
return 0;
}
#include
int main()
{
int a = 0;//定义变量,并初始化
int b = 0;
int c = 0;
scanf(\"%d %d\", &a, &b);//用scanf函数输入两个整数,两个数之间用空格隔开。&为取地址符号,将输入的参数传给变量a,b
c = a + b;
printf(\"%d\\n\", c);
}
注:在为变量命名时,最好将其赋予意义,方便以后使用时不会混淆。
作用域:
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的。
全局变量的作用域:为整个工程,整个工程的任何地方都可以使用全局变量,并对其进行修改。
局部变量的作用域:为变量所在的局部范围,即变量所处的函数内部。
生命周期:
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
全局变量的生命周期:为整个工程的生命周期。
局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
注:在进行编程时,应尽量少使用全局变量,多使用局部变量。全局变量整个工程都可以访问、修改,安全性差;局部变量仅限作用域内使用,出了作用域则无法访问、修改,安全性高。
C语言中常量分为以下几种:
字面常量:
100;
3.14;//常量无法改变
#define定义的标识符常量:
#include
#define pass 60
#define good 80
#define excellent 90
//define 定义的变量
int main()
{
int num = 0;//初始化
scanf(\"%d\", &num);//输入
if (num=pass && num = good && num < excellent)
{
printf(\"良好\");
}
else if (num >= excellent)
{
printf(\"优秀\");
}
return 0;
}
注:假若卷面满分为150分,只需要改动上述define定义的部分,无需再改动函数内部的数值,非常方便。
枚举常量:
#include
enum color//枚举常量
{
red,//0 枚举常量默认从0开始,依次向下递增1
yellow,//1
blue//2
};
int main()
{
enum color a = red;//用enum color创建一个变量a,赋值为red
enum color b = yellow;
enum color c = blue;
printf(\"%d\\n\", a);//0
printf(\"%d\\n\", b);//1
printf(\"%d\\n\", c);//2
return 0;
}
注:除了颜色,性别、爱好、地区等等都可以用枚举常量来表示。
const修饰的常变量:
#include
int main()
{
int a = 10;
a = 20;//常规定义变量可以进行修改
const int b = 10;//const定义的常变量具有常量的属性,不可以更改,但其本质还是常量。
return 0;
}
由双引号引起来的一串字符称为字符串
字符串的结束标志是‘\\0’,在计算字符串长度时不会计算在内。由双引号输入字符串时,默认结尾是\\0,不用手动输入。但是,如果以连续的单引号输入一串字符时,结果必须加‘\\0’。
#include
int main()
{
char arr1[] = \"hello\";//在创建数组时可以不为其定义空间,根据输入的内容自动定义
char arr2[] = { \'h\', \'e\', \'l\', \'l\', \'o\', \'\\0\' };
char arr3[] = { \'h\', \'e\', \'l\', \'l\', \'o\' };
printf(\"%s\\n\", arr1);
printf(\"%s\\n\", arr2);
printf(\"%s\\n\", arr3);
return 0;
}
以上代码执行后的结果为下图:
数组arr3由于没有‘\\0’,编译器无法识别结束标志,在打印完hello后会继续打印乱码。
此外,在为数组定义空间时,两种方法也不一样。
char arr1[5] = \"hello\";
char arr2[6] = { \'h\', \'e\', \'l\', \'l\', \'o\', \'\\0\' };//以该方式输入时,定义空间时需要考虑到‘\\0’占一个字节,而arr1则不需要
转义字符 |
释义 |
\\? |
在书写连续多个问号时使用,防止他们被解析成三字母词 |
\\\' |
用于表示字符常量\' |
\\“ |
用于表示一个字符串内部的双引号 |
\\\\ |
用于表示一个反斜杠,防止它被解释为一个转义序列符。 |
\\a |
警告字符,蜂鸣 |
\\b |
退格符 |
\\f |
进纸符 |
\\n |
换行 |
\\r |
回车 |
\\t |
水平制表符 |
\\v |
垂直制表符 |
\\ddd |
ddd 表示1~3个八进制的数字。 如: \\130 X |
\\xdd |
dd 表示2个十六进制数字。 如: \\x30 0 |
编译器在编译时,是从左往右依次读取的,有时想打印的内容与转义字符的内容会混淆,导致无法编译,这时在前方加入\\即可。
例如:
打印一个字符’,如何打印?
打印一个字符串,字符串的内容为”,如何打印?
#include
int main()
{
printf(\"%c\\n\", \'\\\'\');//打印单个字符\'
printf(\"%s\\n\", \"\\\"\");//打印字符串,其内容为\"
return 0;
}