记录一下C++学习之路上的一些以前没注意过的问题。
1.读取数量不定的输入数据
正常读取数据时,比如按循环读入,设定一个循环条件,但是有很多时候是没法提前判断输入数据的个数的。
怎么读取数量不定的输入数据呢?
例子如下:
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int sum = 0, value = 0;
//当标准输入流遇到文件结尾或者非法输入,在此为非int型输入时,会为false
while (cin>>value)
sum += value;
cout<<"sum is "<<sum<<endl;
return 0;
}
使用标准的C++IO库,iostream对象在输入时会返回一个值,如果遇到非法输入或者文件尾,返回值会变为false,这就成为我们判断终止的条件了。注:windows下终止标志位ctrl+z。
2.切勿混用无符号数和带符号数
会导致自动类型转换,进而溢出,造成意想不到的结果。
还有一个易错的循环的例子:
for(unsigned u = 10; u >= 0; u--)
{
cout<<u<<endl;
}
在这里,当u=0时仍然能正确执行。但是u--之后变成了-1,而又为无符号数,导致直接越界,变成一个特别大的正数。3.对于各种内置的变量,一定做好初始化,否则会有难以预料的后果。
4.变量声明和变量定义的关系
声明使变量的名字为程序所知,而定义负责创建与名字相关联的实体。
声明规定了变量的类型和名字,在这一点上定义与之相同,但是定义还申请了一个内存空间,还可能为之赋了一个初值。
变量能且只能被定义一次,但是声明可以多次。
在一个文件内声明并定义的话直接定义即可,并且此操作只能有一次。而在其他文件如果要使用这个变量的话,就需要加一个关键字extern。
5.变量的作用域
当嵌套的作用域中包含了与外层作用域同名的变量,内层的会覆盖掉外层的变量。但是可以通过::符号显示的调用全局变量。
6.引用型变量
引用在定义的时候必须初始化,且初始化的时候必须是被引用的对象,而不是一个具体的数值。
引用即别名,不是额外的一个对象。
不能使用引用的引用。
引用不能更改对象。
7.使用未初始化的指针也是程序设计出错的一大原因。所以一定要初始化指针。
关于指针的定义,以下两种均可:
int* a, b;//定义两个int型指针a, b
int *a, b;//定义一个int型指针a,和一个int型变量b
8.当对一串复杂的变量定义搞不懂是指针还是引用时,从右向左比较好理解。离变量名最近的决定变量的类型。