无二义性指每条编程语句只能存在一个含义,且只能有一种执行方式,并最终产生一种结果。无二义是所有编程语言的最高准则,更是所有逻辑体系的最高准则。
决定表达式的运算顺序时,应先看运算符优先级,优先级高的先运算;当优先级相同时,再看其结合性。
优先级是为了消除诸如3+4*5的表达式,是应当被当作(3+4)*5还是3+( 4 * 5)的二义性而设定的规则。由于乘法的优先级比较高,所以先执行乘法,之后进行加法,即应执行为3+(4 * 5)。
例如
int x =3*4+5; cout << x << endl;当优先级相同时,则看结合性。结合性按不同的运算符号决定他们是左结合还是右结合。如3+4+5,都是“+”号,由于“+”为左结合,故应执行为(3+4)+5。 例如
int x =3+4+5; cout << x << endl;下表为不同运算符的优先级与结合性。
当标识符以数字开头时,容易造成二义性,例如
int 2d = 12; double a = 2d;会存在a究竟解释为12.0,还是应该解释为2.0的问题。
另外,代码在读取过程中,会通过词法分析器从左往右进行,逐个字符的匹配理解,若出现123y,则需读取到y后回溯,以确定123y内的123究竟是标识符还是数字,这降低了编译器的性能,增加了词法分析器的复杂度。1
贪心规则指每个符号应该包含尽可能多的字符,也就是说,我们的编译器将程序分解成符号的方法是,从左到右一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,然后在判断已经读入的两个字符是否有可能是一个符号或者一个符号的组成部分,如果可能则继续读入下一个字符,然后重复整个过程,直到读入的字符组成的字符串已不再可能组成有意义的符号。2
因此,贪心规则保证了程序语句只有一个确定的意义,达到了无二义的要求。
高效性可以节省程序运行时间和空间,以保证程序运行的快速高效。
数组下标的索引可以理解为数据位置的偏移量,a[0]即首地址偏移量为0,a[1]即在首地址的基础上偏移1。
因此,以0为起始索引,之后的下标i只需在首地址上每次偏移i,例如a[3]的位置为首地址偏移3,即3 = 0 + 3 ;
若以1为索引,则需要偏移 i - 1,多做了一次减法运算。仍以a[3]为例,此时为首地址偏移2,即3 = 1 +(3-1)。这样的操作使得程序运算增多,降低了运行效率,不符高效性的原则。
此外,MATLAB语言下标从1开始,是由于其侧重于矩阵运算。而矩阵元素是从1开始的。因此符合了矩阵的常规。
逻辑短路主要体现在“或” “与”逻辑计算中,即仅计算一部分表达式即可得到结果。
在“与”中,当表达式a&&b中a为False时,b不会计算;
在“或”中,当表达式a||b中a为True时,b不会计算。
例如,当计算除法时,0 && n / m,即可避免0作被除数。
一套编程规则,本质上为创建一套新的规则,而该规则最终提供给程序员所使用,因此需合乎日常习惯,以带来便利。
数学计算中,乘法与除法优先于加法与减法计算,同样在C++语言中,乘除的优先级先于加减。
日常生活中阅读方向由左到右,C++中程序的读取也是由左到右。
C++中,我们可以用一个整数给一个实数赋值,这叫合乎日常习惯。
C++语言中,当有两个不同的对象A与B,其分别有行为a与b,当行为a与b相似时,C++则自动为A增加行为b,为B增加行为a,即A与B都拥有共同的行为a、b。
C++变量初始化有三种方式:等号初始化、括号初始化、列表初始化。 括号初始化是变量与对象之间的“相似相同原则”; 列表初始化是变量与数组之间的“相似相同规则”;
先看以下例子,将下式中下标为5的数组进行赋值
int a[10],*p=a;通过指针访问时,应写为*(p+5)=3;; 通过数组访问时,应写为a[5]=3;;
根据相似相容原则,此时应有如下四种写法,即指针学会了数组的写法,数组学会了指针的写法。 *(p+5)=3; a[5]=3; *(a+5)=3; p[5]=3;
浅谈标识符不能以数字开头的原因 ↩︎
贪心法-c语言的规则 ↩︎