翁恺_C语言_1

前言:基础概念

操作系统

32位系统和64位系统的区别:① 64位处理器一次可提取64位(bit) 数据(只要两个指令,一次提取8个字节的数据), 32位(需要四个指令,一次提取4个字节的数据).

关于运算符

return a=4, b=5, c=6; 返回6; return 1, 2, 3; 返回 3; return(1), 2, 3; 返回3. 因为return不是一个函数而是一个关键字,因此1的括号没有任何实际作用。

括号也是一个运算符 // 如果你不确定运算符的优先级,加括号()是最简单的办法

关于进制

%o:8进制;%x:16进制

关于程序的好坏

没有一个专业的程序员会容忍有两个片段的程序几乎是一模一样的。

对于重复使用的代码,应该写一个函数去做这个事情

一些重要的零碎知识

#include<stdio.h> 包含标准输入输出头文件 //std:standard,i:input,o:output,.h:头文件。

在程序中使用的变量名、函数名、宏名、结构体名、标号等统称为标识符。C语言的标识符由字母、数字、下划线组成,并且第一个字符必须是字母或下划线,不能是数字。在标识符中,字母的大小写是有区别的,例如BOOK与book是两个不同的标识符。

C语言中有32个关键字,标识符名不能与关键字同名

//写程序写的是个步骤,详细程度:代码>伪代码>算法

//结束一个语句,要么是大括号“{}",要么是分号“;”

// 本地变量是若没有进行初始化,是没有初始值的。它的内部将会指向一些乱七八糟的值。

第一章:程序设计与C语言

1.计算机-程序-算法

计算机所做的事情都叫计算,计算的步骤(计算机做事的步骤)就是算法。我们要让计算机做计算,就要找出一个算法,然后用编程语言写出来。

解决问题传统的几种方法

  • 枚举法:将可能的结果一枚一枚的举出来。

  • 二分法

2.程序的执行

  • 解释器:一个仆人,能读懂你的程序,但是并不产生任何东西(程序),只是去做动作,按照你程序里的意思一条一条的往下走。下次再运行你的程序时,还需要再次“召唤”解释器,由它来执行你的程序。(python)

  • 编译器:一个翻译官,读不懂你的程序,但是会将你的程序翻译成机器语言(让计算机读懂),并没有做任何动作。最后执行时是将编译器翻译好的机器语言拿去执行的。(c语言)

  • 但语言本身并无解释和编译之分,只是传统和喜好的问题

C语言——一门高效、难学且无趣的语言:

  • 基础性的工作是用C来写的,比如网站的服务器是用C来写的,但是网站上的一些应用不是用C来写的

  • 使用时需要:编辑器(写程序)+编译器(将程序翻译成机器语言的程序)=IDE(集成开发环境)

  • 在C语言中,缩进和空格都是没有影响的。

第二章:计算

//Plus.c
#include <stdio.h>              
int main(void)                   
{
    int a;
    int b;
    printf("请输入两个整数:\n");
    scanf("%d\n%d",&a,&b);
    printf("%d+%d=%d\n",a,b,a+b);
    return 0;
}

1.定义变量

2.定义常量

  • 命名时:所有的字母大写

  • 在定义常量的类型前会加一个修饰符“const”

3.浮点数

  • C语言中两个int类型运算的结果也只能是int类型

  • 10/3==3

  • 10和10.0在C中是完全不同的两个数,后者是浮点数

  • 当浮点数和整数一起运算时,C会将整数转换成浮点数,然后进行浮点数运算,结果也为浮点数。

  • double类型输入输出时的格式化字符串不一样

4.表达式

  • 运算符 V.S. 算子

  • 单目、双目运算符:一个运算符有几个算子就叫做几目运算符;

  • +当单目的时候,是正号的意思;-当单目的时候,是负号的意思

5.递增递减运算符

  • "++"、“--”。二者也是单目运算符,他们的算子还必须是变量。作用是给这个变量+1或者-1。

  • "++"放在a后叫后缀,"a++";"++"放在a前叫前缀,"++a";二者相同的作用是都会使a+1,a的值都会改变

  • 但不同的是:"a++"最终显示的结果是a原来的值,"++a"的结果是a+1之后的值

