cpp primer plus笔记02-处理数据

  1. 信息储存进入计算机中需要记录一下属性:

    • 信息储存位置
    • 储存信息的值
    • 储存信息的类型
  2. CPP命名规则:

    • 以两个下划线开头或者以下划线和大写字母打头的名称被保留给实现使用(编译器及其使用的资源),以一个下划线开头的名称被保留给实现,用作全局标识符,例如__fools,_Mystars3。如果使用这样的名称会导致行为的不确定性。
    • 如果想用两个或者更多的单词组成一个名称,通常的做法是用下划线将单词隔开,例如my_onions。
  3. CPP可使用的初始化语法

    • int wrens(432);
    • int hamburgers={24};
    • int emus{7};
    • int rheas={12};
    • int rocs={}; //set rocs to 0
    • int psychics{}; //set psychics to 0
  4. unsigned 本身是unsigned int的缩写

  5. int 是计算机处理起来效率最高的长度,被设置为自然长度

  6. CPP标识数字常量的基数的做法

    • 如果第一位为1-9,则基数为10,即十进制,如93是以10为基数。
    • 如果第一位为0,第二位为1-7,则基数为8,即八进制,如042为八进制,相当于十进制的34
    • 如果前两位为0x或者0X,则基数为16,即十六进制,如0x42为十六进制,相当于十进制的66.

    #include 
     int main()
     {
     	int chest = 42;
     	int waist = 0x42;
     	int inseam = 042;
     	std::cout << chest << std::endl;
     	std::cout << waist << std::endl;
     	std::cout << inseam << std::endl;
     	return 0;
     }
    

    42
    66
    34
    
    

    #include 
    int main()
    {
    	int chest = 42;
    	int waist = 42;
    	int inseam = 42;
    	std::cout << chest << std::endl;
    	std::cout << std::hex;
    	std::cout << waist << std::endl;
    	std::cout << std::oct;
    	std::cout << inseam << std::endl;
    	return 0;
    }
    

    42
    2a
    52
    
  7. CPP如何确定整数常量的数据类型:

    • 先是根据后缀:
      1. 整数后面的l或者L后缀表示该整数为long常量,例如123l,123L
      2. u或者U后缀表示为unsigned int常量,例如123u,123U
      3. ul表示unsigned long常量,例如123ul,或者123UL,或者123LU
      4. ll,或者LL后缀表示long long类型,例如123LL,123ll
      5. ull,Ull,uLL,ULL,表示unsigned long long,例如123ull,123Ull,123uLL,123ULL
    • 再考虑长度。
  8. cin和cout输入输出看作是char流,因此不适用于处理wchar_t类型,而iostream提供了可以用于处理wchar_t流的工具wcin和wcout,输出时在常量字符串加上前缀L表示宽字符串

    #include
    int main()
    {
    	wchar_t bob=L'P';
    	std::wcout<<L"tall"<<std::endl;
    	return 0;
    }
    

  9. CPP表示科学计数法的数例如1.2x103,8.33x10-4
    可以用1.2E3或者1.2e3,8.33E-4或者8.33e-4表示。

  10. using a=b; 和 auto& a=b; 在语义上是不同的。

    • using a=b; 是类型别名的语法,它将 a 定义为 b 的别名。这意味着 a 和 b 是相同的类型,它们可以互相替换使用。
    • auto& a=b; 是引用变量的声明语法,它将 a 声明为 b 的引用。这意味着 a 是 b 的别名,对 a 的修改会直接反映到 b 上
    • 所以,虽然 using a=b; 和 auto& a=b; 都可以实现类似的效果,但它们的语义是不同的。根据具体的需求和语境,选择合适的语法来使用。
  11. DBL_MANT_DIG 和 DBL_DIG 是 C/C++ 标准库中 float.h 头文件中定义的常量,用于描述 double 类型的精度。

    • DBL_MANT_DIG 表示 double 类型的尾数(mantissa)部分的二进制位数。尾数部分是浮点数的有效数字部分,它决定了 double 类型能够表示的最大精度。例如,如果 DBL_MANT_DIG 的值为 53,那么 double 类型的尾数部分将有 53 个二进制位,可以表示的最大精度为 2^(-53)。
    • DBL_DIG 表示 double 类型的十进制有效数字的最大位数。它表示 double 类型能够保证的十进制精度,即保证在转换为十进制时不会丢失精度的最大位数。例如,如果 DBL_DIG 的值为 15,那么 double 类型保证至少可以表示 15 位有效数字。
    • 总结起来,DBL_MANT_DIG 表示 double 类型的二进制精度,而 DBL_DIG 表示 double 类型的十进制精度。它们的具体数值取决于编译器和平台的实现。
  12. CPP如何确定浮点类型的数据类型:

    • 默认情况下浮点常量都属于double类型,例如8.24或者2.4E8。
    • 如果希望常量为float类型,可以使用F或者f为后缀,例如8.24f,8.24F。
    • 如果希望常量为long double类型,可以使用l或者L类型为后缀,例如8.24l,8.24L。
  13. CPP允许使用大括号的初始化,即列表初始化。但不允许以下几种初始化:


    int main()
    {
    	int x = 66;
    	char c1 = { x }; //x
    	char c2{ x };    //x
    	//从int类型转到char类型需要收缩转换。
    	char c3 = { (char)x }; //√
    	char c4{ (char)x };    //√
    	const int y=66;
    	char c5 = { y };       //√
    	char c6{ y };          //√
    	return 0;
    }	
    

  14. dynamic_cast 和 static_cast 是 C++ 中的两个类型转换操作符,用于在不同类型之间进行转换。它们有一些区别和适用场景:

    • dynamic_cast:用于将基类指针或引用转换为派生类指针或引用。它在运行时进行类型检查,如果转换失败,返回空指针(对指针进行转换)或抛出 std::bad_cast 异常(对引用进行转换)。这个运行时的类型检查使得 dynamic_cast 可以安全地进行多态类型转换。使用 dynamic_cast 时,目标类型必须是多态类型,即要求基类必须有虚函数。
      Base* basePtr = new Derived();
      Derived* derivedPtr = dynamic_cast<derived*>(basePtr);	
      

    • static_cast:用于进行静态类型转换,它在编译时进行类型检查,不进行运行时的安全性检查。static_cast 可以用于不同类型之间的基本类型转换、显式转换、向上转型(将派生类指针或引用转换为基类指针或引用)和向下转型(将基类指针或引用转换为派生类指针或引用),但它不能进行多态类型转换。使用 static_cast 需要注意转换的安全性,因为它没有运行时的类型检查。例如:
      int a = 10;
      double b = static_cast<double>(a);
      Base* basePtr = new Derived();
      Derived* derivedPtr = static_cast<derived*>(basePtr);
      

    • 强制类型转换:强制类型转换是 C 风格的类型转换,使用时需要用括号括起来,并且不进行任何类型检查。强制类型转换可以进行任意类型的转换,包括不相关的类型之间的转换。这种转换非常危险,容易引发未定义行为,应当尽可能避免使用。例如:
      	int a = 10;
      	double b = (double)a;
      	double c = double(a);
      

  15. 类型检查:

    • 类型检查的目的是为了防止类型错误的发生,例如将一个整数赋值给一个字符串变量,或者将一个函数的返回值赋值给一个不兼容的变量等。通过对代码进行类型检查,可以在编译或运行时发现这些类型错误,并提前进行修正,从而避免在程序执行过程中出现潜在的类型相关问题。
    • 静态类型检查:在编译阶段进行类型检查,通过分析源代码的静态信息来判断类型是否匹配。静态类型检查可以发现一些常见的类型错误,并在编译时发出错误提示,从而提早发现问题。
    • 动态类型检查:在程序运行时进行类型检查,通过在运行时对变量和表达式的类型进行检查来判断类型是否匹配。动态类型检查可以处理一些需要在运行时才能确定的类型相关问题,但由于在运行时进行检查,可能会带来一定的性能开销。

你可能感兴趣的:(c++,c++,笔记)