Thinking in C++--第三章 平时不太注意的编程细节

Thinking in C++--第三章 平时不太注意的编程细节
1)Switch(selector){
                 case value1:statement;break;
                 case value1:statement;break;
     }
     selector必须是产生整数值的表达式。不能使用字符串类型对象。
2)运算符优先级
     首先说,这是笔试的时候经常考的问题。为什么你就不能写的规范清晰些,非要!++a--&b这样写呢亲?加个括号会死么?!!!你鼓励你的员工都写成这个样子么?
3)没有long float类型,只有 long int 和 long double
4)连续分配的变量在内存中是连续存放的。

5)局部变量
           也称为自动变量,因为在进入作用域的时候自动生成,离开作用域后自动消失。auto类型。
6)寄存器变量
           register,告诉编译器,尽可能快地访问这个变量。只是一个暗示,不能保证变量放在寄存器中。限制:不能得到其地址。
7)静态变量
           static,初始化只在函数第一次调用时执行,函数调用之间变量的值不变。在函数范围外不可见。
                      在某个作用域外不可访问:一、在所有函数外部,表示”在文件的外部不可以用该名字“;二、在函数内部表示”在函数外部不可以用该名字“
8)外部变量
           extern
9)内部连接
          只对正在编译的文件创造存储空间。用内部连接,其他文件可以使用相同的标识符或者全局变量,连接器不会发现冲突,也就是为每一个标识符创建单独的空间。内部连接由static指定。
10)外部连接
         为所有被编译过的文件创建一片单独的存储空间。全局变量和函数有外部连接, 用extern可以从其他文件访问它们。连接器不知道自动变量,他们只临时存在于栈上。

11)volatile变量
         告诉编译器”不知道何时会改变“
12)打印二进制格式:

void PrintBinary( const unsigned  char val)
{
      for( int i = 7; i >= 0; i--)
         if(val & (1 << i) )
           cout <<"1";
     else
           cout <<"0";
12)逗号运算符,只产生最后一个表达式的值。


13)C++中的类型转换
       1) static_cast 静态类型转换,非强制转换,窄化转换(非向下转换,那是dynamic_cast的工作),void* 的强制转变,隐式类型变换和雷层次的静态定位(向上转换)
   2) const_cast 常量转换从const转为非const, 或者从volatile转为非volatile
        const   int  i  =   0 ;
int* j = ( int*)&i; // cannot convert a parament from const int* to int*
int& j = const_cast< int*>(&i);

long* l = const_cast< long*>(&i); // Error

        3) reinterpret_cast重解释转换,最不安全,最容易出问题。一般是指针间的转换。
   4) dynamic_cast 动态类型转换,运行期判断该转换是否正确。
14)enum{circle, square, rectangle};
15) 指针和数组
void func1( int a[],  int size)
{
   for( int i = 0;i < size; i++)
    a[i] = i;
}

void func2( int* a,  int size)
{
  for( int i = 0;i < size; i++)
    a[i] = i;
}
第一个明显更容易让人明白这是传递的一个数组,数组一般都采用传地址的方式。
16)把变量和表达式转换成字符串
#define PR(x) cout << #x "=" <<x <<"\n";
相当于cout <<“ a= "<<a << endl;


















1

你可能感兴趣的:(Thinking in C++--第三章 平时不太注意的编程细节)