键盘敲烂,月薪过万作业不做,等于没学
当前系列: 编程语言 修改讲义
C语言是面向过程的,可以说,面向过程是现在所有主流开发语言的基础。

理解面向(oriented):以……为导向为核心。此处类似于教育要面向未来,要面向现代化……

  • 面向过程:以过程为导向
  • 面向对象:以对象为核心

理解过程(procedure):一步一步的实现,实现某个功能的过程。

具体来说,这一步一步的过程,可以被大致分为:变量赋值、运算、分支循环、函数封装,四大部分。

C语言是偏底层偏硬件的,基本上不会用于普通的应用开发,更不会用于Web开发。为什么热度第一,飞哥估计是因为教学……


代码演示说明

实事求是的说,作为语言,JavaScript有很多很多的问题。但它有一点好:方便!直接使用浏览器就可以运行……

所以综合考虑,现阶段我们先使用JavaScript语言进行简单演示

PS:前后端的同学都请放心,所有这些知识,都是基础的、通用的

解释型语言:浏览器F12和控制台

JavaScript是一种解释型语言,所谓解释(interpret),就是没有编译这一过程,或者没有编译生成的文件

#常见面试题:编译和解释的区别#

解释器(对于JavaScript而言就是浏览器)可以直接执行源代码

PS:

  • 有的资料将解释定义为:逐行逐行的执行,或者一边读取/翻译/解释,一边执行。飞哥觉得不准确,早期浏览器可能是这样,但现在应该有进步……
  • 除浏览器以外,JavaScript也可以有其他解释器,比如V8,它就可以一次性的将所有代码解析然后缓存,这就不是逐行逐行的翻译执行了

计算机的概念是进步的,大家不要过于纠结。包括编译,以前我们是编译是将源代码编译成二进制机器码,但Java和C#都是将其编译成一种“中间语言”

另外,大家要区分:

  • 语言:语言是语法规则,是“虚”的
  • 语言的编译器/解释器:这是实实在在的软件,能够按照语言的语法规则将源代码进行编译/解释。

所以,这种说法:Java都是C写的……本义应该是Java的编译器是C写的。

演示:在主流浏览器上按F12,就可以出现控制台(console),在里面输入代码回车就可以执行:

alert('源栈欢迎你')

换行、空格和注释

代码的最小执行单元是(line)。

  • Java和C#,必须
  • JavaScript,推荐

用分号(;)来表示一行的结束。

一行代码中通常会出现空格(space),用空格来分隔关键句/变量名……演示:

let age = 18;
letage=18;
al   ert('源栈欢迎你')  
但是多个空格会被视为一个,演示:
alert       ('源栈欢迎你')

我们要学习的这几种语言中:

  • Javascript/C#/Java,都是大小写(upper/lower case)敏感(sensitive):greet ≠ Greet
  • SQL,是大小写不敏感的greet = GREET

另外,代码中还会出现注释(comment)。通常用于向其他开发人员解释说明代码,包括:

  • 行注释,//后整行被注释
    //NOTE:该对象必须先保存,再使用
  • 块注释,/**/包裹部分被注释,可单行也可多行 
    /*大家明明可以靠颜值,
    ……
    为什么要拼才华?*/

注释内容不影响代码的运行(编译/解释时会被忽略),演示:

//alert('源栈欢迎你')

同学们要善于利用换行、空格(缩进)和注释提高代码的可读性

注意:代码的可读性,非常重要!非常重要!!非常重要!!!会贯穿我们全部的教学过程!


#常见面试题(争论):代码里面有没有必要写注释?

  • 正方:必须得写,越详细越好!
  • 反方:垃圾代码才需要写注释。代码本身就是一种说明……

好玩:你见过哪些有趣的注释?


变量

就像代数运算中我们经常需要用一个符号表示一个可变的可替换的数值一样:

y=2x+1

y和x都是变量。x可以是1,也可以是2、3、4……;当x发生变化,y也会相应的变化。

计算机的“计算”,也离不开变量:输入/中间运算/输出……(复习:图灵机,计算机的计算,本质上和人的计算没有区别)

一个容器盒子

程序语言中的变量(variable),也是这样一个概念,可以理解为存放数据的盒子。

比如我们要用一个变量表示源栈的学费,就可以:

let fee = 986;    //让fee代表986

fee就是一个变量,或者说,fee就是变量名

