C++ Primer 第2章 变量和基本类型 复习笔记

第2章 变量和基本类型

2.1 基本内置类型

2.1.1 算数类型

这一小节介绍了C++中基本算数类型

2.1.2 类型转换

变量赋值大多都能转换成相应类型
下面是几个比较坑的点:

  • 类型转换向 0 取整 (C++11)

将浮点型赋值给int型时,int型是直接舍去小数部分

// 最终i=1
double d=1.5;  
int i=d; 

当d是负数时

// 最终i=-1
double d=-1.5;  
int i=d; 
  • int相除也是向0取整

当结果是正数

// 5 / 3 = 1.67
// 此时 c = 1 向 0 取整
int a = 5, b = 3;
int c = a / b;

当结果是负数

// -5 / 3 = -1.67
// 此时 c = -1 向 0 取整
int a = -5, b = 3;
int c = a / b;
  • 求余运算和求模运算

求余运算和求模运算概念很相似,容易混淆

不同点:

求余运算商向0取整
如-5对3求余:

(-5) / 3 = -1
(-5) mod 3 = -5 - (3 * (-1)) = -2

求余运算商向0取整
如-5对3求余:

(-5) / 3 = -2
(-5) mod 3 = -5 - (3 * (-2)) = 1

  • C++中的%是 求余运算 符 不是求模运算符
// a的最终结果是-2
// 在c和cpp中 除法是向0取整
// (-5) / 3 = -1
// 所以 (-5) mod 3 = -5 - (3 * (-1)) = -2
int a = (-5) % 3;
  • 对unsigned类型赋负值 会进行 求模运算
// unsigned char 保存 0~255 共 256 个数
// 对其赋-1
// -1先对256取模 注意是取模 得到255
// 再将 255 赋值给 c
unsigned char c = -1;
// 对无符号类型赋有符号值将会发生如此转换
  • 坑爹的无符号类型

无符号类型和有符号类型进行四则运算时 编译器会先将有符号类型转化为无符号类型
若有符号类型有赋值 则会执行上述对容量求模运算

unsigned u = 10;
int i = -42;
// r是unsigned
// 在int是32bits时 结果为4294967264
// 显然结果不符合预期
auto r = u + i;

unsigned有可能影响for循环

// 这个循环永远也不可能停下 因为unsigned永远不可能<0
for (unsigned u = 10; u >= 0; --u)
{
    std::cout << u << std::endl;
}

因此 再使用unsigned时特别要注意上述两点

你可能感兴趣的:(C++,Primer,学习笔记,c++,cpp)