Chapter 2. Variables and Basic Types
1.基本内置类型(Primitive Built-in Types)

除了算数类型外还定义了一种称为void的特殊类型。
算数类型是如何在计算机中存储的?
- 每一个字节和一个称为地址的数关联起来
- 要让地址对应的字节有意义,我们需要知道存储在该地址的值得类型,从而知道需要多少位和如何解释这些位。
可以将算数类型的任何值赋给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
3.14159E0f 1E-3F 1.2345E1L 0e0
布尔型的字面值 true false  
打印型字符的字面值 
'a'     '2'     ','      ' '    
L'a'  //宽字符,wchat_t类型 
非打印型的字符  例如 \n  \b 
另外,我们可以用反斜杠加数字来表示通用转义字符,注意:此处的数字默认是八进制,如需用十六进制需要 
写成,\xddd,d为一个或多个16进制数字组成
  \7 (bell)      \12 (newline)    \40 (blank) 
    \0 (null)      \062 ('2')        \115 ('M') 
字符串字面值 “HelloWorld”编译器自动在末尾加上一个空字符。因此'a'和"a",后者由'a'和'\0'组成。 
同理也有宽字符串,L"helloworld",里面的每一个字符都是宽字符。包括最后的\0。 
两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字 
面值: 
    // concatenated long string literal
std::cout << "a multi-line "
"string literal "
"using concatenation"
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\
std::cou\
t << "Hi" << st\
      d::endl; 
          // multiline string literal
std::cout << "a multi-line \
string literal \
using a backslash"
<< std::endl;
return 0;
std::cout << "a multi-line \
string literal \
using a backslash"
<< std::endl;
return 0;
      } 
后继行的行首的空格会算到字符串里面,因此不能有缩进。
3.变量(Varible)
为什么要有变量? 
- 变量可以重复利用并计算,减少代码冗杂。
- 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
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";
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,
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>  //一般是这样来自定义头文件的,尖括号表示标准头文件 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号