C语言超详细讲解——C语言的常见概念
C语言超详细讲解——C语言的常见概念
C语言是一种广泛使用的编程语言,尤其在系统软件和嵌入式系统开发中占据重要地位。本文将从C语言的基础概念开始,详细介绍其常见概念,包括编译器选择、第一个C语言程序、main函数、printf函数、关键字、字符和ASCII编码、字符串、转义字符、语句分类以及注释等知识点。
C语言的常见概念
C语言是什么
C语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发UNIX操作系统而设计的。C语言就是众多计算机语言的一种,当然C++/Java/Go/Python都是计算机语言。编译器的选择
编译和链接
C语言是一门编译性语言,C语言源代码都是文本文件,文本文件无法执行,需要编译器翻译和链接器链接,生成二进制可执行文件,可执行文件才能执行,如下图所示。这是windows电脑上C语言生成exe可执行文件的过程。编译器的对比
常见的编译器有:gcc\msvc\clang等,也有一些更方便的集成开发环境:VS2022\XCode\CodeBlocks\Dev c++\Clion\Visual Studio Code
为什么要把Visual Studio Code单独拎出来下面分项说明
VS2022集成MSVC(安装包较大,但安装简单,无需配置,使用方便,并且利于代码习惯养成,语法要求很严格,企业常用)。
Xcode集成clang(苹果电脑的开发工具,苹果电脑用户可以自己试试,听说不错)
CodeBlocks集成gcc(比较小众,官方没有中文版,需要自己配置)
Dev c++集成gcc(小巧,但过于简单,开始可能遇到中文乱码的问题,代码风格养成不好,除了部分竞赛和传统教育的学校,不建议使用)
Clion默认使用CMake,编译器可以自己配置(收费)
最后说一下Visual Studio Code功能更强大,可以扩展AI和其他工具,但是配置很麻烦,新手不建议尝试,很费时间并且可能按照步骤也出错(这是在说我)。
总体来看,推荐VS2022社区版学习,免费,方便,工作常见。安装教程https://www.bilibili.com/video/BV11R4y1s7jz/
- VS的简单介绍和第一个C语言程序
在VS上写代码,我们是需要创建项⽬的,直接新建项⽬就可以了。
在项⽬中就可以添加源⽂件和头⽂件。
C语⾔把 .c 为后缀的⽂件称为源⽂件,把 .h 为后缀的⽂件称为头⽂件。
第一个C语言程序
#include<stdio.h>
int main()
{
printf("hello world");
return 0;
}
在VS2022上运⾏代码的快捷键: Ctrl+f5 或单击绿色空心三角
- main函数
每个C语言程序都从main函数开始执行,main函数是程序的入口,也被叫做主函数。main前面的int表示main函数执行结束时返回一个整型类型的值,所以在main函数的最后写return 0; 前后呼应。
- main函数是程序的入口。
- main函数有且仅有一个。
- 即使一个项目中有多个.c文件,也只能有一个main函数。
第一次写代码常见错误: - main被写成mian。
- main后边的()漏掉。
- 代码中使用中文符号。
- 语句结束后缺少分号。
- printf和库函数
在代码
printf("hello C\n");
中,printf是一个库函数,功能是在标准输出设备(一般指屏幕)上进行信息打印。printf函数可打印多种类型的数据,如:
int n = 100;
printf("%d\n", n); // 打印整型
printf("%c\n", 'q'); // 打印字符
printf("%lf\n", 3.14); // 打印双精度浮点型
其中,%d、%c等是占位符,会被后边的值替换。使用库函数时需要包含头文件,printf函数需要包含stdio.h头文件,方法是
#include <stdio.h>。
库函数是C语言标准规定的一组函数,由不同的编译器厂商根据标准实现,提供给程序员使用,这些函数组成函数库,称为标准库。一个系列的库函数一般声明在同一个头文件中,使用库函数要包含对应的头文件。库函数较多,提前了解可参考链接:https://cplusplus.com/reference/clibrary/。
- 关键字介绍
C语言中有一批保留名字的符号,如int、if、return等,这些符号被称为保留字或关键字。
- 关键字有特殊意义,是保留给C语言使用的。
- 程序员创建标识符时不能与关键字重复。
- 关键字不能自己创建。
C语言有32个关键字:
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed sizeof
static struct switch typedef union unsigned void volatile while
在C99标准中加入了inline、restrict、_Bool、_Complex、_Imaginary等关键字。一些关键字可自行了解,使用最多的还是上述32个关键字。C语言关键字的全部介绍:https://zh.cppreference.com/w/c/keyword。
- 字符和ASCII编码
在键盘上敲出的各种符号,如a、q、@、#等都被称为字符,C语言中字符用单引号括起来,如’a’、‘b’、‘@’。在计算机中所有数据以二进制形式存储,字符在内存中的二进制存储遵循ASCII编码。ASCII码表包含128个字符的十进制、八进制、十六进制及字符编码。
需要掌握的几组特殊数据:
- 字符A - Z的ASCII码值从65 - 90。
- 字符a - z的ASCII码值从97 - 122。
- 对应的大小写字符(a和A)的ASCII码值差值是32。
- 数字字符0 - 9的ASCII码值从48 - 57。
- 换行\n的ASCII值是10。
ASCII码值从0 - 31的32个字符是不可打印字符。单个字符的打印可使用%c指定格式:
#include <stdio.h>
int main()
{
printf("%c\n", 'Q');
printf("%c\n", 81); // 81是字符Q的ASCII码值,也可正常打印
return 0;
}
可打印字符展示:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 32; i <= 127; i++)
{
printf("%c ", i);
if (i % 16 == 15)
{
printf("\n");
}
}
return 0;
}
- 字符串和\0
C语言中,用双引号括起来的一串字符称为字符串,如"abcdef"。字符串的打印格式可使用%s指定,也可直接打印:
#include <stdio.h>
int main()
{
printf("%s\n", "hello C");
printf("hello c");
return 0;
}
C语言字符串末尾隐藏着一个\0字符,它是字符串的结束标志。在使用库函数printf()打印字符串或strlen()计算字符串长度时,遇到\0就自动停止。
可将字符串放在字符数组中验证\0的功能:
#include <stdio.h>
int main()
{
char arr1[] = {'a', 'b', 'c'}; // arr1数组中存放3个字符
char arr2[] = "abc"; // arr2数组中存放字符串
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
运行结果中,arr1字符数组打印a、b、c后还打印了随机值,因为arr1末尾没有\0字符作为结束标志;arr2数组打印正常,因为它使用字符串常量初始化,数组中有\0作为结束标志。
若在arr1数组中单独放一个’\0’字符:
#include <stdio.h>
int main()
{
char arr1[] = {'a', 'b', 'c', '\0'};
char arr2[] = "abc";
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", "abc\0def");
return 0;
}
三次打印结果相同,都在遇到\0时停止,体现了\0的作用和重要性。
- 转义字符
转义字符是字符中的一组特殊字符,可转变原来字符的意思。例如\n是转义字符,表示换行。常见转义字符如下:
- ?:在书写连续多个问号时使用,防止被解析成三字母词(新编译器上可能无法验证)。
- ‘:用于表示字符常量’。
- ":用于表示字符串内部的双引号。
- \:用于表示一个反斜杠,防止被解释为转义序列符。
- \a:警报,使终端发出警报声或出现闪烁,或两者同时发生。
- \b:退格键,光标回退一个字符,但不删除字符。
- \f:换页符,光标移到下一页(现代系统上行为类似\v)。
- \n:换行符。
- \r:回车符,光标移到同一行的开头。
- \t:制表符,光标移到下一个水平制表位,通常是下一个4/8的倍数。
- \v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
- \ddd:d d d表示1 - 3个八进制的数字,如\130表示字符X。
- \u00dd:d d表示2个十六进制数字,如\u0030表示字符0。
- \0:null字符,代表没有内容,是字符串的结束标志,ASCII码值是0。
代码演示:
#include <stdio.h>
int main()
{
printf("%c\n", '\'');
printf("%s\n", "\"");
printf("c:\\test\\code\\test.c\n");
printf("\a");
printf("%c\n", '\130'); // 130是8进制,转换成10进制是88,对应字符'X'
printf("%c\n", '\u0030'); // x30中的30是16进制,转换成10进制是48,对应字符'0'
return 0;
}
转义字符参考:https://zh.cppreference.com/w/c/language/escape。
- 语句和语句分类
C语言代码由一条条语句构成,语句可分为以下五类: - 空语句
一个分号就是一条空语句。空语句一般用于需要一条语句但该语句无需做事的地方。
#include <stdio.h>
int main()
{
// 空语句
return 0;
}
- 表达式语句
在表达式后边加上分号就是表达式语句。
#include <stdio.h>
int main()
{
int a = 20;
int b = 0;
b = a + 5; // 表达式语句
return 0;
}
- 函数调用语句
函数调用时加上分号就是函数调用语句。
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf("hehe\n"); // 函数调用语句
int ret = Add(2, 3); // 函数调用语句
return 0;
}
- 复合语句
成对括号中的代码构成一个代码块,也称为复合语句。函数的大括号中的代码、for循环的循环体大括号中的代码等都是复合语句。
#include <stdio.h>
void print(int arr[], int sz) // 函数的大括号中的代码构成复合语句
{
int i = 0;
for (i = 0; i < sz; i++) // for循环的循环体的大括号中的就是复合语句
{
printf("%d ", arr[i]);
}
}
int main()
{
int i = 0;
int arr[10] = {0};
for (i = 0; i < 10; i++)
{
arr[i] = 10 - i;
printf("%d\n", arr[i]);
}
return 0;
}
控制语句
控制语句用于控制程序的执行流程,实现程序的各种结构方式(C语言支持顺序结构、选择结构、循环结构),由特定的语句定义符组成,C语言有九种控制语句,可分成以下三类:条件判断语句(分支语句):if语句、switch语句。
循环执行语句:do while语句、while语句、for语句。
转向语句:break语句、goto语句、continue语句、return语句。
后期会详细介绍控制语句。注释是什么?为什么写注释?
注释是对代码的说明,编译器会忽略注释,对实际代码没有影响,是给程序员自己或其他程序员看的。好的注释有助于理解代码,但不要过度注释。写注释能体现程序作者的素质,找工作时写必要的注释会给面试官留下好印象。注释的2种形式
/.../的形式:将注释放在/…/之间,内部可分行,也可插在行内。使用时不能忘记写结束符号/,且不支持嵌套注释。
/* 注释 */
/* 这是一行注释 */
int fopen(char* s /* file name */, int mode);
- //的形式:将注释放在双斜杠//后面,从双斜杠到行尾都属于注释,只能是单行,可放在行首或一行语句的结尾,是C99标准新增的语法。
// 这是一行注释
int x = 1; // 这也是注释
两种注释都不能放在双引号里面,双引号里的注释符号会成为字符串的一部分,失去注释作用。
VS的注释快捷键 CTRL+\ ,ctrl+k,ctrl+c
取消注释 CTRL+k+CTRL+u
2. 注释会被替换
编译时,注释会被替换成一个空格,如min/* 这里是注释*/Value会变成min Value,而不是minValue。
总结
C语言就这样开始吧,如有错误,请在评论区纠正,谢谢