OK,下面让我们看一个简单的C++程序:>>
/*------------------------------------------------->>
First C++ Program>>
--------------------------------------------------*/>>
> >
#include <iostream> //现在你只需知道要使用输入输出语句就必须写这行。
//这一行结尾不用加分号因为它不是真正的C++语句。
//在1.3节将会对此做出解释。
using namespace std; //这是什么意思呢…在1.2.3节会有解释。
int a=5; //声明变量a,同时顺便赋5给它。C++中变量都需先声明后使用。
//int说明了a的数据类型为整数。
int square(int x); //声明函数square,它有一个参数,为int类型,即整数。返回值也
//为int类型。C++中的函数都需要先声明后给出定义。
int square(int x) //函数真正定义。
{
return x*
x; //返回x*x,可以在一个语句中的间隔位置插入回车将其分成几行。
}
int main( ) //主函数,每个DOS窗口下的C++程序都需要它
{
int A; //声明变量A。C++中变量声明的位置是比较随意的。
cout<<"请输入A:"; //输出"请输入A:",箭头的方向很直观。
cin>>A; //输入A, 注意箭头方向的更改。
cout<<"A="<<A<<endl; //依次输出"A="、A的值并换行。endl代表换行。
cout<<"a+A="<<a+A;
cout<<"A*A="<<square(A);
return 0; //可以指示程序正常结束
}
运行程序的方法是按工具栏中部的小三角形。
从这个程序中,我们可以看到C++程序的一些特点:
(1) 区分大小写,关键字全部是小写的。
(2) 每一行语句都需要用";"结尾。
(3) 用"{"和"}"括起的句被称为块语句,形式上被认为是一个语句(就像PASCAL中的begin和end)。
(4) "//"至行尾为注释,"/*"至"*/"中全为注释,它们不会被编译。
(5) 主体是由一个个函数所构成的。在1.6节将会详细地介绍函数。
对于十进制数的表示,C++与其它语言一致,同样可以使用科学记数法,如3.145e-4。在C++中还可以直接表示十六进制数,只要在前面加上"0x"即可。如0x23。如果要表示的是负十六进制数,可以直接在"0x"前加上负号。为了清楚说明一个数是float类型,我们可以在数的结尾加上"f",例如1.00f。否则,该数默认为double类型。
下面我们来看看C++中的基本数据类型:
bool(逻辑型) char(字符或8位整数) short(16位整数)
int(16位或32位整数) long(32位整数) float(32位浮点数)
double(64位浮点数) long double (80位浮点数)
bool类型用true和false代表真与假,其实际占用空间是8位。
某一char类型的变量如果等于'a'(注意C++中字符用单引号,字符串用双引号),则它又等于a的ASCII码,即97。依此类推。
int类型在DOS下一般为16位,在WINDOWS下一般为32位,如果想保险一点自己试试就知道了。
在整数数据类型前可加上"unsigned"表示为无符号数,数的范围可增大一倍。比如说char类型数据的范围是-128到127,unsigned char类型数据的范围则为0到255。
使用sizeof( )可以得到任何对象占用的字节数,例如如果有一个char类型的变量a, 则sizeof(a)会返回1。
有的类型之间是可以自动转换的,如可以把一个float类型的变量的值赋给一个int类型的变量,小数点后的部分将会被自动截掉。如果不放心可使用强制类型转换,形式为(目标类型)变量名。比如说如果有一个char类型的变量 c值为'b',直接输出c会得到'b'这个字符但输出(int)c会得到'b'的ASCII码。强制类型转换不会改变变量的值(除非将一个浮点数转换为整数等情况),它只是返回转换后的值。注意字符串和整数之间不能用强制类型转换实现转换,办法在1.9节。
我们还可以借助typedef定义自己的数据类型,例如typedef myint unsigned int;后myint就等价于unsigned int。VC.net系统已经预先用typedef定义好了不少类型,例如BYTE等价于unsigned char,WORD等价于unsigned short,DWORD 等价于unsigned long等等。
C++中的变量几乎可在任何地方处定义,而且可以同时定义多个变量,如int a,b;。但每一个变量只在最紧挨它的一对{和}符号内起作用,只有在所有函数之外定义的变量才为全局变量,即在整个cpp文件中有效。如果局部变量和全局变量重名,调用时会使用局部变量,如果一定要使用那个全局变量,调用时在变量名前加上"::"即可。这里建议大家尽量少用全局变量,因为它可能使程序变得混乱和难于调试。
所有变量定义的前面均可加上修饰符"const"表示它是常量,不能在程序中改变它的值。其实如果我们不打算在程序中改变某变量的值,我们就可以把它声明为常量以防止意外改动。我们还可加上修饰符"static"表示此变量是静态变量,这个要举一个例子以方便说明:比如说在某一个函数内有这样一条定义:static int count=0; ,那么程序执行前就会为count这个变量开辟一块固定的空间并把count的初值设为0。以后每次执行这个函数时,程序不会象普通变量那样重新为它分配空间,也就是不会改变它的位置和数值,换句话说,它的生命周期与整个程序一样。这样只要在函数中再加一句count=count+1即可统计这个函数执行了多少次。
Namespace是一个挺有趣的东西,它的引入是为了方便我们使用相同名字的变量、常量、类(在第二章我们会接触类)或是函数。一个Namespace是这样定义的:
namespace xxx //xxx是namespace的名字
{
在这里可以像平常一样定义各种东西
}
以后要使用某个namespace中的东西,比如说xxx中的aaa,像这样:xxx::aaa即可。不过这样好像挺麻烦的----平白无故就多出了一个"xxx::"。于是有了"using namespace xxx;"这种语句,可以帮你省下这几个字符。记住,"using namespace"也只是在最紧挨它的一对{和}符号内起作用,在所有函数之外执行的这条语句才在整个文件中有效。注意:
namespace s1
{
int a=0;
}
namespace s2
{
float a=0;
}
void main( )
{
using namespace s1;
using namespace s2;
//a=a+1; //这句是错误的!因为编译器此时无法确定a在哪个namespace
s1::a = s2::a + 1; //这样就是正确的
}
那么我们在第一个程序中为何要using namespace std;呢?其实也是为了把"std::cout"变成简洁一点的"cout"。请看1.3节。 |