C++由C发展而来,同时兼容C,C++相对于C而言,输入输出不需要再写格式控制命令符(即"%d"等),极大方便了数据的输入输出。对于初学者而言,要了解C++程序的基本格式与输入输出。
#include
using namespace std;
int main()
{
return 0;
}
每次写程序都先写这个框架。管你会不会,写就完了。
下面介绍最基本的操作,基础的输入输出用法如下:
1、输入:cin>>
对于 " >> "这个符号可形象地理解为从屏幕接收数据给定义的变量,从外指向变量。
例如:
#include
using namespace std;
int main()
{
int a;
cin>>a;
return 0;
}
对于多个变量的同时读入如下:
#include
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
return 0;
}
需要注意的是当变量为字符数组时,读到空格或换行会终止读入(与printf的 “%s” 类似),如果有多个变量,会等待下一个输入。例如:
#include
using namespace std;
int main()
{
int a;
char s[10];
cin>>s>>a;
printf("%d %s\n",a,s);
return 0;
}
样例如下:
2、输出:cout<<
out是外,cout即输入,"<<" 可理解为变量的值向屏幕输出,从变量指向外,与 “>>” 相区分(多加练习自然会熟练)。
多组输出如下:
#include
using namespace std;
int main()
{
int a;
char s[10];
cin>>s>>a;
cout<<a<<' '<<s<<endl;
return 0;
}
输入输出结果与上面相同,不同的是 “>>endl” (换行输出),等价于 ">>’\n’ "。
#include
using namespace std;
int main()
{
//int a; (单行注释)
/* (多行注释)
char s[10];
cin>>s>>a;
cout<
return 0;
}
#include
using namespace std;
int b;
int sum(int x,int y)
{
x+=b;
return x+y;
}
int main()
{
int a;
char s[10];
b=4;
cin>>s>>a;
cout<<a<<' '<<s<<endl;
return 0;
}
全局变量可在任何地方被调用,不受限制,而样例中sum函数的x与y变量为局部变量,仅在函数内部有效,若在主函数中给x或y赋值,将会报错。局部变量在定义swap函数时会出错,函数形参交换而实参并没有交换,导致错误。
C语言还未学到的知识点,有心的同学可以去翻一下书,结构体的出现为我们自己定义一个数据类型提供了途径。下面介绍基本用法:
struct name{
/*可自己任意取名称作为新的变量名,这里取名name*/
int a;
double b;
float c;
char d;
bool d;
int e[10];
char f[10];
};
这里的struct name可看作一个自己定义的新的数据类型,等价与int,double等,与int定义变量一样定义,如下:
struct name s;//可将struct看成一个整体,当作新变量类型名
其中s为变量名,要注意的是C中struct不能省略,而C++可直接写为:
name s;//这里与int a的定义更加匹配
此外:
struct name{
char Name[10];
int age;
}s={
"123123",19};
这种写法将变量与结构类型捆绑了起来,不利于后面定义该数据类型的变量,所以不建议写,可写作:
struct name{
char Name[10];
int age;
};
(struct) name s={
"123123",19};//括号表示可省略,上面已解释
//同时赋初值可如此操作
插入一下struct和class的区别,struct默认public,而class默认private。
联合和共用不常用,了解一下会做题或者认识即可。
在讲const前,先好好讲一讲指针。
首先,指针指向的永远是地址!!!指针变量与普通变量一样,只不过普通变量存储在内存地址的是对应数据类型的值,而指针变量存的是地址。
int a=6;
int *p;
p=&a;
*p=7;
这里定义了一个int型的变量a并赋初始值6,p指针指向了a的地址(即0x6ffe14),所以* p 的值为a变量的值,* 可理解为一种运算符号,作用是取地址上的值,也可进行修改,上面的 *p=7是可行的,a变量的值也修改为7。
变量 | 地址 | 值 |
---|---|---|
a | 0x6ffe14 | 6 |
char *p="abc";//意思是字符串abc的首地址由指针p来指向
前面所学的数组也是指针:
int a[10]={
0,1,2,3,4,5,6,7,8,9};
int *p=a;//或*p=&a[0] 均为指针指向a数组的首地址
cout<<*p<<endl;
cout<<*(p+1)<<endl;
cout<<*p+1<<endl;
p++;
cout<<*p<<endl;
让我们来分析一下结果,首先p指向了a的首地址(即a[0]的地址,存储的数值为0),*p取值,输出为0;然后p+1为p所指地址的下一个地址(即a[1]的地址,存储的数值为1),*取值,输出1;由于 " * " 的优先级高于 " + " ,所以先取 * p的值,再进行0+1的运算,输出1;最后p++表示指针右移,指向下一个地址(即a[1]的地址),再取值,输出1。
关于指针的用法的细节等待你取探索。
讲完指针,来讲const,const’是恒定的、不变的意思。
const char *p="123";//值不变
char const *p="456"; //地址不变
记住一句话,指针永远指向地址,第二种就好理解了,p指向"123"首地址,const再char后,表示p所指的地址不再发生改变(即p永远指向一个确定的地址),地址上存储的之可以改变;第一种const在最前,表示指针所指的指不能够修改,但是指向的地址可以改变,二者并不矛盾。对于p[0],p[1]
这样的表示,上面有提到数组与指针的关系,指针可通过数组下标的方式访问元素。别杠,你杠就你对。
由于函数刚刚学过就跳过了,直接进入内敛函数。
先了解一下宏定义:
#define N 1+3
#define M N*N//结果不是16而是7
其实宏定义是一种替换,NN并不是我们想的(1+3)(1+3)=16,而是1+3*1+3=7,宏定义是一种机械的替换,你怎么写它就怎么照搬,也不会给你加括号,有一种解决办法就是加括号,如#define N (1+3)
这样算出来就是16了,由于这种不安全性,引入了内敛函数。
程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于普通函数,都是在运行时候才被替代。内联函数是用空间换时间。
内敛函数与普通函数的区别是在最前面加一个inline即可。
举例形象又好理解,这里就举例了:
#include
#include
using namespace std;
double dis(double x=0,double y=0)
{
return sqrt(pow(x,2)+pow(y,3));
}
int main()
{
cout<<dis()<<endl;
cout<<dis(3)<<endl;
cout<<dis(3,4)<<endl;
return 0;
}
这里需要注意的是,形参表中同时有无默认值和有默认值的形参时,有默认值的形参要放到无默认值形参的后面。
int max(int a,int b)
{
return (a>b) ? a:b;
}
int max(int a,int b,int c)
{
if(a>b&&a>c){
return a;
}
return (b>c) ? b:c;
}
int max(int a,int b)
{
return (a>b) ? a:b;
}
double max(double a,double b)
{
return (a>b) ? a:b;
}
void max(int a,int b)
{
if(a>b) cout<<a<<endl;
else cout<<b<<endl;
}
重载与带默认值函数在使用时要注意一下两点:
1、函数形参完全相同,返回值类型不同不允许重载;
2、 二义性;
3、实参与形参的类型。