无二义性是任何一门逻辑科学应该遵循的基本准则。数学界的三次数学危机,本质上就是为了消除“二义性”的争端。 准则的具体体现: (1)运算符的优先级和结合性 优先级是为了消除诸如3+4*5 的表达式,是应该被当作(3+4)*5还是3+(4 * 5)的二义性而制定的规则。 例如:括号的优先级高于加减乘除
int x = 3+4*5 ; // 此时 x = 23 int x = (3+4)*5 ; // 此时 x = 35** (2) 标识符不能以数字开头** 假设标识符能以数字开头,那么诸如“0123”、“0x19A”这类“标识符”就无法被区分是常量还是变量。这条规则的制定很好地消除了此类二义性。
(3)贪心规则
对这个准则的理解:在C++被创造的年代,计算机的性能普遍较低,不同现在得益于制程的发展CPU具有较高的性能。因此,计算机性能是一个重要的制约因素,是当时情境下的“主要矛盾”。在不违背“无二义性”的规则时,C++语言会选择更为高效的语法规则作为标准语法 (1):数组的下标0索引 数组是一段连续的空间,要求a[i]就是求它的地址,然后找到它。如果从0开始,则a[i]的地址= 首地址 + i*数组中每个元素所占的长度;如果从1开始,则a[i]的地址= 首地址 + (i-1)*数组中每个元素所占的长度。显然以0索引的方式可以更高效地计算。
&a[i] = &a[0] + i*sizeof a[0] ; // 当0为索引时 &a[i] = &a[0] + (i-1)*sizeof a[0] ; //当1为索引时(2) : 逻辑短路 逻辑短路规则为对于表达式a&&b 当a为假时,b不会计算
#include <iostream> using namespace std; int main() { int a = 1; cout << "a = " << a <<endl; false && (a=3); cout << "a = " << a <<endl; }运行结果为:
对这个准则的理解:任何编程语言最终都是给人用的,如果创造一套不符合日常习惯的规则,会给使用带来极大的不便性,这不仅不利于语言的使用,同时也会影响语言的生存。 (1):C++中的语句都由类英文语句组成 用英文单词的拆分和组合构成语句,不仅简洁,更利于人们的记忆。
对准则的理解:C++语言中,如果有两个不同的对象A与B,A有行为a,B有行为b,如果a与b两种行为在逻辑上具有相似性,则C++会为对象A额外增加一个行为b,也会将对象B额外增加一个行为a。 (1):C++语言中的初始化
int k = 5 ; // 等号初始化与括号初始化是传统形式的初始化 int k (5) ; // 括号初始化,是变量与对象之间的“相似相同规则 int k = {5} ; // 列表初始化,是变量与数组之间的“相似相同规则本质上,是C++将变量、对象及数组统一对待的原则的产物
