C++tutorial(三):变量和类型

变量和类型

前一章中显示的“Hello World”程序的用处相当值得怀疑。我们必须编写几行代码,编译它们,然后执行生成的程序,只是为了获得在屏幕上写的简单句子的结果。输入句子本身肯定要快得多。

但是,编程不仅限于在屏幕上打印简单文本。为了更进一步,并能够编写执行真正拯救我们工作的有用任务的程序,我们需要引入变量的概念。

让我们想象一下,我请你记住数字5,然后我要求你同时记住数字2。您刚刚在内存中存储了两个不同的值(5和2)。现在,如果我要求你在我说的第一个数字上加1,你应该保留你的记忆中的数字6(即5 + 1)和2。然后我们可以,例如,减去这些值并获得4作为结果。

上面描述的整个过程是计算机可以用两个变量做的比较。可以使用以下语句在C ++中表示相同的过程:

a = 5;
b = 2;
a = a + 1;
result = a - b;

显然,这是一个非常简单的例子,因为我们只使用了两个小整数值,但考虑到你的计算机可以同时存储数百万个这样的数字,并用它们进行复杂的数学运算。

我们现在可以将变量定义为存储值的内存部分。

每个变量都需要一个标识它的名称,并将其与其他变量区分开来。例如,在前面的代码中,变量名称是a,b和result,但我们可以调用变量任何我们可以提出的名称,只要它们是有效的C ++标识符。

身份标识
有效的标识符是一个或多个字母,数字的序列,或下划线字符()。空格,标点符号和符号不能是标识符的一部分。此外,标识符应始终以字母开头。它们也可以以下划线字符()开头,但在大多数情况下,这些标识符被认为是为特定于编译器的关键字或外部标识符保留的,以及在任何地方包含两个连续下划线字符的标识符。在任何情况下,他们都不能以数字开头。

C ++使用许多关键字来识别操作和数据描述; 因此,程序员创建的标识符不能匹配这些关键字。不能用于程序员创建的标识符的标准保留关键字是:

alignas, alignof, and, and_eq, asm, auto, bitand, bitor, bool, break, case, catch, char, char16_t, char32_t, class, compl, const, constexpr, const_cast, continue, decltype, default, delete, do, double, dynamic_cast, else, enum, explicit, export, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, noexcept, not, not_eq, nullptr, operator, or, or_eq, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_assert, static_cast, struct, switch, template, this, thread_local, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t, while, xor, xor_eq

特定编译器还可以具有其他特定保留关键字。

非常重要: C ++语言是一种“区分大小写”的语言。这意味着用大写字母书写的标识符不等同于另一个同名但用小写字母书写的标识符。因此,例如,RESULT变量与result变量或Result变量不同。这是识别三个不同变量的三个不同标识符。

基本数据类型
变量的值以0和1的形式,存储在计算机存储器中未指定位置的某处。我们的程序不需要知道变量存储的确切位置; 它可以简单地用它的名字来引用它。程序需要注意的是存储在变量中的数据类型。存储一个简单的整数与存储一个字母或一个大的浮点数是不一样的; 尽管它们都是用零和1来表示的,但它们的解释方式并不相同,在很多情况下,它们并没有占用相同的内存量。

基本数据类型是由代表大多数系统本机支持的基本存储单元的语言直接实现的基本类型。它们主要可分为:
字符类型:它们可以表示单个字符,例如’A’或’$’。最基本的类型是char一个单字节字符。还为更广泛的角色提供了其他类型。
数字整数类型:它们可以存储整数值,例如7或1024。它们以各种大小存在,可以是有符号或无符号的,具体取决于它们是否支持负值。
浮点类型:它们可以表示实际值,例如3.14或0.01,具有不同的精度级别,具体取决于使用三种浮点类型中的哪一种。
布尔类型:布尔类型,在C ++中已知bool,只能表示两种状态之一,true或false。

