sizeof

1
2
int n = 75; // int n{75}; int n(75); int n = {75};
cout << sizeof(int) << endl;

sizeof() 查看类型或变量的长度,单位为 字节

integral types

  • short 至少 16位
  • int 至少与 short 一样长
  • long 至少 32 位且至少与 int 一样长
  • long long 至少 64 位,且至少与 long 一样长

头文件 climits 中定义了符号常量来表示类型的限制

1
2
3
4
5
6
7
8
9
10
int n = 75;

cout << dec; // dec 控制符,输出十进制
cout << n << endl;

cout << oct; // oct 控制符,输出八进制
cout << n << endl;

cout << hex; // hex 控制符,输出十六进制
cout << n << endl;

如果知道变量不可能为负数,尽量使用无符号类型

character

也是一种整型

1
2
3
4
5
6
7
8
9
char ch = 'Q';
int i = ch;
cout << "The ASCII code for " << ch << "is" << i <<endl;

ch = ch + 1;
i = ch;
cout << "The ASCII code for " << ch << "is" << i <<endl;

cout.put(ch); // 可以使用 put 函数输出

boolean

cout 通常在显示 bool 值之前将它们转换为 int,但 cout.setf(ios::boolalpha) 函数调用设置了一个标记,该标记命令 cout 显示 truefalse,而不是 1 和 0

floating-point types

  • float 至少 32 位
  • double 至少 48 位,且不少于 float
  • long double 至少和 double 一样多

通常 float 32 位,double 为 64 位,long double 为 80、96 或 128 位,这 3 种类型的指数范围至少是 -37 到 37

头文件 cfloatfloat.h 中定义了系统限制

cout.setf(ios_base::fixed, ios_base::floatfield); 中的 ios_base::fixed 能防止程序把较大的值切换为指数表示法,ios_base::floatfield 使程序显示到小数点后 6 位

使用 double 类型来进行浮点数运算,因为 float 类型精度低

变量初始化

1
2
3
4
int units_sold = 0;
int units_sold = {0}; // list initialization,列表初始化
int units_sold{0}; // list initialization,列表初始化
int units_sold(0);

列表初始化是 C++11 新特性,通常用于给复合数据类型提供值列表,该初始化方式不允许缩窄(narrowing)

1
2
3
4
5
6
7
8
const int code = 66;
int x = 66;
char c1 {31325}; // narrowing,not allowed,越界
char c2 = {66}; // allowed
char c3 {code}; // allowed
char c4 = {x}; // not allowed,不是 constant,x 可能会改变
x = 31325;
char c5 = x; // allowed by this form of initialization,没有列表初始化严格

输入

直接输入字符串会将空格、制表符和回车符判定为分隔符,那么使用行输入 cin.getline() 可以解决该问题

1
cin.getline(name, 20); // 最多读取 19 个字符

cin.get() 也是行输入,但是并不读取换行符(cin 也不读取换行符),会将其保留在缓冲区,但是使用不带任何参数的 cin.get() 可以读取下一个字符,即便是换行符

1
2
3
4
5
cin.get(name, ArSize);
cin.get(); // 读取换行符

// 也可以合并在一起写
cin.get(name, ArSize).get(); // 因为 cin.get() 返回一个 cin 对象,然后该对象继续调用 get() 函数

cin 也不读取换行符

1
2
3
4
5
6
int year;

cin >> year;
cin.get();
// 或
(cin >> year).get();

getline() 读取并赋值给 string 类

1
2
string qwt;
getline(cin, qwt);

cin.getline()cin.get() 最好使用 cin.get()

输入错误类型时 cin 会返回 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(!cin)
{
cin.clear()
while(cin.get() != '\n')
continue;
cout << "Bad input: input process terminated." << endl;
}

while (!(cin >> qwt[i])) // !cin 能够判断是否输入成功
{
cin.clear();
while (cin.get() != '\n');
cout << "Please enter a number: ";
}