C++之变量与基本类型(三)

本文记录了C++中与变量与基本类型相关的容易遗忘的一些知识。


变量


基本类型

整数类型

short, int, long, long long

C++标准规定:

  • short 至少 16 位;
  • int至少与short一样大;
  • long至少32位并且至少和int一样大;
  • long long至少64位且至少和int一样大。

初始化

C++ 有不同与C的初始化语法:

1
2
int owls = 101; // traditional C initialization, sets owls to 101
int wrens(432); // alternative C++ syntax, set wrens to 432

如果不对函数内部定义的变量进行初始化,该变量的值就是不确定的。这意味着其值取决于在该变量创建之前恰好存放在那个内存位置的数据。

C++11初始化的其他方式:

1
2
3
4
5
int emus{7}; // set emus to 5
int rheas = {12}; // set rheas to 12

int rocs = {}; // set rocs to 0
int psychics{}; // set psychicsto 0

通用字符名(Universal Character Names)

使用通用字符名称类似于使用转义序列。通用字符名称以\u\U开头。\u形式后接8个十六进制数字,\U形式后接16个十六进制数字。这些数字代表该字符的ISO 10646编码点。

如果你的实现支持扩展字符,你可以在标识符、字符常量和字符串中使用通用字符名。例如,以下代码:

1
2
int k\u00F6rper;
cout << "Let them eat g\u00E2teau.\n";

ö的ISO 10646编码点是00F6,â的编码点是00E2。因此,这段C++代码会将变量name设置为körper,并显示以下输出:

Let them eat gâteau.

wchar_t

cincout将输入和输出视为由字符(char)流组成,因此它们不适合处理wchar_t类型。iostream头文件提供了wcinwcout的形式,用于处理wchar_t流。此外,你可以在宽字符常量或字符串前加上L来表示它们。下面的代码将字母Pwchar_t版本存储在变量bob中,并显示单词tallwchar_t版本:

1
2
wchar_t bob = L'P'; // a wide-character constant
wcout << L"tall" << endl; // outputting a wide-character string

char16_tchar32_t

C++11 对 char16_t 字符和字符串常量使用 u 前缀,例如 u'C'u"be good"。同样,它对 char32_t 常量使用 U 前缀,例如 U'R'U"dirty rat"char16_t 类型自然匹配 \u00F6 形式的通用字符名,而 char32_t 类型自然匹配 \U0000222B 形式的通用字符名。

前缀uU分别用于表示char16_tchar32_t类型的字符字面量:

1
2
char16_t ch1 = u'q'; // basic character in 16-bit form
char32_t ch2 = U'\U0000222B'; // universal character name in 32-bit form

wchar_t类似,char16_tchar32_t各自都有一个底层类型,该类型是内置整数类型之一。但在一个系统上,其底层类型可能与另一个系统上的不同。

浮点数类型


const 修饰符

const之于#define的优势

  • 它允许显式地指定类型。

  • 你可以利用C++的作用域规则将定义限制在特定的函数或文件中。

  • 可以将const用于更复杂的类型,如数组和结构体。


类型转换

自动类型转换发生时机

  • 当你将一种算术类型的值赋给另一种算术类型的变量时,C++会进行值的转换。

  • 当你在表达式中组合混合类型时,C++会进行值的转换。

  • 当你向函数传递参数时,C++会对值进行转换。

显示类型转换

两种形式:

1
2
(typeName) value // converts value to typeName type
typeName (value) // converts value to typeName type

第一种形式是纯C语言形式。第二种形式是纯C++形式。这种新形式背后的理念是让类型转换看起来像函数调用。这使得内置类型的类型转换看起来与你可以为用户定义的类设计的类型转换相似。

四种运算符:

1
static_cast<typeName> (value) // converts value to typeName type