6.关系(比较)运算符

  • 结果只有两种:条件成立为1,否则为0。

  • 优先级:

  • 关系运算符优先级比算术运算符低,但比赋值运算符高

  • 判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右进行的

第三章:判断(if语句)

1.if语句写法

if语句圆括号后可以跟一个大括号,也可以不跟。不跟大括号时,if后面不能加分号,要在语句结束的地方加分号(就是一加上分号,就代表这个if语句结束了)。两种写法:

2.if-else嵌套

  • if-else嵌套语句是一个整体,如果if的条件满足后,则执行if语句内的代码,执行完后将不再执行其对应else语句内部的代码

  • else总是和最近的那个if匹配缩进格式不能暗示else的匹配;

  • 容易混淆

  • 安全做法

  • 建议:在if或else后总是用{},即使只有一条语句的时候。

3.将所有的else对齐(级联的if-else)

  • 下面两种写法相等

4.if语句常见的错误

  • 忘了大括号

  • 解决方法:永远在if和else后面加上大括号,即使当时后面只有一条语句

  • if后面的分号

  • if后若不加大括号,第一个分号的位置,就是该if语句内部代码结束的位置

  • 错误使用 == =

  • if只求()里的值是0或非0,若为0(不论是判断产生的还是本身的值),都不会运行内部的代码

  • 代码风格

  • 在if和else之后必须加上大括号形成语句块;

  • 大括号内的语句缩进一个tab的位置;

  • 但风格是三观,有各种各样的风格:(快捷键:”Ctr+/“,将多行代码直接变成注释)

5.switch-case语句

  • case:只是一个入口,只是一个路牌,并不是划分一段一段的标志,并不能阻止代码往下运行。

  • break:若某一个case后没有break,则会执行完这个分支后,顺序执行下一个分支。每一个case后面的type只相当于一个"站牌",当继续顺序执行下一个分支时这个"站牌"并不会让你停下来,而是直接忽视这个站牌了,知道碰见break才会让你停下来。(下图为type==3时)

第四章:循环

//小技巧:记录求和的变量,初始化一般设置为0,记录求积的变量,一般设置为1

  1. while循环

  • 先判断条件,再进循环体

  • 结尾是{},不需再加分号“;"

  • 循环体内一定要改变循环条件,否则会陷入死循环。

  1. do-while循环

  • 先进循环体,再判断条件

  • do-while循环最后一定要带上分号";"

  1. for循环

  • for 循环的一般形式为:

  • for(表达式1; 表达式2; 表达式3){

  • 语句块}

  • 运行过程

  • 1) 先执行“表达式1”。

  • 2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。

  • 3) 执行完循环体后再执行“表达式3”。

  • 4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。

  • 上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)

  • “表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。

  • for循环的执行过程可用下图来表示:

  • 可以有 for ( ; n>1; n--){

  • fact *=n;

  • } //三个表达式每一个都可以省略。

  • 循环次数

  • for ( i=0; i<n; i++ ) for ( i=1; i≤n; i++) 的循环次数一模一样,都是n.

  1. 三种循环的选择

  • 如果循环有固定次数,用for;

  • 如果必须执行一次,用do_while;

  • 其他情况用while

  1. break vs continue

  • break:跳出循环;

  • continue:跳过当前这一轮循环剩下的语句,进入下一轮循环

  • 接力break vs goto语句

第五章:数据类型

//这一章学的不是很好,尤其是编码补码字长等知识

