前言
学习的基本过程有理解→总结→应用这几个步骤.总结的目的大概是概括出大体的一种思路,一些必然和必不然,整理出"概念",并以概念指导应用.
引入
尝试做一些和编程有关的概念总结.为了满足那个很朴素的想法:总结出概念,编程的思路就水到渠成地来了.---就好像学了单词就想写出好作文一样,当然谁都知道除非天赋惊人,否则这个过程是很困难的.不管怎么说做一点努力.当中肯定有不严谨的地方,看官不必较真.
函数(方法)
函数是程序的基本单元.换句话说,"逻辑"是程序的基本单元.
1.函数表达逻辑.逻辑是一种因果关系.因果关系指"当什么情况出现时,出现什么结果".通常函数由四部分组成:返回值类型ResultType ,函数名function,形参pt,内部逻辑content;
ResultType function(ParameterType pt){
content;
}
常规形式中,形参表示"因",返回值表示"果".如果没有返回值,那么"果"在内部逻辑里.
---也可以没有形参,返回值为空void(内部逻辑一般不会为空,否则函数没有意义),函数名必须有,他也表示了要表达的逻辑的含义
/*没有返回值*/
void function(ParameterType pt){
content;
(no return)
}
/*没有参数*/
ResultType function(){
content;
return (和Result同类型的变量或者值)
}
/*既没有返回值,也没有参数*/
void function(){
content;
(no return)
}
2.函数内部组成:表达式/分支结构/循环结构/其他函数的调用(递归可以调用自己).
赋值表达式:将一个变量或常量赋值给另一个变量.通常等于号"="左边的称为左值,右边的称为右值(简单理解).左值可以取其地址,右值不一定有地址(C++中有移动右值概念稍有不同).
声明表达式:常见格式---类型名 变量名;或者---类型名 地址名 .可以和赋值表达式一起用,也可以单独用. int a; int a=3;声明和赋值一起用表示初始化.
比较表达式:
>,<,==(等于),!=(不等于),>=,<= //比较表达式
逻辑表达式
由&&(与),||(或)连接的两个比较表达式,或者!(取反)加单个表达式.返回值是true或false
分支结构:
if /else 或if /else if /else 及switch case break结构,表示选择
循环结构: for或者while表示条件循环.
其他函数的调用
一个逻辑包含了其他的逻辑,他们可能会有顺序关系.例如:做一个番茄蛋汤,需要切番茄,打蛋,加水,熬汤,这几个步骤.
3.函数关注数据类型和变量,而不是值.当值被传入后,得到相应的结果.
举例:现在有个需求---计算3加5的值.
分析: 需求:3加5; 要表达的逻辑是"加",所以函数名称叫做"add",3和5是需要传给函数的值,所以作为函数的两个形参.现在我们可以肯定的是:满足这个需求会在主函数中调用函数add(3,5);
接下来如何用代码实现?
首先确定形参和返回值的数据类型.3和5都是int类型,所以形参数据类型为int.返回值也是int类型,所以add前的返回值类型为int.----用其他整型,如short,unsigned int等也可以.
然后 写出代码
int add(int a,int b){
return a+b;
}
说明:3和5是传入的数据,也是逻辑中的"因",结果由return 返回;
这个函数的意思是:传入两个整数,得到相加的结果并返回
==此外可以用模板函数来实现,模板是一种"泛型"的概念,即忽略到数据类型,任意数据类型都可以==
template<typename T>
T add(T a,T b){
return a+b;
}
这个函数的意思是:传入两个某种类型的值,得到相加的结果并返回 .
主函数中调用可以使用add(3,5);其类型靠编译器推导.或者强制调用模板函数add<int>(3,5)
编译器推导的方式比较优雅,如果感觉模板用得不熟,可以强制调用.
扩展:如果有3个整数要相加呢?一样的思路
int add(int a,int b,int c){
return a+b+c;
}
数据和数据类型
数据的概念该怎样定义呢?我简单把他分为了"硬数据"和"软数据"两种.其中可以映射到硬件寄存器的数据,称为硬数据.比如某个类型的值.而软数据包括函数,类定义等,他们不能直接映射到寄存器,但是程序必须使用的数据.
数据类型又是什么?他像是数据的约束,比如定义了一个int型变量,再定义一个string型变量,如果将一个变量赋值给另一个变量,会出错(c语言中好像没有严格的类型检测,不会报错,但很可能带来预料以外的后果).程序员凭直觉也不会这样做.
然而当程序员站在硬件的角度去理解数据类型,又好像找不出什么问题,因为硬件只认识0和1,区别是他们占用的长度不同(如int型和double型).但至少是内存知道如何去分配相应大小的内存空间放置该类型的数据.编程语言设计者对内置数据类型,我感觉是一种编程实现.(此处略)
为什么把"函数"作为程序的基本单元而不是"数据"?我认为太单调了.程序里每时每刻都有许多数据在生成和交换.函数和数据联系也是非常紧密的.
小结:
理解一件事物往往从最简单的情形开始.
如果要理解编程的话,有函数和数据两个要件就可以了.函数传入数据表达逻辑,主程序调用函数.这是关于程序最简单的抽象模型(除非直接操作硬件,往寄存器里写数据)
然后在这基础上去扩展.数据从哪里来?可能是数据库,可能是从输入设备中输入.函数用文件组织,文件表示单独的功用.而函数内又有其他函数调用.文件也会包含其他文件,用到其他文件中的函数.