本文简述了在初学C语言时遇到的简单概念中容易忽略的部分
编译器、链接器、可执行程序、集成开发环境、如何运行代码、库函数、关键字、ASCII码表、字符串与\0、转义字符、注释
1、编译器、链接器、可执行程序的关系
C语⾔是⼀⻔编译型计算机语⾔,C语⾔源代码都是⽂本⽂件,⽂本⽂件本⾝⽆法执⾏,必须通过编译 器翻译和链接器的链接,⽣成⼆进制的可执⾏⽂件,可执⾏⽂件才能执⾏。 C语⾔代码是放在 .c 为后缀的⽂件中的,要得到最终运⾏的可执⾏程序,中间要经过编译和链接2个 过程。
2、每个源⽂件(.c)单独经过编译器处理⽣成对应的⽬标⽂件(.obj为后缀的⽂件)
多个⽬标⽂件和库⽂件经过链接器处理⽣成对应的可执⾏程序(.exe⽂件)
3、集成开发环境、编译器的区别
集成开发环境(IDE)⽤于提供程序开发环境的应⽤程序,⼀般包括代码编辑器、编译器、调试器 和图形⽤⼾界⾯等⼯具。集成了代码编写功能、分析功能、编译功能、调试功能等⼀体化的开发软件服务套。VS2022就是一个集成开发环境
4、VS2022的安装教程:https://www.bilibili.com/video/BV11R4y1s7jz/
5、在VS2022上运⾏代码的快捷键: Ctrl+f5
6、库函数⽐较多,后期慢慢来介绍,提前了解可参考链https://cplusplus.com/reference/clibrary/
7、⼀些关键字⼤家可以去了解⼀下,不过使⽤最多的还是上⾯的32个关键字。 注:https://zh.cppreference.com/w/c/keyword(C语⾔关键字的全部介绍)
8、ASCII码表:参考:https://zh.cppreference.com/w/cpp/language/ascii
9.字符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个字符是不可打印字符,⽆法打印在屏幕上观察
10、字符用%c来打印,如printf("%c",'x');
字符用''来表示
11、字符串用%s来打印,
字符串的打印格式可以使⽤ %s 来指定,也可以直接打印如下:
printf("%s\n", "hello C");
printf("hello c");
printf("%s\n","abcdef");
printf("%s\n","x");
printf("%s\n","\"");
printf(" ''''\n");
printf("%s\n"," '''' ");
12、C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个 \0 字符,这个 \0 字符是字符串 的结束标志。对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 \0 的 转义字符, \0 是字符串的结束标志。所以我们在使⽤库函数 printf() 打印字符串或者 strlen() 计算字符串⻓度的时候,遇到\0 的时候就⾃动停⽌了。C语⾔中也可以把⼀个字符串放在⼀个字符数组中,我们在这⾥利⽤下⾯的代码验证⼀下 \0 的功能。
我们可以看到, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是 因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌。 但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0 作为技术标志,打印可以正常停⽌。 如果我们在arr1数组中单独放⼀个'\0'字符会怎么样呢?
看到三次打印的结果是⼀样的了,都是打印到 \0 的时候就停⽌了,那从上述的例⼦我们确实能够观 察到 \0 的作⽤和重要性的。
13、我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢? 这就是转义字符的问题, \n 是⼀个转义字符表⽰换⾏的意思,我们可以简单的理解为 \ 让 n 的意思 发⽣了转变, n 本来是⼀个普通的字符,被 \ 转义为换⾏的意思。 C语⾔中像这样的转义字符还有⼀些,具体如下:
• \? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
• \' :⽤于表⽰字符常量'
• \" :⽤于表⽰⼀个字符串内部的双引号
• \\ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
• \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
• \b :退格键,光标回退⼀个字符,但不删除字符。
• \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。
• \n :换⾏符。 • \r :回⻋符,光标移到同⼀⾏的开头。
• \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个4/8的倍数。
1.\t,跳过8个空格,从第8个位置结束,从第9个位置开始。
2.若前面的字节<=7,从第8个位置结束,从第9个位置开始。
3.若前面有8个字符,则从第16个位置结束,从第17个位置开始
注意:int len = strlen("c:\test\198\abc\test.c");
printf("%d\n",len);
其中\1是一个字符,不是\198应为8进制数不会出现9和8
其中strlen计算的是\0之前的字符个数(不包括\0)
使用strlen需要引头文件include<string.h>
strlen的返回值为size-t,是无符号的
• \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
下⾯2种转义字符可以理解为:字符的8进制或者16进制表⽰形式
• \ddd :ddd表⽰1~3个⼋进制的数字。如:\130表⽰字符X
• \xdd :dd表⽰2个⼗六进制数字。如: \x30表⽰字符0
• \0 :null字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其 ASCII码值是0.代码演示:
14、转义字符参考:https://zh.cppreference.com/w/c/language/escape
15、/**/ 的这个注释也不⽀持嵌套注释, /* 开始注释后,遇到第⼀个 */ 就认为注释结束了。
16、编译时,注释会被替换成⼀个空格,所以 min/* 这⾥是注释*/Value 会变成 min Value ,⽽不 是 minValue 。