2019.04.27第二遍
1.一个int至少和一个short一样大,一个long至少个一个int一样大,一个long long 至少和一个long一样大。
2.带符号类型可以表示正数、负数或0,无符号类型则仅能表示大于等于0的值。
3.一般来说,float类型有7个有效位,double类型有16个有效位。
(float至少有6个有效位,double至少有10个有效位)
利率:double(float和double的计算代价相差不大,对于某些机器,double更快)
本金:long long (不清楚你是不是想买豪宅)
付款:long long (同上)
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; // 32
std::cout << u - u2 << std::endl; // 2^32 - 32
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; // 32
std::cout << i - i2 << std::endl; // -32
std::cout << i - u << std::endl; // 0
std::cout << u - i << std::endl; // 0
#include
int main()
{
unsigned u = 10, u2 = 42;
int i = 10, i2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
std::cout << i2 - i << std::endl;
std::cout << i - i2 << std::endl;
std::cout << i - u << std::endl;
std::cout << u - i << std::endl;
return 0;
}
(a) 'a', L'a', "a", L"a" //
字符字面值:char ;宽字符型字面值: wchar_t; 字符串字面值 ; 宽字符串字面值
(b) 10, 10u, 10L, 10uL, 012, 0xC
int , unsigned int , long , unsigned long, 八进制,16进制
(c) 3.14, 3.14f, 3.14L
double, float, long double
(d) 10, 10u, 10., 10e-2
int , unsigned int, 浮点型字面值, 科学计数法
int month = 9, day = 7;
int month = 09, day = 07;
有区别,上面的day为10进制,下面的day为8进制。
(a) 只知道/145和/012构成转义字符
(b)long double型加科学计数法 31.4
(c) float型1024.0
(d) long double型3.14
#include
int main()
{
std::cout << "2\x4d\n" << std::endl;
std::cout << "2\t\x4d\n" << std::endl;
return 0;
}
(a) 错误。未定义的input_value,改为 int input_value; std::cin >> input_value;
(b) 错误。从double到int 需要收缩变换
(c) =从右向左结合,wage未定义类型
(d) 可以运行。
std::string global_str;
int global_int;
int main()
{
int local_int;
std::string local_str;
}
定义于任何函数体之外的变量被初始化为0,故global_str = "0", global_int = 0。
定义在函数体内部的内置类型变量不被初始化,故local_int, local_str值未定义。
(a)定义
(b)声明并定义
(c)声明
(a)非法
(b)合法
(c)非法
(d)非法
(e)合法
100
合法
输出:100 45
for循环定义的i到结束循环就不能使用了,故i输出为100
(a)不太好,但是可以。
(b)不合法,引用类型的初始值必须是一个对象
(c)合法
(d)不合法,引用必须被初始化
(a)给d赋值为3.14159
(b)可以,不太好。把int类型的i的值赋给double类型d
(c)不合法,
(d)不合法,r1的初始值必须为int型对象
10 10
#include
int main()
{
int i = 12;
int *p = &i;
// 修改指针的值
std::cout << p << std::endl;
p++;
std::cout << p << std::endl;
/* 修改指针所指对象的值
std::cout << *p << std::endl;
(*p)++;
std::cout << *p << std::endl;
*/
return 0;
}
指针:允许赋值和拷贝;在生命周期内可以指向不同对象;不需要在定义时赋初值。
引用: 不能定义引用的引用;定义引用时程序是把引用和它的初始值绑定在一起,不是拷贝;引用必须被初始化。
把i乘以2
(a)非法,试图把int型对象的地址赋给double型指针
(b)非法,不能把int变量直接赋给指针
(c)合法,把i的地址赋给指针ip
if(p) // ... 如果指针不为空,则进行下面的语句
if(*p) //... 如果指针指向的值不为空,则进行下面的语句
先用*p将指针所指对象的值输出,如果报错,则说明指针指向无效的对象,然后用if(p == NULL)进行判断。
void*指针可用于存放任意对象的地址;而lp指针为long型,不能存在int类型的对象的地址。
(a)ip为int型指针,i为int型变量,r为对int型变量i的引用
(b)i为int型变量,ip为所指对象的值为0的int型指针
(c)ip为int型指针,ip2为int型变量
(a)不合法,const对象必须初始化
(b)合法
(c)合法
(d)++sz不合法 const对象不能改变值
(a)不合法,不能为非常量引用绑定字面值
(b)合法
(c)合法
(d)合法
(e)合法
(f)不合法,引用必须初始化
(g)不合法,这样可通过修改r的值来修改i2的值
(a)i为int类型的变量,cp为int类型的常量指针
(b)p1为int类型指针,p2为int类型常量指针
(c)ic为int类型常量,r为整形常量引用
(d)p3为指向int类型常量的常量指针
(e)p为指向int类型常量的指针
(a)不合法,不能把常量赋给变量
(b)不合法,同上
(c)不合法,同上
(d)合法
(e)合法
(f)不合法,左边应是变量,不能为常量
const int v2 = 0; // 顶层const
int v1 = v2; // 不合法
int *p1 = &v1, &r1 = v1; // 没有
const int *p2 = &v2, *const p3 = &i, &r2 = v2; // p2为底层const
//p3靠右的为顶层const,靠左的为底层const
r1 = v2; // 不合法
p1 = p2; // 不合法
p2 = p1; // 合法
p1 = p3; // 不合法
p2 = p3; // 不合法
不合法
int null = 0, *p = &null;
a = 42; // 合法
b = 42; // 合法
c = 42; // 合法
d = 42; // 不合法
e = 42; // 不合法
g = 42; // 不合法
const int i = 42;
auto j = i; const auto &k = i; auto *p = &i;
const auto j2 = i, &k2 = i;
(1)j是一个整数(i的顶层const特性被忽略掉了)
(2)k是一个整形常量引用
(3)p是一个指向int类型指针的指针
(4)j2是一个int类型的常量,k2是常量引用
程序如下:
#include
int main()
{
const int i = 42;
auto j = i;
const auto &k = i;
auto *p = &i;
const auto j2 = i, &k2 = i;
std::cout << j << " " << k << " " << p << " "
<< j2 << " " << k2 << std::endl;
return 0;
}
int a = 3, b = 4;
decltype(a) c = a;
decltype ((b)) d = a;
++c; // c为int类型,值为4
++d; // d为int&, 值为4
int a = 3, b = 4;
decltype(a) c = a; // c为int类型,值为3
decltype(a = b) d = a; // d为int&,值为4
区别:
decltype:如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内)
auto:auto一般会忽略顶层const
例子:
一样:int a = 3; decltype (a) b = a; auto b = a;
不一样:const int a = 3; decltype(a) b = a; auto b = a;
struct Sales_data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
// 书上把想的写出来了,“最好”两字说明可以和书上一样~