Chapter 2.  Variables and Basic Types

1.基本内置类型(Primitive Built-in Types)

 
除了算数类型外还定义了一种称为void的特殊类型。
 
算数类型是如何在计算机中存储的?
  1. 每一个字节和一个称为地址的数关联起来
  2. 要让地址对应的字节有意义,我们需要知道存储在该地址的值得类型,从而知道需要多少位和如何解释这些位。
 
可以将算数类型的任何值赋给bool对象。0值算数类型代表false,任何非0都代表true。
 
signed and unsigned types.  前者可以表示正负0,后者只能表示非负数,即正数和0。
 
C++中,把负值赋给unsigned对象是完全合法的, -1赋给8位的unsigned char,那么结果是255,因为255是-1

对256求模后的值。

 
浮点型,float一般用一个字(32位)来表示,只能保证6位有效数字。而double型一般用两个字(64位)来表示
,至少是10位有效数字。
 
因为C++的整型数设计的很开放,就像C语言一样,能够在有必要的时候直接处理硬件,所以对大多数程序员来
说,应该通过限制实际使用的类型来忽略这些复杂性。
 
比如用整型计数的时候,当你统计标准库容器元素的个数的时候,最好用标准库为你定义的计数类型,除此之外,

使用unsiged比较明智,因为可以避免越界导致结果为负数的可能性。

1. 整型算数运算的时候,尽量别用short,以防止赋值越界,后果可能是产生一个很大的复数。
2. 用32位表示int,64位表示long的机器,会出现选择int还是long的难题, 用 long 类型进行计算所付出的

行时代价远远高于用 int 类型进行同样计算的代价,所以选择类型前要先了解程序的细节并且比较 long 类型与

int 类型的实际运行时性能代价。

3. 决定使用哪一种浮点型就容易多了。使用 double 类型基本上不会有错。在 float 类型中隐式的精度损失是不

能忽视的,而 double 类型精度代价相对于 float 类型精度代价可以忽略。事实上,有些机器上,double 类型比

float 类型的计算要快得多。long double 类型提供的精度通常没有必要,而且还需要承担额外的运行代价。

 
 
2.字面值常量 (Literal Constants)
表示内置类型的值的常量就叫做字面值常量,而类类型或者标准库类型都没有字面值。
 
整型:
    20    // decimal 10进制
    024    // octal 8进制
    0x14  // hexadecimal 16进制
    128u    /* unsigned  */          1024UL    /* unsigned long  */
    1L      /* long    */                  8Lu        /* unsigned long  */
没有short类型的字面值常量
 
浮点型(默认的浮点字面值常量为 double 类型):
    3.14159F            .001f          12.345L            0.
    3.14159E0f          1E-3F          1.2345E1L          0e0
 
布尔型的字面值 true false 
 
打印型字符的字面值
'a'     '2'     ','      ' '   
L'a'  //宽字符,wchat_t类型
 
非打印型的字符  例如  
另外,我们可以用反斜杠加数字来表示通用转义字符,注意:此处的数字默认是八进制,如需用十六进制需要
写成,xddd,d为一个或多个16进制数字组成
  7 (bell)      12 (newline)    40 (blank)
    (null)      62 ('2')        115 ('M')
 
字符串字面值 “HelloWorld”编译器自动在末尾加上一个空字符。因此'a'和"a",后者由'a'和''组成。
同理也有宽字符串,L"helloworld",里面的每一个字符都是宽字符。包括最后的。
两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字
面值:
    // concatenated long string literal
    std::cout << "a multi-line "
                  "string literal "
                  "using concatenation"
              << std::endl;
连接字符串字面值和宽字符串字面值的行为是未定义的。结果是受很多因素影响的。不要依赖未定义行为,尽
量杜绝出现。
 
C++允许用反斜杠来连接语句:
      // ok: A before a newline ignores the line break
      std::cou
      t << "Hi" << st
      d::endl;
 
          // multiline string literal
          std::cout << "a multi-line
      string literal
      using a backslash"
                    << std::endl;
          return 0;
      }
后继行的行首的空格会算到字符串里面,因此不能有缩进。
 
 
3.变量(Varible)
为什么要有变量?
  1. 变量可以重复利用并计算,减少代码冗杂。
  2. C++是强静态类型语言,在编译时会检查,操作对象是否能够被这样子操作,这种机制能使得在程序越来
越复杂的时候,帮助我们更早的发现错误。
 
什么是变量?
变量提供了程序可以操作的有名字的存储区。
 
什么是对象?
内存中具有类型的区域。
我们可以自由地使用对象描述程序中可操作的大部分数据,而不管这些数据是内置类型还是类类型,是有名字的
还是没名字的,是可读的还是可写的。
 
规定变量命名要以字母或下划线开头,变量命名习惯最重要的是保持一致
 
变量定义:
    double salary, wage;    // defines two variables of type double
      int month,
          day, year;          // defines three variables of type int
      std::string address;    // defines one variable of type std::string
 
变量初始化和赋值是两种不同的操作。直接初始化语法更灵活效率更高。
变量初始化方式是多变可以混合的,具体如下。

 #include <string>

      // ok: salary defined and initialized before it is used to initialize wage
      double salary = 9999.99,
            wage(salary + 0.01);
      // ok: mix of initialized and uninitialized
      int interval,
          month = 8, day = 7, year = 1955;
      // ok: both forms of initialization syntax used
      std::string title("C++ Primer, 4th Ed."),
                  publisher = "A-W";
extern是声明,任何变量都需要声明或定义。
 
命名一样的时候,局部变量屏蔽全局变量。
 
for(int i=0;i<2;i++) 此处的i作用域在for循环外面。
 
4.const限定符
非const变量默认为extern,所以不用显式声明为extern。但是在一个文件中的全局变量如果是const类型的
话,要让它可以在别的文件中可用,就必须显式声明为 extern const 
 
5.References引用
引用是一种符合类型,是一种别名。
 
普通引用应该绑定到它的对象上。
 
不能把普通引用绑定到const类型,只能将其定义为const引用。  const int a = 100; const int &b=a;
 
double a=1.0;
int &b = a;  // 不允许
const int &b = a; //允许。此处的a会被强制转换为int型。
 
6.typedef 名字
现有数据类型的同义词
 
7.Enumerations枚举
enum成员的值可以一样
  // point2d is 2, point2w is 3, point3d is 3, point3w is 4
    enum Points { point2d = 2, point2w,
                  point3d = 3, point3w };
 
枚举类型是唯一的类型,枚举成员是常量。不能将其他类型的值赋给枚举类型,只能在初始化的时候赋给
它,而且初始化的值也只能是常量表达式。
8.Class类

  和Struct的区别,仅仅只是默认访问级别不同,class是p'rivate,而struct默认为public。

9.头文件的编写和预处理技术
头文件用于声明而不是定义,一些const对象可以定义在头文件里的时候,是需要用常量表达式初始化的。
避免重复包含,可以用预处理器变量
    #ifndef SALESITEM_H
    #define SALESITEM_H
    // Definition of Sales_itemclass and related functions goes here   //
   #endif
   #include <standard_header>  //一般是这样来自定义头文件的,尖括号表示标准头文件

原文地址:https://www.cnblogs.com/arctanx/p/5227106.html