无二义性这个准则应该是所有语言中最重要的准则,即一门高级语言的设计,其首要考虑的问题就是如何消除二义性。 而所谓的二义性简单点来说就是在同样的语句中,可以有不同的理解。例如:3+45这个式子中如果没有说明前,你可以理解为先45然后再加3,也可以理解为3+4后再乘5。 在没有做出说明前,这个语句就是有二义性的,而当一们高级语言定义了运算符的优先级后(*/的优先级高于±),这个语句的理解就是唯一的。 综合还说,无二义性就是消除二义性的意思,而高级语言中的无二义性就是消除语法规则以及语句中的二义性,即每个语句、每一个语法的执行都是唯一的。 在语言C++中,很多语法规则的设定都是为了消除二义性而存在的。例如:变量名不可以用数字为开头。 因为当变量名可以以数字为开头的时候我们在理解某些变量名时会产生歧义:"10"是变量呢还是整型数值呢?“3E10”是数值呢,还是变量呢?而当我们规定变量名不可以用数字开头时,这种情况的二义性就解决了。 而贪心规则也是如此,也主要是为了规避二义性。
这个准则就比较好理解,当我们完成了消除二义性的任务之后,我们首要解决的问题就是高效性。 一门计算机语言面向的对象是程序员,而程序员是要干活的,如果一门计算机语言的语法规则晦涩难懂,使用繁琐,那么使用者在使用时的效率就会降低。在这个讲究效率的社会上,低效终将是要淘汰的。就像是我们使用车去拉货,当我们确保这辆车能动且安全(无二义性)的时候,我们就要考虑这辆车一次能拉多少货,跑得快不快的问题。 而在C++中也有许多语法规则或者规定是为了程序编写和运行的高效性而存在。 较为典型的就是:既然有了while(){}循环,为什么还要有for(){}呢? 为什么c语言中已经有了printf()和scanf()的输出输入语句,而“升级版”的C语言,C++中还要有cin和cout呢?其根本原因还是在于后者编写更方便。 其中关于C++体现执行高效性的有:数组下标以0开始而不是以1开始。 在计算机内存中,数组的空间是一段连续的空间,而当我们需要用到数组中某个数值时,计算机就需要检索查找数组中没目标数值的地址。 如果数组下标从0开始,那么数组中如a[I]的地址就为数组首地址(a[0])+i*单个数据所占地址。 如果数组下标从1开始,那么数组中如a[I]的地址就为数组首地址(a[0])+(i-1)*单个数据所占地址。 这时,下标从1开始的数组检索数组成员时的运算就比从0开始的。即数组下标从0开始,执行起来更加的高效。 但是值得注意的是,并非所有的语言都一味的追求极致的高效性,如R语言中数组下标就从1开始。
这个规则也比较容易理解,当一门高级语言满足了无二义性且满足了一定的高效性时,C++的语法规则就要满足合乎程序员的日常使用习惯。高级语言的对象是编写程序的人,如果其语法规则和规定不合乎使用者的习惯,那将给使用者带来非常大的不便。例如如果语法规则规定在进行算术运算时先加减后乘除,那将会给使用者带来非常大的不便。 而先乘除后加减,有括号先算括号这类语法规是符合使用者的理解习惯的,运算符优先级的规定也在一定程度上体现了合乎日常使用这个准则。 除此之外还有高维数组的定义及使用a[m][n]其中m代表行数,n代表列数。而高维数组在存储结构中的存储是连续的,如a[m][0]与a[m-1][n-1]是紧邻的。即本质上来说所有高维数组都是一维的数组。而语法规则中规定了高维数组的使用也是为了合乎使用者的日常理解和使用习惯。
C++中相似相同准则则没有前面三个还准则那么重要,这个准则在C++中对象的使用哪里有所体现。 例如,有两个不同的对象A、B,A有行为a,B有行为b,如果a与b两种行为在逻辑上有相似性,则C++会为对象A额外增加一个行为b,也会为对象B额外增加一个行为a。这种规则可以有效的减少编译器的工作量。 例如:int a[5]={1,2,3}; 则数组a未赋值的空间,编译器则自动为其赋值。 函数重载也在一定程度上体现了相似相同准则。