您的位置:首页 > 编程语言 > C语言/C++

C/C++实战常见错误总结及注意事项【关注与Python的不同点】

2014-06-22 13:37 1221 查看
学习笔记,总结C/C++中与Python不一样的地方,需要注意。

1、变量只能定义一次,同级作用域(不包括其子作用域)再次定义报错;在子作用域可以重新定义,不会报错,会重写,而在子作用域外面,原来的定义不会改变。

2、牢记C++中数组下标越界不会报错。

3、二维数组定义中:a[3][4]注意每一行赋值留1个位置给"\n"字符。

4、牢记字符串定义只能用"",''定义字符,在eclipse中不会报错,自动赋最后一个字符给变量。

5、使用const定义常量,不可在同级作用域(不包括其子作用域)更改!在子作用域不可更改,但可以在子定义域再次定义!

6、const定义的常量默认为局部常量,也就是不能在其他文件使用,但可以用extern const int a = 1;来定义为全局常量。引用方法:先申明:extern const int a;再使用。

7、非const的变量默认为extern!要使 const 常量能够在其他的文件中访问,必须地指定它为 extern。

8、&在变量名前面,表示引用(references)。int ival = 1024; int &refVal = ival;只是起了一个别名!所以引用refVal的运算会导致iVal值发生改变(与Python类似)。需要注意的是常量const不能直接使用&符号起别名(引用),需要申明为const,即:const
int ival = 1024;const int &refVal = ival;才对!【目的是保证const型数据不可更改性!】

9、非 const 引用只能绑定到与该引用同类型的对象。【目的是保证引用和原始变量指向内容的一致性!】 const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。【原因是const是不可变的,我们用的肯定是他的不可变性!这也说明了8中的合理性!】

10、typedef 可以用来定义类型的同义词;枚举的定义包括关键字 enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。枚举成员是常量。

11、关于begin()、end()、rbegin()、rend()的常见理解错误【更新于:2014.06.30】

代码和输出:

vector<int> vec = {0, 1, 2, 3, 4, 5};
cout << *vec.cbegin() << " " << *(vec.cend()-1) << ",溢出了:" << *vec.cend() << endl;
cout << *vec.crbegin() << " " << *(vec.crend()-1) << ",溢出了:" << *vec.cend() << endl;
0 5,溢出了:51473
5 0,溢出了:51473
图解为:【这是C++ Primer上的图,可不是我胡扯,而且代码输出结果佐证】



实际使用,最后不要这样处理首尾元素的值,可以使用vec.front()和vec.back()方法!

12、关于++前置后置的问题。【更新于:14.07.02】问题来源于论坛问答

while((*a++=*b++)!='\0')

表示1、*a=*b;  2、a++;b++; 判断*b(此时b已经加了一次了,指向下一个元素)所指向元素是否为'\0',是的话就退出循环,不是(!=)则继续复制b所指数组中元素到a数组中。
(a++)=(b++))!=4 【错误】
a++返回的是自身的值副本
(++a)=(++b)!=4;  【正确】

++a 返回的是a加1后自身的引用!

13、

未完待续。。。

本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创。不定期更新,有错误请指正。

如果你看到这篇博文时发现不完整,那是我为防止爬虫先发布一半的原因,请看原作者Blog。

如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息