c++输入输出
不同于C语言的输入输出,C语言的输入输出要指定类型,scanf("%d", &a);printf("%d", a);
c++的输入输出:
int a = 0;
cin >> a;//>>是流提取操作符,等价于C语言的scanf("%d", &a);这行代码的官方说明叫流提取
cout << a;//<<是流插入操作符,等价于C语言的printf("%d", a);这行代码的官方说明叫流插入
更本质的内容要到类和对象才能了解。
c++输入的时候可以输入多个,而且不用指定类型:
int a = 0;
double b = 0;
cin >> a >> b;
cout << a << b << endl;
cout << a << b << '\n';//与上一行代码的含义是一样的
c++也可以格式化输出(比如控制小数点后输出的位数),但是很麻烦,有格式化输出的需求,按C语言的方式格式化输出就可以了。
有时候会看到#include<iostream.h>这是c++还没有命名空间时的版本,会在一些比较旧的编译器上出现,比如VC6.0
缺省参数
缺省参数的含义就是给函数形参赋值,所以缺省参数也叫默认参数。
void function(int a = 0)//这种行为很像备胎,有实参就不用,没有实参就用。
{
cout << a << endl;
}
int main()
{
function(1);
function();//没有传参时,使用函数的默认值
return 0;
}
还可以一次设立三个缺省参数,这样就有三种传参方式。
void function(int a = 10, int b = 20, int c = 30)//全部给了缺省参数叫做全缺省
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
function();
function(1);
function(1, 2);
function(1, 2, 3);
return 0;
}
这个语法的意义在于更灵活,这是C语言没有的语法。但是不能只传b,必须要先传第一个才能传第二个。
与全缺省对应的是半缺省。
void function(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
//function();在半缺省的情况下就就必须传参了
function(1);
function(1, 2);
function(1, 2, 3);
return 0;
}
半缺省不是缺省一半,而是部分缺省。半缺省不能说缺省a,不缺省b( void function(int a = 10, int b, int c = 30)),必须要从左往右连续的缺省。缺省是实参的缺省。缺省a就是a的实参可以缺省。
在数据结构的初始化中很适合用。这是之前C语言的栈初始化代码:
void StackInit(Stack* ps)
{
assert(ps);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
使用缺省参数后:
void StackInit(Stack* ps, int n = 4)
{
assert(ps);
ps->a = (int*)malloc(sizeof(int) * n);
ps->top = 0;
ps->capacity = 0;
}
即使需要大一点的空间也可以在传实参的时候传较大的值,比原来的要灵活一点。
有的地方包头文件还会这么包:#include<cassert>
#include<cassert>与#include<assert.h>在c++中都可以用,区别在于后者没有命名空间。
windows下文件名的大小写是不区分的。
缺省参数的不能在声明和定义中同时出现。会出现歧义。
会发生重定义默认参数的错误。这个语法是为了防止在声明和定义中使用不同的缺省参数。
可以试一下,在声明不给,定义给;和定义不给,声明给的两种情况(函数的实现与主函数不在同一个项目中,或者函数的实现在主函数的下面(编译器只会向上查找))。
最后可以看到声明不给,定义给的情况编译是不通过的。
原因在于在编译阶段,只能看到函数声明(预处理阶段头文件展开,函数声明包含进项目中(每个.c和.cpp文件会生成目标文件)),函数声明中没有缺省参数,就会有语法报错。函数的定义是在链接阶段找。(不理解可以看看前面的博客:程序编译+链接的简单过程)