一.代码质量问题 "其中也包含有C++的代码规范 " (多为摘录林锐博士 <<高质量的C++/C编程指南>> 在小卓看来 优秀的开始是从代码质量开始的 建议一起学习的兄弟们 可以试读一下这本书 )
1.用 #include <stdio.h> 格式引用标准库的头文件(编译器将从标准库目录开始搜索)
#include "stdio.h" 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)
目录结构
如果一个软件的头文件数目比较多(如超过十个), 通常应将头文件和定义文件分别保存于不同的目录,以便于维护
同时如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其"声明".为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录.
2.不提倡使用全局变量.
3.程序的版式 应该是追求 清晰 美观 是程序风格的重要构成因素
4. 空行起着分隔程序段落的作用.空行是我们敲代码时候的习惯 ,但是一定要明白不能多也不能少 空行得体不多不少, 会将程序的布局更加清晰
5.
1. 一行代码只做一件事,如只定义一个变量, 或只写一条语句. 这样的代码容易阅读, 并且方便于写注释
2.if, for, while, do 等语句各自占一行, 执行语句不得紧跟在其后. 不论执行语句有多少都要加 {} . 防止书写失误.
3.尽可能在定义变量的同时初始化该变量(就近原则)
如果变量的引用处和其定义处相隔比较远, 变量的初始化很容易被忘记.如果引用了未被初始化的变量, 可能会导致程序错误.
6.代码行内的空格
1.关键字之后要留空格.
2.函数名之后不要留空格 例子: void Func1( ) 👈为推荐 void Func1 ()
3赋值 比较 算术 逻辑 .二元操作符前后应当加空格
4.一元操作符如"!" , "~","++", "--" 等前后不加空格
5.像 "[ ]" "-" "->" 这类操作符前后不加空格
6.对于表达式较长的 for语句 和 if语句,为了紧凑起见可以适当的去掉一些空格, 如 for (i=0; i<10; i++) 和 if ((a<=b) && (c<=d))
7.长行拆分
1.代码行最大长度宜控制在70至80个字符以内.代码行不要过长, 否则肉眼看不过来, 也不便于打印
2.长表达式要在低优先级操作符处拆分成新行, 操作符放在新行之首 (以便突出操作符). 拆分出的新行要进行适当的缩进, 使排版整齐, 语句可读.
8.修饰符的位置
若将修饰符 * 靠近数据类型 例如 int* x; 从语义上讲此写法比较直观,即 x 是 int 类型的指针.
会引起误会的写法 例子: int* x, y;此处y容易被误解为指针变量.虽然将x和y分行可以避免误解,但是并不是都愿意这样做.
最优写法 应当将修饰符 * 和 & 紧靠变量名
例如:
char *name;
int *x, y; // 此处y不会被误解为指针
9. 注释
注释常用于:
(1) 版本,版权说明;
(2) 函数接口说明;
(3) 重要的代码行或段落提示.
虽然注释有助于理解代码, 但注意不可过多地使用注释.
1.注释的花样要少. 同时 如果代码本来就是清楚的, 则不必加注释.否则多此一举, 令人厌烦.
2.边写代码边写注释, 修改代码同时 修改相应的注释, 以保证注释与代码的一致性. 不再有用的注释要删除
3.注释应当准确,易懂.
4.注释不提倡使用缩写
5.注释的位置应与被描述的代码相邻, 可以放在代码的上方或右方 ,不可以放在下方.
10. C++中数据的书写 建议"以行为中心"的书写方式,即说先考虑类应该提供什么样的函数."这样做不仅让自己在设计类时思路清晰", 而且方便别人阅读.因为用户最关心的时接口,谁愿意先看到一堆私有数据成员
class A { public: void Func1(void); void Func2(void); … private: int i, j; float x, y; … } 以行为为中心的版
11.标识符( 定义:标识符是程序员在程序中自定义的一些符号和名称。关键字是系统自带的,标识符是自定义的。如函数的名称等,用来区分各种事务。 ---------不能以数字开头,不可以使用关键字作为标识符, 多个单词建议使用驼峰标识(第二个字母的首字母大写)或者使用下划线链接)
C语言关键字、标识符和注释 - 文顶顶 - 博客园
https://www.cnblogs.com/wendingding/p/3674999.html
C语言关键字、标识符和注释 - 文顶顶 - 博客园
https://www.cnblogs.com/wendingding/p/3674999.html
关于标识符的认识这个链接就够了)
正文:1.切忌使用汉语拼音来命名.程序中的英文单词一般不会太复杂,用词应当准确.例子:不要把CurrentValue 写成 Now Value
2.标识符应符合 "min-length && max-information" 原则
3.程序中不要出现仅靠大小写区分相似的标识符.
如: int x, X; // 变量 x 与 X 容易混淆 void foo(int x); // 函数 foo 与 FOO 容易混淆 void FOO(float x);
4.程序中不要出现标识符完全相同的局部变量和全局变量,尽管二者的作用域不同而不会发生语法错误,但会使人误解.
5.尽量避免名字出现数字编号,如A1, A2等,除非逻辑上的确需要编号.这是为了防止产生无意义的名字
12.简单的Windows应用程序命名规则(林锐博士对"匈牙利"命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发)
1.类名和函数名用于大写字母开头的单词组合而成.
例如: class Node; // 类名 class LeafNode; // 类名 void Draw(void); // 函数名 void SetValue(int value); // 函数名
2.常量全用大写的字母,用下划线分割单词.
: const int MAX = 100; const int MAX_LENGTH = 100;
3.静态变量加前缀s_(表示static).
例子:
void Init(…) { static int s_initValue; // 静态变量 … }
4.如果不得已需要全局变量,则使全局变量加前缀g_(表示global).
例子:
int g_howManyPeople; // 全局变量 int g_howMuchMoney; // 全局变量
13.运算符优先级
如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级,同时也是为了产生歧义并提高可读性,应当用括号确定操作顺序.
if ((a | b) && (a & c))
14.for 循环语句中 应该将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数.
例子: 代码为保持原文的优质性 是复制的代码所以 可能不太美观 此处仅仅表达效率问题 不为高质量考虑
例如示例 4-4(b)的效率比示例 4-4(a)的高。 for (row=0; row<100; row++) { for ( col=0; col<5; col++ ) { sum = sum + a[row][col]; } } for (col=0; col<5; col++ ) { for (row=0; row<100; row++) { sum = sum + a[row][col]; } } 示例 4-4(a) 低效率:长循环在最外层 示例 4-4(b) 高效率:长循环在最内层
建议for语句的循环控制变量的取值采用"半开半闭区间"写法.
for (int x=0; x<N; x++) //这种写法为更优 因为这种写法更为直观 { } for (int x=0; x<=N-1; x++) { }
switch中 不要忘记break 和 default 这并非多此一举,而是为了防止别人误以为你忘了default处理
摘录截至到第五章常量部分 之后陆续补充
第二. 掉过的坑
向右对齐
%4d输出不足时空格补充 同时 向右对齐 超过4列时就原样输出
做题注意
做题发现逻辑错误 一定一定一定要再多读几遍题 一个字一个字的去读 不要一目十行切记
属于结果以0开头
输出以0开头的结果 例如 0001 : printf("%04d", x); 这样就可以实现了
辗转相除法求公约数:
核心代码 : c = a%b;
while (c!=0)
{
a = b;
b = c;
c = a%b;
}
此时b为最大公约数
递归函数
在函数内调用自己叫递归调用,也叫递归函数
栗子: long Fact (int n)
{
if (n < 0)
{
return -1;
}
else if (n=0 || n=1)
{
return 1;
}
else
{
return n*Fact(n-1);
}
}
mian的报错
(13条消息) 出现undefined reference to 'WinMain@16'的可能情况_Chuck的博客-CSDN博客https://blog.csdn.net/chuck_0430/article/details/8824762来自大佬对报错(undefined reference to 'WinMain@16'的可能情况)的神预判
动态变量与静态变量(待补充)
动态变量:
{
定义在某函数中,即局部变量 平时没有用关键字修饰,默认的也就是动态变量(存储空间是在此函数体执行完成后释放)
定义在全局时,即全局变量(整个程序均可使用,可以适用于每个函数体,虽然每个函数体结束,存储空间也随之释放)
}
静态变量(statc修饰):
{
定义在某函数中,即局部静态变量 (存储空间也是随着此函数执行完,不会随之释放内存.同时这些变量也不会消失,每次调用此函数,变量值不变)
定义在全局时,即全局变量(整个程序结束后才被释放,生命周期也是从程序执行道程序退出)
}
\0是空字符,ASCII码值为0,用在字符串中作为结束标志