let fee=986; 这么一条语句,实际上包含了两个部分:

  1. 声明(declare):创建一个变量fee,fee前面的let(ES6引入,之前使用var),表明此时是在声明/创建一个变量
  2. 赋值(assign):把数据986(又被称之为予给变量fee

变量可以在声明的时候马上赋值(如前所述);也可以先声明,以后再赋值:

let fee;
fee = 986;    //注意这里的fee前面没有let

但无论如何,变量都应该:声明,赋值;赋值,使用。

还可以在一条语句中赋值同类型的多个变量:

let fee = 986, weeks = 4;
注意:
  • 只需要关键字let一次
  • 两个变量之间用逗号(,)隔开

关于变量名

为了强调,我专门用一节课来讲!

变量名首先有一些强制规定:

  • 不得使用关键字
  • 中间不能有空格
  • 不能使用数字开头
  • ……

注意:作为一个专业的程序员,变量名一定要:清晰直观有意义。

  • 垃圾的命名:a、b、c、cc、 c1、c2……统统拖出去打死!打死!!打死!!!不要和我说什么“临时”,第一是习惯,第二是练习,取名不是你想象的那么容易的。
  • 优雅的命名:fee、slagon、sum……

变量名:

  • 尽量用英语,
  • 老大同意可以用汉字,
  • 绝对绝对不要自作主张用拼音!坑爹呢,这是……

如果用英语(99%的场景),多个单词之间,用首字母大写的方式隔断,比如:isFemale,这被称之为:驼峰命名法——这是目前最主流的命名法。

变量的使用

上述语句运行之后,fee这个变量,里面装着的就是986。

以后我们对fee进行操作,实际上就是对986进行操作;或者说,我们使用变量,就是使用变量这个盒子中存放的数据。比如:

fee + 1;

运行时就是986+1,结果为987。

注意:使用已有变量的时候,不能再添加关键字let

@试一试@:加了let又会怎么样?

变化:重新赋值

变量,按字面理解就是一个可以改变的量。所以我们还可以给他重新赋值,改变它的值:

fee = 888;   //同样注意fee前面没有let,因为第二次赋值,你是在“使用”它了

注意:给变量再次赋值,等同于使用变量,不要在前面加let。

这时候,fee里面装的就是888了。

一个盒子一次只能存放一条数据。

所以第二次赋值,就将fee中存放的数据“”成了888——这就是变量名称的由来。

@想一想@:以前存放的数据呢?放哪去了


常量

和变量相对应的就是能变化的常量(还记得么?圆周率是一个常量,地心引力也是一个常量):

  • 声明的同时就必须赋值
  • 一旦赋值,就不能/不应该更改
标记常量的关键字是const(Java是final,但const仍然是保留关键字,开发人员不可用,比如:
const pai = 3.14

注意:常量仍然可以参与预算,只是不能被改变

20*pai;    //OK的
pai = 3.1415    //报错


强类型 vs 弱类型

首先澄清一个概念,无论强类型,还是弱类型,数据本身都是有类型的。比如:

  • 32(没引号)就是数字32,
  • "32"(有引号)就是字符串32,

这是不一样的:

3+2;   //3和2都是整数,所以结果是5
"3"+"2"   //"3"和"2"都是字符串,所以+代表拼接,结果是32

#体会:为什么需要数据类型?#

  1. 数据识别的需要:所有存储在计算机中的数据都是二进制的(复习:),这些0101010011001010101010……的数据究竟代表的是数字、文字、图片……,如何转换,等等?只能由数据类型界定。
  2. 运算的需要:只有特定的数据类型才能进行某些特定的运算。比如,986-888=86,这是可以的;但“大飞哥”+2019/10/4,这是什么鬼?
    或者你说,是不是可以根据数据长得像什么来进行猜一猜?好吧,326801052是什么?你猜它是数字还是字符串?猜出来有奖哟,^_^
  3. 校验的需要:比如事先规定了这一列的类型是“真假”,你进行存储的时候就只能输入1或者0,如果你不小心输入108,计算机就可以直接报错,提示你进行检查。  

强/弱类型针对的是变量是数据。

  • 强类型:变量也要类型。这种类型的变量,就不能存放另外一种类型的变量:你可以把这种类型的变量想象成不同形状的盒子,一种形状的盒子只能装相同类型的数据
  • 弱类型:变量没有类型,不要求类型。一个变量既可以装这种类型的数据,也可以装另外一种类型的数据:你可以把这种变量想象成袋子

通常,强类型语言(Java和C#)的变量声明,要在前面标记类型,比如:

int fee = 18;    //fee是int(整数integer)类型
String slagon = "源栈欢迎你";    //slagon是string(字符串)类型
fee = "成年";    //会报(编译时)错

如果在一条语句中赋值给多个变量赋值,变量必须是同类型的:

int a = 3, b = 2;

弱类型(JavaScript)要么不用标记(如前所示),要么统一用let等标识

let fee = 18;    
fee = "源栈欢迎你";    //OK的,不会报错

PS:强类型又被称之为静态(static)类型,弱类型又被称之为动态(dynamic)类型。

弱类型语言唯一的优势就是灵活/自由,而由此而带来的问题……一言难尽啊,一句话:

开发一时爽,维护火葬场

PS:因为TypeScript的逐渐流行(vue3.x都使用TypeScript编写),所以即使是前端开发人员,飞哥也强烈推荐了解一些强类型知识,包括后续的面向对象等。


作业

  1. 阅读下面一段代码,看看你的判断和实际结果(能够使其运行)是否一致
    	let age = 28;
    	//age = 30;
    	age + 10;
    	alert(age);  /*这时候age的值是多少?*/
    	age = age + 10;
    	alert(age);  /*这时候的age的值又是多少?*/	
  2. 说一说变量和常量的区别,试着声明一个常量length,值为100
  3. 强类型语言才区分数据类型,弱类型语言不用区分数据类型”:这种说法准确么?为什么?


学习笔记
源栈学历
大多数人,都低估了编程学习的难度,而高估了自己的学习能力和毅力。

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 编程语言 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码