C与指针的第二章介绍了编译、链接和转义字符等概念。经查漏,要补缺的点如下:
1.在实现课后习题2.8.2时(用栈实现括号匹配算法),想用cout在屏幕上打印提示输入的语句,用了using namespace std,报错C2872: 不明确的符号is_empty()。
分析:
该函数是stack类的成员函数,用于判断栈是否为空,与std里定义的函数同名(),编译器不知道程序中要调用哪一个is_empty()函数,故报错。
解决方法(尽量不要写与库函数同名的函数):
注释掉using namespace std,避免重名,在cout前加std::。
微软对C2872错误的说明:
https://docs.microsoft.com/zh-cn/cpp/error-messages/compiler-errors-2/compiler-error-c2872?f1url=https://msdn.microsoft.com/query/dev15.query?appId=Dev15IDEF1&l=ZH-CN&k=k%28C2872%29&rd=true&view=vs-2017
2.若头文件被修改,则包含其的头文件a,包含头文件a的源文件c都要重新编译,其他不存在包含关系的头/源文件无需重新编译;
3.以两个括号打头,外加一个字符的(例如??(、??)等)是三字母词,表示一个字符;
4.\ddd(最多三位),该转义字符表示的字符就是给定八进制数所代表的字符,\0123代表’\012’和’\3’这两个字符;
5.\xddd则是十六进制数所代表的字符;
6.一段字符中若包含以/和*组成的注释,注释会被等效为一个空格;
7.括号匹配问题需用到栈这种数据结构,算法思路:
1)遇到左括号就push;
2)遇到右括号先看还有没有左括号,若没得,代表没有可匹配的左括号了,返回false;否则top、pop,判断栈顶元素与当前右括号是否匹配(这里可以辅助一个match变量,根据右括号来if或switch设置match,再比较match和栈顶元素是否相等)。
书中给出的警告:
1.字符串常量中的字符被错误的解释为三字母词;
2.编写得糟糕的注释可能会意外地终止语句;
3.注释的不适当结束。
书中给出的编程提示:
1.良好的程序风格和文档将使程序更容易阅读和维护。