C++四个基本准则及其具体体现

C++编程语言的四个基本准则分别为无二义性(最高准则)、高效性(次高准则)、合乎日常习惯(第三准则)、相似相同原则(补充准则)。关于次四个基本准则的具体体现详细讨论如下:

一、最高准则:无二义性

这条准则不仅仅是C++的准则,更是所有编程语言的准则。无二义性指的是C++语言在编程时,不存在两种不同的执行方式,每条语句对计算机而言只有一种执行操作。计算机的计算理解方式不同人脑,人脑会对接收的信息进行筛选处理而尽可能消除歧义,而计算机在运行有两种或多种意义的编程语言时因无法选择而出现错误。

1. 无二义性准则的具体体现

  •  运算符的优先度与结合性

(1) 运算符的优先度大致与算数运算符的优先度相同,即“先乘方,再乘除,后加减,有括号先算括号里面的”。如下图所示的代码块,计算结果将会是33,而不是48或是其他。

int a = 3+5*6
cout << a << endl;

另一个典例就是后缀运算符的优先级比一元运算符*高,这意味着加号运算符将对str进行操作,而不会对*str进行操作。也就是说,将指针加1,结果是使其指向下一个字符,而不是修改被指针指向的字符。

char *str = "Hello World";
char ch = *str++;

在上例中,由于++是后缀形式,因此将在将*str的值赋给ch后,再将指针加1。因此上述代码将字符H赋给ch。然后移动指针str,使之指向字符e。 

(2)运算符的结合性是指同一优先级的运算符在表达式中的操作方向。例如 1-2+3 的运算顺序是先减后加,而不是先加后减;又如x=y=z 的赋值顺序是先将z的值赋给y,再将y的值赋给x。

  •  标识符不能以数字开头

这是最高准则——无二义性的体现。若标识符以数字开头,那么计算机将无法判断其为一个数字还是一个常量,这样的话就会出现二义性。

  •         贪心规则

这同样也是最高准则——无二义性的体现。 贪心规则即指在对问题求解时,总是做出在当前看来是最好的选择。即当有多种可行解决路径时,计算机总会寻找最短路径,这在一定程度上也是最高准则“无二义性”的体现。较为典型的是《算法导论》中的“活动选择问题”与“区间调度问题”。

二、次高准则:高效性 

 1.数组下标0索引

 数组是一段连续的空间。下标的含义为当前元素到第一个元素的偏移量。那么第一个元素的下标自然就是0,第二个元素的下标为1,依次类推第n个元素的下标为n-1。数组是存储在一片连续的内存空间中,编译器可以直接通过第一个元素的地址(即数组地址)和相应元素的下标(即距首元素的偏移量)来得到其相应的地址。

如果数组索引从0开始,则a[i]的地址=首地址+i*每个数据所占长度;

如果数组下标从1开始,那么a[i]的地址=首地址+(i-1)*每个数据所占长度。显然计算机需要多进行一次减法操作(详见参考文章)。这体现了其高效性。

 2.逻辑短路

 逻辑短路主要见于“或”、“与”、“非”的逻辑计算中。

// &&(与逻辑运算符) 有0为0,全1为1
0 && 0 = 0
0 && 1 = 0
1 && 0 = 0
1 && 1 = 1
// || (或逻辑运算符) 有1为1,全0为0
0 || 0 = 0
0 || 1 = 1
1 || 0 = 1
1 || 1 = 1
// !  (非逻辑运算符) 反转,1变为0,0变为1
!0 = 1
!1 = 0
# 异或   相同为0,不同为1
# 同或   相同为1,不同为0

&&(和逻辑运算符)运算,当前面为0时,后面部分不进行计算,发生短路;||(或逻辑运算符)运算,当前面为1时,后面部分不进行计算,发生短路。这样保证了程序计算的高效性。 

三、第三准则:合乎日常习惯

