Loading... # 前言 考虑到在学校会教到C语言,并且有这个方面的需求,所以打算学习下。因为习惯用了vscode,所以本来是打算直接使用 `visual studio code`进行C语言的学习的,但是环境配置好之后老是报错 ~其实是弄了半天弄烦了(不是)~ 于是就又下载了 `visual studio`,一顿安装下来就好了,确实是很方便,很适合 `.NET,C语言`之类的语言开发 # 程序结构 ````c #include <stdio.h> //注释 /*注释*/ int main(){ printf("Hellow,world"); return 0; } ```` * C语言的文件后缀为 `.c`,C++的语言文件为 `.cpp` * 首先是预处理指令 `#include stdio.h`以此来告知编译器在编译前要包含 `stdio.h`文件。 * 然后是主函数 `int main()`,是程序的执行位置 * 注释方式是和PHP一致的,支持 `//..`、`/*..*/` * `printf()`是C语言的可用函数,是将 `Hellow,world`打印在屏幕上 * `return 0;` 终止 main() 函数,并返回值 0 # 程序的执行 在C语言中,代码遵循 `先后`,例如 ```c #include <stdio.h> //事先定义了add函数 int add(int a,int b){ return a + b; } int main(){ int c; c = add(2,3); //因为事先定义了add函数,编译器是明白add函数有什么作用的 printf("%d\n",c); return 0; } ``` <div class="tip inlineBlock share"> 若将add函数与main入口函数调换位置,编译器会报错,原因是因果调换了,还未认识,就变成朋友了 </div> # 占位符 | 转换操作 | 转换方式 | | :--------: | :-------------------------------: | | %c | 字符类型 | | %d | 整数类型 | | %e | 双精度浮点型,e计数法表示,小写 | | %E | 双精度浮点型,E计数法表示,大写 | | %f | 双精度浮点型 | | %o | 无符号八进制整型 | | %s | 字符串 | | %u | 无符号整型 | | %x | 无符号十六进制整型,小写 | | %X | 无符号十六进制整型,大写 | <div class="tip inlineBlock share"> %d适用于char、short数据类型 `</br>`%ld适用于long数据类型 `</br>`%lld适用于long long 数据类型 </div> <div class="tip inlineBlock share"> %u适用于unsigned char、ugsigned short数据类型 `</br>`%lu适用于unsigned long数据类型 `</br>`%llu适用于unsigned long long 数据类型 </div> # 类型提升 我们已经知道,变量是需要先声明,后使用的。也就是前面我们提到的代码的 `先后`执行 同样的,printf也是事先被声明在了stdio.h文件中,所以是可以调用的 在printf中,低于int数据类型的类型在传入printf时,其类型会自动提升为int类型,而高于int数据类型的不会变化。同样的道理也适用于无符号的数据类型 ## sizeof函数 在了解类型提升前,我们还需要了解数据类型所占字节大小(这与编译器及平台有关) 要想测量数据类型所占字节大小,我们可以通过sizeof函数进行测量,例如 <div class="tip inlineBlock info"> 我的编译环境为windows11,C++,64位系统 </div> ```c #include <stdio.h> int main(){ printf("sizeof char=%d\n",sizeof(char)); printf("sizeof short=%d\n",sizeof(short)); printf("sizeof int=%d\n",sizeof(int)); printf("sizeof long=%d\n",sizeof(long)); printf("sizeof long=%d\n",sizeof(long long)); return 0; } ``` <div class="tip inlineBlock warning"> 可以知道char、short、int、long、long long数据类型所占字节分别为1、2、4、4、8 </div> <div class="tip inlineBlock error"> 注意:C语言标准中规定,高级别的数据类型所占字节不得小于低级别数据类型所占字节。但可以相等,如int和long </div> 由此我们可以知道各个数据类型的取值范围是多少 | 数据类型 | sizeof大小 | 二进制位数 | 取值范围算式 | 取值范围 | | :---------: | :----------: | :----------: | ------------------ | ------------------------------------------- | | char | 1 | 1*8=8 | [-2^7]~[2^7-1] | -128~+127 | | short | 2 | 2*8=16 | [-2^15]~[2^15-1] | -32768~+32767 | | int | 4 | 4*8=32 | [-2^31]~[2^31-1] | -2147483648~+2147483647 | | long | 4 | 4*8=32 | [-2^31]~[2^31-1] | -2147483648~+2147483647 | | long long | 8 | 8*8=64 | [-2^63]~[2^63-1] | -9223372036854775808~+9223372036854775807 | <div class="tip inlineBlock success"> 算式中上标之所以都会在二进制数基础上少一个,是因为最高位被当作符号位使用了,如果我们知道该变量绝对不会出现负数,且不想最高位被当作符号位使用,就需要用到unsigned关键词 </div> | 数据类型 | sizeof大小 | 二进制位数 | 取值范围算式 | 取值范围 | | :-------------------: | :----------: | :----------: | -------------- | ------------------------- | | unsigned char | 1 | 1*8=8 | 0~[2^8-1] | 0~+255 | | unsigned short | 2 | 2*8=16 | 0~[2^16-1] | 0~+65535 | | unsigned int | 4 | 4*8=32 | 0~[2^32-1] | 0~+4294967295 | | unsigned long | 4 | 4*8=32 | 0~[2^32-1] | 0~+4294967295 | | unsigned long long | 8 | 8*8=64 | 0~[2^64-1] | 0~+18446744093909551615 | <div class="tip inlineBlock info"> 类型提升顾名思义:当数据类型声明的变量所取值范围超过时,会依次提升到对应的数据类型 </div> **示例** ```c #include <stdio.h> int main(){ char c1 = 127; short s1 = 32767; int n1 = 2147483647; char c2 = -128; int n2 = -2147483648; printf("%d\n",c1); printf("%d\n",s1); printf("%d\n",n1); printf("%d\n",c2); printf("%d\n",n2); return 0; } ``` ```c #include <stdio.h> int main(){ unsigned char c1 = 0; unsigned short s1 = 0; unsigned int n1 = 0; unsigned char c2 = 255; unsigned short s2 = 65535; unsigned int n2 = 4294967295; printf("%u\n",c1); printf("%u\n",s1); printf("%u\n",n1); printf("%u\n",c2); printf("%u\n",s2); printf("%u\n",n2); return 0; } ``` char、short、int与unsigned char、unsigned short、unsigned int都是比int、ungsigned int数据类型低级或等于的数据类型,故会分别转化为int数据类型、ungsigned数据类型 用%c时会将数值转为对应的ASCII字符并打印在控制台 ```c #include <stdio.h> int main(){ char c = 65; short s = 66; int n = 67; printf("%c\n",c); printf("%c\n",s); printf("%c\n",n); return 0; } ``` <div class="tip inlineBlock share"> 占位符可以启到转换的操作,比如%c将整型转化为对应的ASCII字符 </div> Last modification:August 23, 2022 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 11 如果觉得我的文章对你有用,请随意赞赏
2 comments
真不错,太详细了
你搁这在卷是吧