在c++中要想使用一个变量必须要先定义该变量的数据类型。定义一个变量的语法如下:
数据类型标识符 +空格 + 有效的变量标识名称
比如:
int a ;
float b;
double c;
如果我们需要定义多个同类型的变量,可以使用如下写法:
int a,b,c;
变量名称之间使用逗号隔开,类型标识符与变量名称之间有空格。
相信很多使用过js的朋友会觉得记忆这些类型有时候也是麻烦的,毕竟在js中我们可以使用 var a; let b;这样来定义一个变量。它的类型完全是由编译器进行推导的。
在c++中,c++11标准也支持了这种隐式推导的特性,我们在定义变量的时候不需要明确变量的类型,把工作交给编译器去推导变量的具体类型。这种特性在c++中是使用auto关键字来完成的。
下面几点我们在使用auto关键字的时候需要注意一下:
1. 使用auto关键字定义变量时,变量必须初始化
2. auto不是一个实际的类型,它就相当于与于一个类型占位符。它的原理是编译器在编译的时候根据输入的数据内容来判断类型
3. 同时定义多个变量时,确保类型一致
4. auto不能用于函数参数
假设我们有下面的代码,运行看下是否和上面说的一致:
auto a;
cout << a << endl;
结果,编译失败
main.cpp:23:10: 错误:‘auto a’声明有缺少初始值设定
auto a;
^
在函数参数中使用:
int max(auto a, auto b) {
if (a > b) {
return a;
}
return b;
}
/*
* 程序入口函数
*/
int main(int argc, char** argv) {
cout << max(12,34)<< endl;
return 0;
}
运行结果:
main.cpp:18:14: 错误:形参声明为‘auto’
int max(auto a, auto b) {
^
main.cpp:18:22: 错误:形参声明为‘auto’
int max(auto a, auto b) {
^
main.cpp: 在函数‘int max()’中:
main.cpp:19:9: 错误:‘a’在此作用域中尚未声明
if (a > b) {
^
main.cpp:19:13: 错误:‘b’在此作用域中尚未声明
if (a > b) {
^
main.cpp:22:12: 错误:‘b’在此作用域中尚未声明
return b;
接下来我们使用一个简单的例子来看下,auto是否能够正确的推导出变量的类型:
auto a = 19;
auto b = 0.9f;
cout <<"a是:"<< typeid(a).name()<< endl;
cout <<"b是:"<< typeid(b).name()<<endl;
输出:
a是:i
b是:f
这里输出i,f是因为这些类型都是c++的内置类型,所以都输出了简写。
bool: b
  char: c
  signed char: a
  unsigned char: h
  (signed) short (int): s
  unsigned short (int): t
  (signed) (int): i
  unsigned (int): j
  (signed) long (int): l
  unsigned long (int): m
  (signed) long long (int): x
  unsigned long long (int): y
  float: f
  double: d
  long double: e
---------------------
接下来我们说说c++中变量的作用域。我们可以将变量分为局部变量和全局变量以及外部范围变量。
局部变量的作用范围是定义它的程序块内。如果变量在函数中定义,那么它的作用域就是这个函数内部,以此类推。
全局变量实在全局范围内都有效的变量。它可以在程序中的任何地方使用,只要在它定义之后。
外部范围变量是一种可以在其他所有链接在一起的源文件中均可使用的变量,不过我们用到的很少,暂不做研究。
定义变量 定义一个变量可以使用下面两种方式:
1. C-Like写法,就是定义变量的时候加上一个等号,并在后面写上变量的值
2. 构造函数初始化,将初始值用()括起来
int a = 10;
int b(10);
cout << a << endl << b <<endl;
运行结果:
10
10