《程序设计实践》读书笔记-(一)风格

1.1 名字

1.名字的长短
全局函数、类和结构: 应该以说明性文字,表明其在程序中的角色。
局部变量: 极短的名字即可

2.保持一致性
(1) 类成员的名字,不必再提及类名,例如:quene.Nurse() 比 quene.queneNurse()
(2)函数名用动作性的动词,后面可以跟着名词,例如:date.getTime() 中的 getTime
(3)返回布尔值类型的函数名,要能够表达意思,例如:isInt()、isSmaller()
(4)函数名与实现功能要一致

1.2 表达式和语句

1.缩行显示程序的结构
(1)例如: for 循环中(初始句,判断句,运算句)中,都用赋值语句,将运算放入循环体中
(2)增加换行

2.使用表达式的自然形式
(1)在 if (语句) 的语句里,尽量不出现否定判断,例如:if ( ! (a>0) ) 改为 if ( a<0 )

3.用加括号的方式排除二义性
(1)多个运算符和变量时,加括号来分组,不管是否必要

4.分解复杂的表达式

5.要清晰

6.当心副作用
(1)增量,不要做多次连续赋值,例如:Str[ i++ ]=Str[i++]=’0’
(2)输入函数,不要在同一个scanf中引用输入,例如:scanf( “%d %d”,& yr ,& time[yr] )

超链接:

1.运算符: ?:
条件运算符(?:)是C 语言中唯一的一个三目运算符。
由条件运算符组成的条件表达式的一般形式为:表达式1 ? 表达式 2 : 表达式 3
其中表达式 1、表达式2、表达式3,既可以是一个简单的表达式,又可以是由各种运算符组成的复合表达式。
计算过程很好理解:
先求表达式1的值, 如果为真, 则求表达式2 的值并把它作为整个表达式的值。 如果表达式1 的值为假, 则求表达式3 的值并把它作为整个表达式的值。

2.运算符: >>
这是C语言中的“右移运算符”。一般情况下,他是按位操作。
特点:1.双目运算符,就像+、-、*、/一样,格式为(数1)>>(数2)
2.数1是被操作数,如被减数、被除数等;数2是右移位数。
3.优先级低,结合性:从左向右运算
如:8>>1=?表示将被移数向右移动1位

如何操作?
1.化十进制数为(注意了)对应的二进制数,对应指格式对应
2.通通右移,不足补0
3.化为十进制数

举例:short int a=8;a=a>>1;
1.a=0 000 1000
2.右移一位后:a= 0 000 100
3.补0:a=0 000 0100
4.化为十进制数:a=4

举例:int a=8;a=a>>1;
1.a=0 000 0000 0000 1000
2.右移一位后:a= 0 000 0000 0000 100
3.补0:a=0 000 0000 0000 0100
4.化为十进制数:a=4

1.3 一致性和习惯用法

1.使用一致的缩排和加括号风格
(1) if 紧接着 if 的话,加上 { } 消除歧义
(2) if 后面单独语句, 不需要加 { }
例如:
if ( month==FEB ) {
if ( day==3)
return 1;
}
else
return 0;

2.为了一致性,使用习惯用法
(1)习惯的循环赋值方法(递增在循环条件中以++实现,保证结束循环时的数值已知)
例如:

for( i=0 ; i<n ; i++)
    array[ i ]=1.0;

(2)C++ 和 JAVA 中将循环变量的声明放在 for 里面也可以
例如:(扫描链表的标准循环)

  for( p=list ; p != NULL ; p=p->next)
  …

(3)对于无穷循环的习惯,不使用其他形式
① for ( ; ; )
② while( 1 )

(4)常见的另一个惯用法是把一个赋值放进循环条件里
例如:

  while( ( c=getchar() ) !=EOF )
    putchat(c);

3.用else - if 表达多路选择

超链接

1.语句 : strcpy
原型声明:char strcpy(char dest, const char *src);
头文件:#include

void main(){
char a[20] , c[]="i am teacher!";
strcpy( a , c );
}

1.4 函数宏

1.避免函数宏
(1)如果一个参数在定义中出现多次,它就可能被多次求值

2.给宏的体和参数都加上括号
(1)类似替换文本,可能会造成运算符的优先级问题

1.5 神秘的数

1.给神秘的数起个名字
(1)将类型屏幕参数用HEIGHT、WIDTH等来表示

2.把数定义为常数,不要定义为宏
(1)使用 const(C++)或者 final(JAVA)声明某些变量

3.使用字符形式的常量,不要用整数

4.利用语言去计算对象的大小
(1)比如:比较字符时,65 直接写成‘A’
(2)但最好不使用(1),C++可以采用 isuper( c ) ,JAVA可以采用 Character . isUperCase( c )

5.利用语言去计算对象的大小
(1)例如,我们应该用size of(int) 而不是 2或 4。同理,写 size of( array [ 0 ] ) 可能比size of( int ) 更好,因为即使是数组的类型改变了,也没有什么东西需要改变。
(2)C++中没有 .length 语句,但可以用宏定义数组元素数

#define NELEMS( array ) ( sizeof(array)/sizeof(array [0]) )

超链接

1.语句: const
(类似于JAVA中的 final )
定义:const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
主要作用:
(1)可以定义const常量,具有不可变性。
例如:const int Max=100; Max++会产生错误;
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
例如: void f(const int i) { ………} 编译器就会知道i是一个常量,不允许修改;
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可

1.6 注释

1.不要大谈明显的东西

2.给函数和全局数据加注释

3.不要注释差的代码,重写它

4.不要与代码矛盾

5.澄清情况,不要添乱

1.7 为何如此费心?

在这一章里,我们谈论的主要问题是程序设计的风格:具有说明性的名字、清晰的表达
式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和
惯用法的重要性。没人会争辩说这些是不好的。
但是,为什么要为风格而煞费苦心?只要程序能运行,谁管它看起来是什么样子?把它
弄得漂亮点是不是花费了太多时间?这些规则难道没有随意性吗?
我们的回答是:书写良好的代码更容易阅读和理解,几乎可以保证其中的错误更少。进
一步说,它们通常比那些马马虎虎地堆起来的、没有仔细推敲过的代码更短小。在这个拼命
要把代码送出门、去赶上最后期限的时代,人们很容易把风格丢在一旁,让将来去管它们吧。
但是,这很可能是一个代价非常昂贵的决定。本章的一些例子说明了,如果对好风格问题重
视不够,程序中哪些方面可能出毛病。草率的代码是很坏的代码,它不仅难看、难读,而且
经常崩溃。
这里最关键的结论是:好风格应该成为一种习惯。如果你在开始写代码时就关心风格问
题,如果你花时间去审视和改进它,你将会逐渐养成一种好的编程习惯。一旦这种习惯变成
自动的东西,你的潜意识就会帮你照料许多细节问题,甚至你在工作压力下写出的代码也会
更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值