摘要:
函数的功能要单一,不要设计多用途的函数。 阅读全文
摘要:
在函数体的“出口处”,对 return 语句的正确性和效率进行检查。 如果函数有返回值,那么函数的“出口处”是 return 语句。 我们不要轻视 return 语 句。如果 return 语句写得不好,函数要么出错,要么效率低下。 阅读全文
摘要:
在函数体的“入口处”,对参数的有效性进行检查。 阅读全文
摘要:
如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传 递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出 错。 阅读全文
摘要:
有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达 , 可以附加返回值。 阅读全文
摘要:
不要将正常值和错误标志混在一起返回。 正常值用输出参数获得 ,而 错误标志用 return 语句返回。 C标准库函数的设计者为什么要将 getchar声明为令人迷糊的 int 类型呢? 他会那么傻吗? 在正常情况下,getchar 的确返回单个字符。 但如果 getchar 碰到文件结束标志或发 生 阅读全文
摘要:
函数名字与返回值类型在语义上不可冲突。 违反这条规则的典型代表是 C 标准库函数 getchar。 阅读全文
摘要:
不要省略返回值的类型。 C 语言中,凡不加类型说明的函数,一律自动按整型处理。这样做不会有什么好处, 却容易被误解为 void 类型。 C++语言有很严格的类型安全检查,不允许上述情况发生。由于 C++程序可以调用 C 函数,为了避免混乱,规定任何 C++/ C 函数都必须有类型。 如果函数没有返回 阅读全文
摘要:
尽量不要使用类型和数目不确定的参数。 C 标准库函数 printf 是采用不确定参数的典型代表,其原型为: int printf(const chat *format[, argument]…); 这种风格的函数在编译时丧失了严格的类型安全检查。 阅读全文
摘要:
避免函数有太多的参数,参数个数尽量控制在 5 个以内。 如果参数太 多,在使用时容易将参数类型或顺序搞错。 阅读全文
摘要:
如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来 传递,这样可以省去临时对象的构造和析构过程,从而提高效率。 阅读全文
摘要:
如果参数是指针,且仅作输入用,则应在类型前加 const,以防止该 指针在函数体内被意外修改。 阅读全文
摘要:
参数命名要恰当,顺序要合理。 阅读全文
摘要:
参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。 阅读全文
摘要:
如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。 例如: const float RADIUS = 100; const float DIAMETER = RADIUS * 2; 阅读全文
摘要:
需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义 文件的头部。 为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。 阅读全文
摘要:
在 C++ 程序中只使用 const 常量而不使用宏常量,即 const 常量完 全取代宏常量。 阅读全文
摘要:
尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或 字符串。 例如: #define MAX 100 /* C 语言的宏常量 */ const int MAX = 100; // C++ 语言的 const 常量 const float PI = 3.14159; // C++ 语言的 co 阅读全文
摘要:
不要忘记最后那个 default 分支。 即使程序真的不需要 default 处理, 也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以 为你忘了 default 处理。 阅读全文
摘要:
每个 case 语句的结尾不要忘了加 break,否则将导致多个分支重叠 (除非有意使多个分支重叠)。 阅读全文
摘要:
建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法。 阅读全文
摘要:
不可在 for 循环体内修改循环变量,防止 for 循环失去控制。 阅读全文
摘要:
如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。 并且由 于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进 行优化处理,降低了效率。 如果 N 非常小,两者效率差别并不明显,,因为程序更加简洁。 阅读全文
摘要:
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的 循环放在最外层,以减少 CPU 跨切循环层的次数。 阅读全文
摘要:
应当将指针变量用“==”或“!=”与 NULL 比较。 指针变量的零值是“空”(记为 NULL)。 尽管 NULL 的值与 0 相同,但是两者意义不 同。 假设指针变量的名字为 p,它与零值比较的标准 if 语句如下: if (p == NULL) // p 与 NULL 显式比较,强调 p 是指针 阅读全文
摘要:
不可将浮点变量用“==”或“!=”与任何数字比较。 千万要留意,无论是 float 还是 double 类型的变量,都有精度限制。所以一定要避 免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。 假设浮点变量的名字为 x,应当将 if (x == 0.0) // 隐含 阅读全文
摘要:
应当将整型变量用“==”或“!=”直接与 0 比较。 假设整型变量的名字为 value,它与零值比较的标准 if 语句如下: if (value == 0) if (value != 0) 不可模仿布尔变量的风格而写成 if (value) // 会让人误解 value 是布尔变量 if (!val 阅读全文
摘要:
不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较。 根据布尔类型的语义,零值为“假”(记为 FALSE),任何非零值都是“真”(记为 TRUE)。 TRUE 的值究竟是什么并没有统一的标准。例如 Visual C++ 将 TRUE 定义为 1, 而 Visual Basic 则将 阅读全文
摘要:
不要把程序中的复合表达式与“真正的数学表达式”混淆。 例如: if (a < b < c) // a < b < c 是数学表达式而不是程序表达式 并不表示 if ((a<b) && (b<c)) 而是成了令人费解的 if ( (a<b)<c ) 阅读全文
摘要:
例如: d = (a = b + c) + r ; 该表达式既求 a 值又求 d 值。 应该拆分为两个独立的语句: a = b + c; d = a + r; 阅读全文
摘要:
不要编写太复杂的复合表达式。 例如: i = a >= b && c < d && c + f <= g + h ; // 复合表达式过于复杂 阅读全文
摘要:
如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免 使用默认的优先级。 阅读全文
摘要:
为了防止某一软件库中的一些标识符和其它软件库中的冲突 ,可以为 各种标识符加上能反映软件性质的前缀。 例如三维图形标准 OpenGL 的所有库函数 均以 gl 开头,所有常量(或宏定义)均以 GL 开头。 阅读全文
摘要:
类的数据成员加前缀 m_(表示 member),这样可以避免数据成员与 成员函数的参数同名。 例如: void Object::SetValue(int width, int height) { m_width = width; m_height = height; } 阅读全文
摘要:
如果不得已需要全局变量,则使全局变量加前缀 g_(表示 global)。 例如: int g_howManyPeople; // 全局变量 int g_howMuchMoney; // 全局变量 阅读全文
摘要:
静态变量加前缀 s_(表示 static)。 例如: void Init(…) { static int s_initValue; // 静态变量 … } 阅读全文
摘要:
常量全用大写的字母,用下划线分割单词。 例如: const int MAX = 100; const int MAX_LENGTH = 100; 阅读全文
摘要:
变量和参数用小写字母开头的单词组合而成。 例如: BOOL flag; int drawMode; 阅读全文
摘要:
类名和函数名用大写字母开头的单词组合而成。 例如: class Node; // 类名 class LeafNode; // 类名 void Draw(void); // 函数名 void SetValue(int value); // 函数名 阅读全文
摘要:
用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 例如: int minValue; int maxValue; int SetValue(…); int GetValue(…); 阅读全文