读书笔记===C专家编程[2]

本文探讨了 C++ 语言的三大缺陷:多做之过、少做之过及误做之过,并深入分析了 C++ 相较于 C 语言未能解决的基本问题,如 switch 语句的 fallthrough 特性、相邻字符串常量自动连接及缺省全局作用域等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程语言缺陷可归为3类:p28

  1. 不该做的做了;== 多做之过
  2. 该做的没做;== 少做之过
  3. 该做但做的不合适;==误做之过

表示 挺废话的。。。。
C++语言令人失望的原因:

  1. 对标C语言,确对C语言中存在的一些基本问题没有什么改进;
  2. 于C语言脆弱的类型模型之上,建立类的概念;

多做之过

即C语言中存在某些本不应该存在的特性。包括:switch语句、相邻字符串常量的自动连接、缺省全局作用域。

switch-case语句(p29)

1、switch的左花括号之后的声明的一些变量,由于不会被执行,所以对其赋予初始值是无意义的。
2、fall through特性:
switch语法:

switch(表达式){
	 default:
       如果表达式的值和以上的case后面的值都没有匹配上,那么就执行这里的代码。
       break;
     case 值1:
       表达式的值和 值1匹配上了,需要执行的代码;
       break;
     case 值2:
       表达式的值和 值2匹配上了,需要执行的代码;
     break;
     case 值3:
       表达式的值和 值3匹配上了,需要执行的代码;
     break;
   }
* */
* //不写break会穿透到下一个break

明确下:
default语句,可以放于其内的任意位置;
break 跳出switch语句或最近的一层循环语句;
也许switch最大的缺点,就是它不会在每个case标签后面的语句执行完毕后自动终止。一旦执行某个case语句,程序将会依次执行后面所有的case,除非遇到break语句。==fall through特性。。。。
如还有疑问,见p32页的代码。

相邻字符串常量的自动连接

ANSI C引入的新特性:相邻字符串常量的自动连接。这就省略掉了过去在书写多行信息时,必须在行末加“\”的做法。
省事儿的代价是:字符串数组在初始化时,如果漏掉一个逗号,编译器不会报错,反而悄无声息的把相邻字符串给合并了。结果也就大相径庭。

缺省全局作用域

对于一个声明的函数,如果不加任何的修饰符,则是全局可见的。
function work(){//全局可见}
extern function work1(){//在任何地方可见}
static function work2(){//这个文件之外不可见,限制了其作用范围}
extern:用于函数定义,表示全局可见(属于冗余的)。用于变量,表示它在其他地方定义。
static:在函数内部,表示该变量的值在各个调用间一直保持延续性;在函数这一级,表示该函数只对本文件可见。
根据经验,这种缺省的可见性被多次证明是个错误。对象在大多数情况下应该采用缺省的可见性。如果要让它全局可见,应该采用显示的手段来进行注明。
该特性会与c语言的打桩特性(interpositioning)相互产生影响。
打桩特性:用户编写和库函数同名的函数并取而代之的行为。
缺省全局作用域==作用域过宽,引发的问题常见于库中:“all-or-nothing”,一个符号,要么全局可见,要么对其他文件都不可见。c语言中,对于信息可见性的选择就是如此有限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值