前言
学习一门语言不是要记住所有这些函数,而是要懂得在哪里找到解决问题的答案
学习英语不是要记住所有单词,而是要懂得查字典(因为这样就可以理解单词,并会用单词造句子了)
以下侧重于了解输出(side effects),即显示在屏幕上的。
由可视化的拼图对应上实际的代码。
一、理解概念:
1.1 常识
1.源代码(人编写的),更高级的机器
机器代码(只用01编写),更低级的机器
将一种语言(源代码)转化成另一种语言(机器代码),需要一个程序转换,这个机器就是编译器(compiler)
So compiler is a program that translate one language to another.
2.Prompt=terminal
3.printf的f表示【格式化】。如何理解格式化呢,举个例子:
printf(“hello, %s”, David);
在这条语句中,把David放到%s位置就是格式化。简言之,按照我事先想到的格式来输出。这个函数最大的作用是方便我们理解计算机,对其进行一定程度上的可视化。
4.双引号“”,结束用;
5.头文件.h是
6.\n的出现是为了避免终端输出时系统带出来的$提示符(也可能是其它提示符,$是传统的提示符)
7.返回值就像外界送来的信息,你想怎么用都可以,可以存储也可以改变。它不能像printf那样显示在屏幕上,但是在某个block里存储着等着调用,打个比方他像别人给递来的“小抄”
8.启发式方法是相对于“对用户友好的方法”而言的。启发式原则就是按照我想的方式输出什么(也叫格式化,给了模板的),但可以从上面的例子看到,%s有点烦人,这能帮助计算机理解但是对用户不友好,所以是人启发计算机,叫启发式方法。
9.函数->函数顶部的东西(介绍顺序)
为什么要包含<studio.h>的东西。C语言中有很多内置功能,它们被储存在不同文件中。当我们需要某种功能时(使用函数),需要对该函数进行一个声明,声明是教会编译器如何执行该功能(就是别人事先写好的底层实现)。打个比方,我买了一个破壁机(C语言),对我而言需要豆浆时(函数),对机器而言需要告诉它如何打豆浆(制造商事先设置电路)。函数是带着出厂设置来的,方便在用函数出错的时候找到源头进行沟通。也就是直接用别人的东西,知道给东西在哪。
#include 就是告诉编译器,在做任何事情之前先去找到在本地硬盘上有一个名为<studio.h>的文件,将其复制粘贴到要用的地方。
【头文件】以“.h”结尾的文件——没声明头文件就容易出错!!!(机器不知道怎么实现)
它允许访问。更多的头文件(基础通用功能)可以访问
manual.cs50.i
即library全部是别人写的代码,我可以直接使用这些代码。——用library的东西就是站在巨人的肩膀上方便解决对我们而言更有趣的问题。
举个例子,printf如何工作的?不知道,反正有人写好了基础通用内容放在library中。我直接用就能把想要打印的东西显示在屏幕上。
10.开源:可以看到源代码(人写给人看的)
闭源:看不到源代码,但是可以用编译后给机器看的那些0和1
Q1:如果想要输出\n(不是空行)怎么办?
A:再在前面加一个\。即\n。但这不是我们经常要做的事情。
11.创建并初始化,可以一起。即int counter = 0;
12.只是为了节省敲代码的时间,提出一些需要时间习惯的操作,其实出发点很简单,比如:
1)循环语句中if-> else if,若是呼之欲出的结果则直接用else,否则用else if再判断
2)计数操作:counter = counter + 1;变成了counter += 1;或者counter++;(一个比一个简洁少敲代码)
13.“.”指你当前所在的文件夹,“…”指你的父级文件夹
问题是我不知道自己当前在哪里,这要怎么看?
答:举例来说,我正在编译的文件compare.c,它位于文件夹A里。那么我当前所在文件夹不是A本身,而是把A打开了即A下/A里面。A是它的上一级文件。
简而言之,把.当作占位,不知道具体有谁但是它们实际所处位置知道。
14.流程图可以把程序可视化。
从这个角度就可以理解,为什么程序设置main入口?该入口对应于流程图的的start。
15.为什么要用到else,而不是只用if?
若不用else,那么三个if问题是独立的,没有充分利用之前提问的信息。不论输入的x,y是什么,都需要问三个问题。
设计思想:对于迫不得已/最不可能发生的情况,才走最长的路径。除此之外,走到分支都是比较少的。
这点让我想到ResNet、UNet的网络设计创新点,它会用到之前的信息,而不是像CNN只是一层层地做处理。但是它们在用以前信息的时候没有判断,按照事先设计好的跳跃连接都会用,这可不可以考虑改进加入对是否进行跳跃连接的判断呢?以及跳跃连接最优连到哪里?
16.用||表示或,用&&表示且
17.两种循环的区别(朝不同的方向计数):
while的计数是从最好的开始,循环到不满足最低标准。(要做的操作是减:从3往下数到0)
int i = 3;
while (i > 0)
{
printf("meow\n");
i--;
}
for的计数是无门槛开始,循环到超过最高标准。(要做的操作是加:从0往上加到2)——实际计数,数完才进位
代码更简洁。
for (int i =0; i < 3; i++)//三件事:初始化变量用来计数;布尔型变量;每次通过代码想做什么事以更新
{
printf("meow\n");
}
为什么几乎都将定义的变量初始化成0来计数?因为这样不浪费比特数(比如1-25只能表示25个数,但是0-25能表示26个数,所以说从0开始不浪费)
字节Byte是计算机文件大小的基本计算单位,表示数据类型或语言字符。1 Byte = 8 bits。在C++的数据类型中,1个字节为char(一些语言描述需要2个字节表示一个字符,这叫做双字节字符集。一些处理器能够处理双字节或单字节指令),4个字节为int,8个字节为double;
位/比特bit是大小单位,作为数据传输的单位,表示数据量。是计算机运算的基础,属于二进制的范畴,表示一系列二进制位。
18.当我想自己创建一个函数/功能:
返回值 函数名(输入的参数)
void meow(int n)//没有返回值,定义一个meow的函数,它的参数是输入叫的次数一个整型n
int main(void)//主函数的返回值是整型,不需要输入任何参数
二、编程的三个步骤:
1.创建.c文件,以写入源代码——code 功能.c
2.编译器将源代码转化成机器语言——make 功能
3.“./hello”运行我的代码。(相当于我在电脑上双击图标的操作 )——./功能
三、C的特点
告诉编译器你想使用的变量类型(帮助编译器理解,如何将返回值存储在计算机内存中)
四、好的习惯:
文件名全用小写
字符串型string用双引号" "
单个字符型char用单引号’ ’
当编写计数代码时,应该几乎总是从0开始(这样到关心的总数时不必=)
五、Tips
1.若是想让程序一直循环做某件事,就让条件为True!