以下是C ++中基本类型的完整列表:
组 输入姓名* 关于尺寸/精度的注释
字符类型 char 正好一个字节大小。至少8位。
char16_t 不小于char。至少16位。
char32_t 不小于char16_t。至少32位。
wchar_t 可以表示支持的最大字符集。
整数类型(签名) signed char 大小相同char。至少8位。
signed short int 不小于char。至少16位。
signed int 不小于short。至少16位。
signed long int 不小于int。至少32位。
signed long long int 不小于long。至少64位。
整数类型(无符号) unsigned char (与签署的同行相同)
unsigned short int
unsigned int
unsigned long int
unsigned long long int
浮点类型 float
double 精度不低于 float
long double 精度不低于 double
布尔类型 bool
空洞类型 void 没有存储空间
空指针 decltype(nullptr)

某些整数类型的名称可以在没有它们signed和int组件的情况下缩写- 只有非斜体的部分才需要标识类型,斜体部分是可选的。即,可缩写为,或简单; 它们都识别出相同的基本类型。 在上面的每个组中,类型之间的差异只是它们的大小(即它们在内存中占用多少):每组中的第一种类型是最小的,最后一种是最大的,每种类型至少为大于同一组中的前一个。除此之外,组中的类型具有相同的属性。 在上面的面板中注意除了signed short intsigned shortshort intshort

char(其大小只有一个字节),没有一个基本类型具有指定的标准大小(但最多只有一个最小大小)。因此,不需要(并且在许多情况下不是)这种最小尺寸的类型。这并不意味着这些类型的大小不确定,但所有编译器和机器都没有标准大小; 每个编译器实现可以指定这些类型的大小,这些大小最适合程序运行的体系结构。这种相当通用的类型规范为C ++语言提供了很大的灵活性,可以适应各种平台(无论是现在还是将来)的最佳工作。

上面的类型大小以位表示; 类型具有的位越多,它可以表示的值就越明显,但同时也会在内存中占用更多空间:

尺寸 独特的可表示值 笔记
8位 256 = 2 8
16位 65 536 = 2 16
32位 4 294 967 296 = 2 32(约40亿)
64位 18 446 744 073 709 551 616 = 2 64(约18亿亿)

对于整数类型,具有更多可表示的值意味着它们可以表示的值范围更大; 例如,16位无符号整数将能够表示0到65535范围内的65536个不同值,而在大多数情况下,其签名对应物将能够表示介于-32768和32767之间的值。与无符号类型相比,有符号类型的正值大约减半,因为16位中的一个用于符号; 这是范围相对适度的差异,很少有理由使用无符号类型,纯粹基于它们可以表示的正值范围。

对于浮点类型,大小会影响它们的精度,因为它们的重要性和指数具有更多或更少的位。

如果类型的大小或精度不是一个问题,然后char,int和double通常被选择为代表的字符,整数和浮点值,分别。其各自组中的其他类型仅用于非常特殊的情况。

通过使用,可以获得特定系统和编译器实现中的基本类型的属性numeric_limits类(参见标准头文件)。如果由于某种原因需要特定大小的类型,库会在标头中定义某些固定大小的类型别名。

上述类型(字符,整数,浮点和布尔值)统称为算术类型。但是存在另外两种基本类型:void它们确定了类型的缺乏; 和类型nullptr,这是一种特殊类型的指针。这两种类型将在后面的章节中进一步讨论。

C ++支持基于上面讨论的基本类型的各种类型; 这些其他类型称为复合数据类型,是C ++语言的主要优势之一。我们还将在以后的章节中更详细地介绍它们。

变量声明
C ++是一种强类型语言,要求在第一次使用之前使用其类型声明每个变量。这会通知编译器在内存中为变量保留的大小以及如何解释其值。在C ++中声明新变量的语法很简单:我们只需编写类型后跟变量名称(即其标识符)。例如:

int a;
float mynumber;

