最近整个团队共同经过一段时间的C语言学习,觉得是一种很不一样的感觉,好久没有这种一个共同的任务,然后大家一起去学,一起去做了。对于我个人来言,还是比较喜欢也比较向往这种学习模式的,一个路线,大家一起去走,中间有问题了一起讨论解决,都能有一个好的学习态度,这样下来所有人都会有很大的进步。俗话说:“一个人可以走的更快,但是一群人可以走的更远!”对于一个没有方向的人来说,一个人可能会在错误的分岔路口越走越远,所以一个有凝聚力有向阳性的团队是目前所有人所期盼的。
下边就是在学习过程中,在迷你团队对于负责部分的笔记整理。希望都可以对一些基础的,但是比较重点部分能有更深入的认识
C语言程序的整体框架:
puts 可以在显示器上输出内容,但是仅有 puts 是不够的,程序不能运行,还需要添加其他代码,构成一个完整的框架。
最基础的一个C程序代码注意事项:
1.编程时请选择正确的输入法,严格区分中英文
2.“相同”字符在全角和半角状态下对应的编码值(例如 Unicode 编码、GBK 编码等)不一样,所以它们是不同的字符。
3.中文和英文模式下的制表符(键盘tab键)输入效果一致。
源文件简单的分类:
源文件后缀大都根据编程语言本身的名字来命名源文件其实就是纯文本文件,它的内部并没有特殊格式,源文件的后缀仅仅是为了表明该文件中保存的是某种语言的代码
C语言编译和链接:
编译:编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(Compile)。
链接(Link):其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。
C语言程序的错误和警告:
一段C语言代码,在编译、链接和运行的各个阶段都可能会出现问题
①:错误(Error)表示程序不正确,不能正常编译、链接或运行,必须要纠正。
②:警告(Warning)表示可能会发生错误(实际上未发生)或者代码不规范,但是程序能够正常运行,有的警告可以忽略,有的要引起注意。
C语言函数的概念:
简单来说,我们可以直接拿来使用的代码。这些代码,早已被分门别类地放在了不同的文件中,并且每一段代码都有唯一的名字。使用代码时,只要在对应的名字后面加上( )就可以。这样的一段代码能够独立地完成某个功能,一次编写完成后可以重复使用,被称为函数(Function)。读者可以认为,函数就是一段可以重复使用的代码。
另:对于自定义函数:自定义函数必须命名为 main,C语言规定,一个程序必须有且只有一个 main 函数。main 被称为主函数,是程序的入口函数,程序运行时从 main 函数开始,直到 main 函数结束(遇到 return 或者执行到函数末尾时,函数才结束)。
C语言的头文件:
头文件往往只包含函数的说明,也就是告诉我们函数怎么用,可以简单理解为:头文件中包含了若干函数。
引入头文件使用#include命令,并将文件名放在< >中,#include 和 < > 之间可以有空格,也可以没有
C语言标准库包含了15个头文件,stdio.h 和 stdlib.h 是最常用的两个
C语言变量和数据类型:
数据是放在内存中的,变量是给这块内存起的名字。另外,顾名思义:数据类型用来说明数据的类型。
C语言自带的基本数据类型在C语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。
数据类型的长度(32位)还有就是数据类型只在定义变量时指明,而且必须指明;使用变量时无需再指明,因为此时的数据类型已经确定了。
输出各种类型的数据:
%称为格式控制符,它指明了以何种形式输出数据,%d 表示以十进制形式输出一个整数,
%指明以何种形式输出数据①:“\n”为换行符号。被称为转义字符。就是让文本从下一行的开头输出,相当于在编辑 Word 或者 TXT 文档时按下回车键。
②:“//”为注释。用来说明代码是什么意思,起到提示的作用,可以帮助我们理解代码。注释虽然也是代码的一部分,但是它并不会给程序带来任何影响,编译器在编译阶段会忽略注释的内容
C语言中的整数:
short、int、long 是C语言中常见的整数类型,其中 int 称为整型,short 称为短整型,long 称为长整型。
对于整数的长度,C语言并没有严格规定 short、int、long 的长度 ,只做了宽泛的限制。
2 ≤ short ≤ int ≤ long这就意味着,short 并不一定真的”短“,long 也并不一定真的”长“,它们有可能和 int 占用相同的字节数。
C语言中的进制输出:
C语言中常用的整数有 short、int 和 long 三种类型,一个数字不管以何种进制来表示,都能够以任意进制的形式输出。数字在内存中始终以二进制的形式存储,其它进制的数字在存储前都必须转换为二进制形式;同理,一个数字在输出时要进行逆向的转换,也就是从二进制转换为其他进制。
通过 printf 函数,按需求输出进制无符号数可以以八进制、十进制和十六进制的形式输出,它们对应的格式控制符分别为:
“--”表示没有对应的格式控制符C语言规定,在符号位中,用 0 表示正数,用 1 表示负数。整数在写入内存之前可能会发生转换,在读取时也可能会发生转换
整数在内存中的存储:
在计算机内存中,整数一律采用补码的形式来存储。这意味着,当读取整数时还要采用逆向的转换,也就是将补码转换为原码。
①:将一个整数转换成二进制形式,就是其原码。
②:对于正数,它的反码就是其原码(原码和反码相同);负数的反码是将原码中除符号位以外的所有位(数值位)取反,也就是 0 变成 1,1 变成 0。
③:对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其反码加 1。
C语言整数的取值范围:
计算无符号数(unsigned 类型)的取值范围(或者说最大值和最小值)很容易,将内存中的所有位(Bit)都置为 1 就是最大值,都置为 0 就是最小值。按照这种巧妙的方法,我们可以很容易地计算出所的取值范围
所有有符号数的取值范围C语言中的小数:
根据精度不同可分为①:float,②:double
输出时:%f 和 %lf 默认保留六位小数,不足六位以 0 补齐,超过六位按四舍五入截断。
将整数赋值给 float 变量时会变成小数。
以指数形式输出小数时,输出结果为科学计数法;也就是说,尾数部分的取值为:0 ≤ 尾数 < 10。
使用 printf 函数输出,对应的格式控制符C语言中使用英文字符:
字符类型由单引号' '包围,字符串由双引号" "包围。(ASCII 码表将英文字符和整数关联了起来。)
输出 char 类型的字符有两种方法:①使用专门的字符输出函数 putchar;②使用通用的格式化输出函数 printf,char 对应的格式控制符是%c。
C语言中使用中文字符:
正确地存储中文字符需要解决两个问题。
①:足够长的数据类型
char 只能处理 ASCII 编码中的英文字符,是因为 char 类型太短,只有一个字节,容纳不下几万个汉字,要想处理中文字符,必须得使用更长的数据类型。
②:选择包含中文的字符集
C语言规定,对于汉语、日语、韩语等 ASCII 编码之外的单个字符,也就是专门的字符类型,要使用宽字符的编码方式。常见的宽字符编码有 UTF-16 和 UTF-32,它们都是基于 Unicode 字符集的,能够支持全球的语言文化。
C语言到底使用什么编码:
①:对于 char 类型的窄字符,始终使用 ASCII 编码。
②:对于 wchar_t 类型的宽字符和宽字符串,使用 UTF-16 或者 UTF-32 编码,它们都是基于 Unicode 字符集的。
③:对于 char 类型的窄字符串,微软编译器使用本地编码,GCC、LLVM/Clang 使用和源文件编码相同的编码。
④:处理窄字符和处理宽字符使用的函数也不一样:
<stdio.h> 头文件中的 putchar、puts、printf 函数只能用来处理窄字符;
<wchar.h> 头文件中的 putwchar、wprintf 函数只能用来处理宽字符。
C语言转义字符:
在C语言中,一个字符除了可以用它的实体(也就是真正的字符)表示,还可以用编码值表示。这种使用编码值来间接地表示字符的方式称为转义字符(Escape Character)。转义字符以\或者\x开头,以\开头表示后跟八进制形式的编码值,以\x开头表示后跟十六进制形式的编码值
①:\n用来换行,让文本从下一行的开头输出。
②:\t用来占位,一般相当于四个空格,或者 tab 键的功能。
③:单引号是字符类型的开头和结尾,要使用\'表示,也即'\'';
④:双引号是字符串的开头和结尾,要使用\"表示,也即"abc\"123";
⑤:反斜杠是转义字符的开头,要使用\\表示,也即'\\',或者"abc\\123"。
C语言中的几个基本概念:
①:标识符:定义变量时程序员自己起的的名字,一般能够表达出变量的作用,这叫做标识符(Identifier)。
C语言规定,标识符只能由字母(A~Z, a~z)、数字(0~9)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
②:关键字:是由C语言规定的具有特定意义的字符串,通常也称为保留字,例如 int、char、long、float、unsigned 等,定义的标识符不能与关键字相同,否则会出现错误。
③:注释:可以出现在代码中的任何位置,用来向用户提示或解释代码的含义。程序编译时,会忽略注释,不做任何处理,就好像它不存在一样。C语言支持单行注释和多行注释:
单行注释以//开头,直到本行末尾(不能换行);
多行注释以/*开头,以*/结尾,注释内容可以有一行或多行。
④:表达式(Expression)和语句(Statement)
表达式必须有一个执行结果,这个结果必须是一个值,例如3*4+5的结果 17,a=c=d=10的结果是 10,printf("hello")的结果是 5(printf 的返回值是成功打印的字符的个数)。
以分号;结束的往往称为语句,而不是表达式,例如3*4+5;、a=c=d;等。
C语言加减乘除运算:
C语言中的运算符号
C语言自增(++)和自减(--)
++ 在前面叫做前自增(例如 ++a)。前自增先进行自增运算,再进行其他操作。
++ 在后面叫做后自增(例如 a++)。后自增先进行其他操作,再进行自增运算。
(自减(--)也一样,有前自减和后自减之分。)
C语言中的除法运算有点奇怪,不同类型的除数和被除数会导致不同类型的运算结果:
①:当除数和被除数都是整数时,运算结果也是整数;如果不能整除,那么就直接丢掉小数部分,只保留整数部分,这跟将小数赋值给整数类型是一个道理。
②:一旦除数和被除数中有一个是小数,那么运算结果也是小数,并且是 double 类型的小数。
取余,也就是求余数,使用的运算符是 %。C语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。
①:余数可以是正数也可以是负数,由 % 左边的整数决定:如果 % 左边是正数,那么余数也是正数;如果 % 左边是负数,那么余数也是负数。
C语言运算符的优先级和结合性:
当一个表达式中出现多个运算符时,C语言会先比较各个运算符的优先级,按照优先级从高到低的顺序依次执行;当遇到优先级相同的运算符时,再根据结合性决定先执行哪个运算符:如果是左结合性就先执行左边的运算符,如果是右结合性就先执行右边的运算符。
C语言数据类型转换:
数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。分为自动转换和强制转换两种
①:自动类型转换:自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。
*将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:float f = 100;(100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f)再如:int n = f;(f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。)
在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。
②:强制类型转换:程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。需要人为干涉的转换。。但是风险性较大,使用强制类型转换时,要意识到潜在的风险。
无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值,也就是说:“类型转换只是临时性的!”
网友评论