文章目录
C++编程语言的四个基本准则
一、最高准则:无二义性
对这个准则的理解:编程语言于计算机而言,通俗地说就是指令,若一个指令出现歧义,计算机则会无法判断该执行哪一种。倘若执行了其中一种,则可能与本来所需要的结果相悖,不符合实际需求。所以,编程语言的无二义性,可以使得我们的编程语言更规范更安全。编程语言于程序员而言,则是“程序员间交流的语言”。而程序员们,通过抛弃双方各自的自然语言而使用编程语言,这么做的目的,正是为了无二义性。
准则的具体体现:
1.运算符的优先级与结合性
优先级:当一个表达式中出现了多个运算符时,则按照等级排列的运算顺序进行计算。当运算符的优先级相同时,则看其结合性。
示例:
int x = 3 + 4 * 5;
根据运算符的优先级,先进行4*5的运算,得到20,再进行3+20的运算,得到23,最终赋值给x为23。
结合性:指相同优先级的运算符在同一个表达式中,且没有括号的时候,运算符和操作数的结合方式,通常有从左到右结合和从右到左结合两种方式。
示例:
#include <iostream>
using namespace std;
int main()
{
int a, b = 1, c = 2;
a = b = c;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
system("pause");
}
我们发现,这个表达式只有赋值符,这样优先级就无法帮助我们决定哪个操作先执行,是先执行b=c呢,还是先执行a=b?如果按前者,a的结果为2,如果按后者,a的结果为1。
所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,先将c的值2赋给b,使得b的值为2,然后b再赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。所以,遇到一个表达式时,先根据运算符的优先级将表达式拆分成几个子表达式,然后在每个子表达式中根据运算符的结合性来进一步确定执行的顺序。
2.标识符不能以数字开头
计算机不能像人一样一眼读懂一个单词,他必须一个字符一个字符的去匹配识别。因此每次输入头符号时要判断该符号是数字还是字符,若是数字则可以直接跳到数字处理模块,若是字符则与关键字进行匹配,判断是关键字还是标识符。
示例:
int 2d = 12;
double a = 2d;
如果标识符可以以数字为开头,那么 a究竟解释为12.0,还是应该解释为2.0?这就产生了二义性,不满足最高准则。
3.贪心规则
贪心规则指C++的每个符号应该包含尽可能多的字符,也就是说,我们的编译器将程序分解成符号的方法是,从左到右一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,然后再判断已经读入的两个字符是否有可能是一个符号或者一个符号的组成部分,如果可能则继续读入下一个字符,重复整个过程,直到读入的字符组成的字符串已不再可能组成有意义的符号,但前提是符号的中间不能嵌有空格。
示例:
#include <iostream>
using namespace std;
int main()
{
int a = 2;
int b = 3;
int c = a+++b;
cout << c << endl;
system("pause");
}
若没有贪心规则的话,c的结果是(a++)+b=5还是a+(++b)=6呢?有了贪心规则后,我们就可以知道答案是前者,即5,而不是6。
4.其他
else总是与离其最近的if配对、头文件中不能出现全局变量的定义等。
小结: 以上实例就是为了消除编程语言的二义性,使得整个表达式,整个程序在运算时能够有条不紊地进行,也使得程序员们阅读代码时更加方便。
二、次高准则:高效性
对这个准则的理解:C++语言刚刚出现时,计算机性能普遍偏低,实现一些时间复杂度较高的程序就会耗时很久。受限于这个因素,当时的人们只能通过优化语言的结构来使得程序更顺利运行。说到这里,我想顺便提一件有趣的事,有人说学编程就应该买个性能一般的电脑,这样就可以逼着自己不断优化算法。不过随着现在的发展,计算机的性能也越来越好,对于这个次高准则的要求也没那么高了,但追求高效总归是没错的,能少操劳点电脑就少操劳点吧。
准则的具体体现:
1.数组下标0索引
下标0索引其实本质上是为了提高计算时的效率,程序在取第i个变量的地址时,若下标1索引,则每次运算时都要多减去1。用下标1索引的话,可能更合乎日常习惯,但下标0索引更符合次高准则高效性,故在C++中选择以下标0索引。另外,若把数组a[i]中的i理解为与首地址的偏移量,实际上就会发现,下标0索引更适合。若i=0,与首地址偏移量为0,即为首地址本身。
2.逻辑短路
逻辑短路是对于逻辑运算而言,是指仅计算逻辑表达式中的一部分便能确定结果,而不需对整个表达式进行计算的现象,从而使得代码更加高效,减少了一些不必要的运算。
对于“&&”运算符,当第一个操作数为false时,将不会判断第二个操作数,因为此时无论第二个操作数为何,最后的运算结果一定是false,故直接短路;
对于“||”运算符,当第一个操作数为true时,将不会判断第二个操作数,因为此时无论第二个操作数为何,最后的运算结果一定是true,故也直接短路。
示例:
#include <iostream>
using namespace std;
void main()
{
bool x = 3 > 4 && 5 > 4;
cout << "x=" << x << endl;
bool y = 4 >3 || 3 < 2;
cout << "y=" << y << endl;
system("pause");
}
运行结果为:x=0 y=1
3.其他
C++利用指针,引用,内联函数等提高了程序的运行效率。
三、第三准则:合乎日常习惯
对这个准则的理解:编程语言本身就是给程序员使用,程序员之间交流的一种语言,一套不合乎日常习惯的规则,则会给程序员带来极大的不便性。都说养成习惯难,但改掉习惯也很难!合乎日常习惯则可以让程序员们进行交流时更方便,更高效。
准则的具体体现:
1.变量命名
编程语言的变量命名,一般讲究用最短字符表示最准确的意义,良好的代码习惯可以使得程序员之间的交流更加方便。
示例:
//以常用整型变量为例
int nId; //int前缀:n
short sId; //short前缀:s
unsigned int unId // unsigned int 前缀:un
long lId; //long前缀:l
2.运算的优先级
在数学中,“先乘除后加减,有括号先括号”的计算顺口溜,在C++中也是如此,符合日常习惯,给编写带来了极大方便。
四、补充准则:相似相同规则
对这个准则的理解:该准则在C++中体现十分明显,如果有两个不同的对象A与B,A有行为a,B有行为b,如果a与b两种行为在逻辑上有相似性,则C++会为对象A额外增加一个行为b,也会对应对象B额外增加一个a行为。
准则的具体体现:C++的三类初始化方式
1.等号初始化
int j=2;
int j=i;
2.括号初始化
int j(2);
int j(i);
3.列表初始化
int j{i};
int j{2};
int j={i};
int j={2};
五、结语
不同编程语言的准则可能有所不同,但大多相似于C++这四个基本准则。由于时间原因,还有许多示例在文中并未展示,也还有一些是笔者自身也还没碰到的,但相信在进行整理了这些概念后,下次再碰到示例时,就会有一见如故的感觉。笔者也算是小白,若文章中有什么问题,还请指正,谢谢!