这是两个有效的变量声明。第一个声明int带有标识符的类型变量a。第二个声明float带有标识符的类型变量mynumber。声明后,变量a以及mynumber可以在其范围在节目休息中使用。
如果声明多个相同类型的变量,则可以通过用逗号分隔它们的标识符来在单个语句中声明它们。例如:

int a, b, c;

这声明了三个变量(a,b和c),它们都是类型int,并且具有与以下内容完全相同的含义:

int a;
int b;
int c;

要查看程序中的变量声明是什么样的,让我们看一下本章开头提出的关于你的精神记忆的例子的整个C ++代码:

// operating with variables

#include 
using namespace std;

int main ()
{
  // declaring variables:
  int a, b;
  int result;

  // process:
  a = 5;
  b = 2;
  a = a + 1;
  result = a - b;

  // print out the result:
  cout << result;

  // terminate the program:
  return 0;
}

编辑并运行

如果除了变量声明之外的其他内容本身对您来说有点奇怪,请不要担心。其中大部分将在接下来的章节中详细解释。

变量初始化
当声明上面示例中的变量时,它们具有未确定的值,直到它们第一次被赋值。但是变量从声明的那一刻起就有可能具有特定的值。这称为变量的初始化。

在C ++中,有三种方法可以初始化变量。它们都是等价的,让人想起多年来语言的演变:

第一个,称为c-like初始化(因为它是从C语言继承而来),包括附加一个等号,后跟值。变量初始化:

type identifier = initial_value;
例如,声明一个int名为的变量x 并从声明的同一时刻将其初始化为零,我们可以写:

int x = 0;

第二种方法,称为构造函数初始化(由C ++语言引入),将括号(())之间的初始值括起来:

type identifier (initial_value);
例如:

int x (0);

最后,第三种方法,称为统一初始化,类似于上面的方法,但使用花括号({})而不是括号(这是在2011年修订的C ++标准中引入的):

type identifier {initial_value};
例如:

int x {0}; 

初始化变量的所有三种方式在C ++中都是有效且等效的。

// initialization of variables

#include 
using namespace std;

int main ()
{
  int a=5;               // initial value: 5
  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;
}

编辑并运行

类型推导: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。

字符串简介
基本类型表示可以运行代码的机器处理的最基本类型。但是C ++语言的主要优势之一是其丰富的复合类型集,其中基本类型仅仅是构建块。

复合类型的一个例子是string类。这种类型的变量能够存储字符序列,例如单词或句子。一个非常有用的功能!

与基本数据类型的第一个区别是,为了声明和使用此类型的对象(变量),程序需要包含在标准库(标题)中定义类型的标头:

// my first string
#include 
#include 
using namespace std;

int main ()
{
  string mystring;
  mystring = "This is a string";
  cout << mystring;
  return 0;
}

这是一个字符串
编辑并运行

正如您在前面的示例中所看到的,可以使用任何有效的字符串文字初始化字符串,就像数字类型变量可以初始化为任何有效的数字文字一样。与基本类型一样,所有初始化格式对字符串都有效:

string mystring = "This is a string";
string mystring ("This is a string");
string mystring {"This is a string"};

字符串还可以执行基本数据类型可以执行的所有其他基本操作,例如在没有初始值的情况下声明并在执行期间更改其值:

// my first string
#include 
#include 
using namespace std;

int main ()
{
  string mystring;
  mystring = "This is the initial string content";
  cout << mystring << endl;
  mystring = "This is a different string content";
  cout << mystring << endl;
  return 0;
}

这是初始字符串内容
这是一个不同的字符串内容
编辑并运行

Note: inserting the endl manipulator ends the line (printing a newline character and flushing the stream).

该class是复合类型。正如您在上面的示例中所看到的,复合类型的使用方式与基本类型相同:使用相同的语法来声明变量并初始化它们。

翻译自:
http://www.cplusplus.com/doc/tutorial/variables/

你可能感兴趣的:(C/C++)