变量
变量其实只不过是程序可操作的存储区的名称。 C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
C++ 中的变量声明
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
int i, j, k;
char c, ch;
float f, salary;
double d;
extern int d = 3, f = 5; // d 和 f 的声明
int d = 3, f = 5; // 定义并初始化 d 和 f
byte z = 22; // 定义并初始化 z
char x = 'x'; // 变量 x 的值为 'x'
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
C++ 中的左值(Lvalues)和右值(Rvalues)
C++ 中有两种类型的表达式:
- 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
- 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:
int g = 20;
但是下面这个就不是一个有效的语句,会生成编译时错误:
10 = 20;
C++ 变量作用域 variable scope
作用域是程序的一个区域,一般来说有三个地方可以定义变量:
- 在函数或一个代码块内部声明的变量,称为局部变量(local variable)。
- 在函数参数的定义中声明的变量,称为形式参数(parameter)。
- 在所有函数外部声明的变量,称为全局变量(global variable)。
变量的初始化
// initialization of variables
#include <iostream>
using namespace std;
int main ()
{
int a=5; // initial value: 5 C风格初始化
int b(3); // initial value: 3 ()初始化
int c{2}; // initial value: 2 {}初始化
int result; // initial value undetermined
a = a + b;
result = a - c;
cout << result;
return 0;
}
以上,初始化变量的所有三种方式在C++中都是有效且等效的。
类型扣除:auto和decltype
初始化新变量时,编译器可以通过初始化程序自动确定变量的类型。为此,只需使用auto变量的类型说明符:
int foo = 0;
auto bar = foo; // the same as: int bar = foo;
这里,bar
声明有一个auto
类型; 因此,type bar
是用于初始化它的值的类型:在这种情况下,它使用的类型foo
是int
。
未初始化的变量也可以使用带有说明decltype
符的类型推导:
int foo = 0;
decltype(foo) bar; // the same as: int bar;
这里,bar
被声明为具有相同的类型foo
。
auto
并且decltype
是最近添加到该语言的强大功能。但是,它们引入的类型推导功能意味着在通过其他方式无法获得类型或使用它时提高代码可读性时使用。上面的两个例子可能都不是这些用例。事实上,它们可能降低了可读性,因为在阅读代码时,必须搜索foo
实际知道类型的类型bar
。
网友评论