对于一种编程语言,设计的目的之一应该是方便人们使用。参考编程语言Python,Tim Peter撰写的“Python之禅”中就阐明了编程语言应该方便人们使用,尽可能便捷。

同样在编写程序时C++的语法规范要适合程序员使用,为其带来便利。下面列举几个典型示例。 

(1)运算顺序 

在运算C++程序时,对于同级运算符,其运算顺序是由左至右的(这与数学运算习惯一致)。程序运行顺序也是从上到下、由左至右的(这与人们日常阅读习惯一致的) 

 (2)数组下标索引

对于二维数组a[1][2],其表示索引数组a的第一行第二列,符合人们日常使用及阅读习惯。

(3)变量的命名以及注释 

在变量第一个字符必须是字母或下划线,以及关键字限制外,变量命名的自由度使得程序员可以通过变量的实际意义来命名,以达到既成功创建一个变量,又能清晰地明白变量的意义。例如在设计学生成绩管理系统时可以使用student_score来储存/接收用户输入的“学生成绩信息”;使用“Chinese”来储存/接收用户输入的某学生的语文成绩。 

此外,在团队合作编写大型项目代码或隔段时间重新编写以往代码时,注释的功能使得程序员之间的协作效率及程序员直接的阅读代码效率得到提高。且C++注释格式较为简单,常用的注释格式为//与/*。 

四、补充准则:相似相同准则 

 在C++语言中,如果有两个不同的对象具有相似的行为,那么C++会为这两个对象额外增加对方的行为,使得这两个不同对象具有对方的相同行为。通俗来说,就是若有两个不同的对象A与B,且其分别有行为a与b。当行为a与b相似时,C++则自动为A增加行为b,为B增加行为a,即A、B共同拥有行为a、b。这有利于程序的简化。下面介绍一些该准则的具体体现。

(1) 初始化

 C++有三种初始化方式,即等号初始化、括号初始化与列表初始化。

// 等号初始化
int a = 5;
int k = a;
// 括号初始化 
int k(5);
int k(i);
// 列表初始化
int j{i};
int j{5}'
int j={i};
int j={5};

括号初始化是变量与对象之间的“相似相同规则”;列表初始化是变量与数组之间的“相似相同规则”。本质上是C++将变量、对象及数组统一对待的原则的产物。

  • 变量初始化 

定义变量a=1时,一般为int a = 1;但也存在 int a(1);的情况(括号的初始化,形似对象的初始化),此外还有 int a ={1} (形似数组的初始化)以及 int a = ({1})这样的初始化形式。

// 一般形式的初始化格式
int a = 1;
// 括号的初始化,形似对象的初始化
int a(1);
//形似数组的初始化
int a{1};
//其他初始化格式
int a=({1});
  •  数组初始化

 对于数组a[5],其初始化一般为a[5] = {};(中括号内不填,则默认初始为0;也可以依次填入数据进行初始化)。在C++11标准中,初始化可以直接a[5]{};(数组与变量的相似相同)。

  • 引用初始化

所谓引用,相当于给变量起个别名。如int a=5;int &b=a;,值得注意的是,引用必须在定义时进行初始化。对于引用的初始化,除了有int &b=a;也有int &b(a);(引用与变量的相似相同规则) 。

  • 指针初始化

指针本身就是变量。因此,变量具有的行为,指针同样都会有且只会多不会少。变量有八种初始化形式,因此,指针必然也会有八种初始化形式。 

 (2)数组与指针赋值

 以对下标为5的数组赋值为例:

int a[10], *p = a;

通过指针访问,应该写为:

*(p + 5) = 3;

通过数组访问,应该写为:

a[5] = 3; 

根据相似相容原则,此时应有如下四种写法,即指针学会了数组的写法,数组学会了指针的写法。

*(p + 5) = 3;
a[5] = 3;
*(a + 5) = 3;
p[5] = 3;

以上即为上课所学知识,若有错误之处敬请斧正!为尊重参考文章的作者的知识成果,本文参考之处已设置超链接且链接至原文。

  • 24
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值