//32位和64位都说的是字长,也就是bit,32位占据4个字节,64位占据8个字节

  1. C是有类型的语言

  • 关于类型:在使用一个未使用过的标识符,未定义它,在C语言看来这是一种错误。(python中可以,不用先定义)

  • C语言的变量,必须:在使用前定义,并且确定类型。

  • C以后,编程语言向两个方向发展:

  • C++/Java更强调类型,对类型的检查更严格;

  • JavaScript、Python、PHP不看重类型,甚至不需要事先定义。

  • 类型安全

  1. C语言的类型

  • sizeof():是一个运算符,给出某个类型或变量,在内存中所占据的字节数。比如:sizeof(int) or sizeof(i)。

  1. 补码: //这一节再好好看看,反码+补码

  1. 整数类型

  • 整数的范围:

  • unsigned:无符号

  • 8进制和16进制

  • C语言之所以有这么多的数据类型,是因为早期的底层语言需要这么多的数据类型,来处理硬件与硬件之间的事情(最新的语言如python都没有指定是那种整数类型,java等也没有unsigned来指定符号,C中的这些操作只是对底层硬件做操作的时候才有用)。那如何选择数据类型呢?:没什么特殊需要,就有int。

  1. 浮点类型

  • float vs double

  • 范围:float和double在0左右的一小段范围内无法进行表达。具体见下面范围。

  • 输入输出:double的输入用%lf,输出用%f,用%e是输出时科学计数法表达的。

  • 对于计算机而言,使用离散的数字来表示一个范围内的数。比如在0.004-0.005间,用double表达要比用float表达的数字多,因为double相邻的两个数之间的距离小,精度更高。

  • 对计算机而言,一般是无法正常表达一个数的,比如用float或double表示时,都是用四舍五入的方式来表达的。

  • 在%和f之间可以加上.n来指定输出小数点后几位,这样的输出是做四舍五入的。

  • 超过范围的浮点数

  • 无穷大不可以用整数来表达 ,但可以用浮点数来表达。

  • 浮点运算的精度

  • float的有效数字是7,若不指明小数点后几位,则一般输出的结果都是四舍五入后的。

  • 小小数点的数字字面量是double而非float。因此若一个小数是float类型,则需要用f或F来表明身份。

  • 两个浮点数直接用“==”来判断二者是否相等,可能是失败的。因此应该去求二者的差,然后用fabs()求其绝对值,若小于该类型的精度则可认为这两个值相等。

  • 浮点数的内部表达

  • 整数在计算机内部是用纯二进制数来表达,因此两个整数间可以直接做运算(加减等)。

  • 但浮点数在计算机内部是以一种编码形式来表达,首先用一个bit来表示符号,然后用一些bit来表示指数部分,再用一些bit来表示分数部分。

  • 浮点数在计算时是由专门的硬件来实现的。

  • 如何选择?如果没有特殊需要,只使用double。

  • 现代CPU能直接对double做硬件运算,性能不会比float差,在64位的机器上,数据存储的速度也不比float慢。

  1. 字符类型

  • char既可以表示一种最小的整数类型,也可以表示一种字符类型。

  • 每一个字符在计算机内部都可以以一个值来表达它。

  1. 逃逸字符

  • 在printf("")中使用的

  • \b:回退一格后再输出接下来的字符,如果接下来没有字符,则只回退。

  • 一个\t使得输出从下一个制表位开始。

  • \n和\r其实代表“换行”和“回车”两个动作,平常我们只用\n,因为我们的shell会帮我们把\n翻译成“回车”和“换行”两个动作。

  1. 类型转换

  • 自动类型转换

  • 当运算符的两边出现不一致的类型时,会自动转换成较大的类型。

  • 对于printf,只要是小于int类型的整数类型,都会被转换成int;float类型的浮点数,也都会被转换成double,所以用%f就足以。但是scanf不会,要输入short,需要%hd。

  • 强制类型转换

  • 与其他语言(如python)不同,C语言的转换函数加括号,而值不加括号。

  • 强制类型转换不会改变一个变量,而是去计算一个新的值出来。

  • 运算优先级

  1. bool类型

  • C89之前并没有bool类型,它并不是C的原生类型,要使用它必须要在开头include一个头文件:“#include<stdbool.h>”,之后才可以使用bool和true、false。

  1. 逻辑运算

  • 与或非

  • 优先级:!、&&、||的优先级不用死记,按照其在键盘上的顺序记就行。!>&&>||。

  • 短路:

  1. 条件运算符

  • 条件运算符

  • 逗号运算符:一般只在for循环中用到。

猜你喜欢

转载自blog.csdn.net/DUDUDUTU/article/details/129283026