提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
作业:将我们课堂上讲的,C++编程语言的四个基本准则,及其具体的体现,整理成一篇CSDN博客。
一、最高准则:无二义
这个准则,不仅是C++的准则,更是所有类型编程语言的最高准则。或者说,更是任何逻辑体系的最高准则,如数学领域。
二义性:即语言的表达使得理解该语言时会形成两种不同甚至是矛盾的理解,这就是语言的二义性。而在计算机语言中,一些二义性的表达会使得程序出错甚至是崩溃。而无二义性就是只有一种理解。
(1) 运算符的优先级与结合性。
由于计算机语言的特殊性,一些我们人为规定好的东西计算机是无法理解的,比如
int main(){
int a = 1, b = 2, c = 3;
a = b = c;
cout << a <<" "<<b<< " " <<c<< endl;
}
我们会考虑是将a赋值给b、c还是将c赋值给a、b。在c++中,赋值是从右向左进行 ,即将c赋值给b,再赋值给a,这样有效的避免了运算时的二义性。
(2) 标识符不能以数字开头
如果标识符以数字开头的话,计算机在读取到第一个非数字时就苏姚回溯到之前去判断这究竟是一个变量还是一个语法错误,会使得计算机的效率变慢。如果标识符全部都是数字,也会产生二义性。
int main(){
/*此处代码错误,用于演示二义性的出现
int 12345,a;
12345=2;
a=12345;/*
}
这样的话,会使得计算机无法理解a=12345还是a=2。
(3) 贪心规则
计算机会尽可能多的结合有效符号,而不管其是否合法。
例如
int main(){
int a = 1, b = 2, c,d,m=1,n=2;
c=a+++b;
d=m--n;//计算机执行到m--后无法识别n,所以导致编译出错。
cout<<"a=" << a <<" b="<<b<< " c=" <<c<< endl;
}
计算机会将其识别为“a++ +b”还是“a+ ++b”呢?我们发现最后的结果是
a=1 b=2 c=3
即将其理解为“a++ +b”,意味着编译时从左向右读取,利用贪心准则尽可能多的读取运算符后再进行运算。而由于贪心法则,计算机不会将d识别为"m-(-n)",导致出错。
(3) 头文件的调用
在调用头文件时,我们会用到两种文件,一种是自己定义的头文件,一种是C++库中的头文件。如果二者重名会怎么调用呢?例如
#include<cmath>
##include(cmath.h)
二者都是调用 cmath.h库。但是第一个调用的是C++的公共库里面的代码,而第二个则是调用我们自己定义的头文件。所以一般情况下调用公共库时我们用#include<>;而调用自己定义的头文件时用#include();如果用的是#include<>时,计算机会先查询自己定义的头文件,如果没有发现则会再到公共库里面去查找调用。
二、第二准则:高效性
如果拥有A和B两种执行方法,在不违背无二义准则的前提下,如果A比B高效,则C++会自动选择A执行。
(1) 数组下标0索引。
例如数组的0索引和1索引。如果采用1索引,那么会导致在每一次数组的索引时就需要将数组的地址减去1,导致效率降低。
(2) 逻辑短路
我们知道a&&b,当a和b 有一个为假时就返回为0,所以当计算机判定a为假时就不会去再进行b的运算。(同理还有 || 的运算)
三、符合日常习惯
一套编程规则,本身就是创建一套完整的新规则,只需要让新规则自洽即可。所以说一般情况下C++中的代码都是符合日常习惯的。例如代码
int main(){
int a = 1, b = 2, c=3,d;
d=a+b*c;
cout << d << endl;
}
这时输出的d就是7,与我们日常生活中的运算方式相同。
四、相似相同规则
在C++中,许多定义是类似的,如变量的初始化(等号、括号)、数组的初始化(花括号),以及二者的赋值。而指针的本质也是变量,所以指针的初始化也可以使用变量的初始化,例如
int main (){
int a=1,b(2),c{3};
int *p=&a,*q(&b),*m{&n};
}
代码的运行结果如下
我们可以发现,这些都是可以正常运行的,这也就体现了我们的相似相同法则。