C++Primerノート1---chapter 2誤りやすい点


1.C++でcharの記号の有無は不確定で、デフォルトのタイプはコンパイラによって決定され、unsigned or signedの説明を表示する必要があります.以前本科卒業後にcontikiをcc 2530に移植した時、この問題による死循環に遭遇したことがある.
2.浮動小数点用doubleでは、10桁の有効数字(floatは精度が足りないことが多いが、オーバーヘッドが少ない)があり、long doubleは一般的に必要ありません.
3.符号なしタイプに範囲を超えた値を付与し、結果は型取り後の結果であり、符号付きタイプに範囲を超えた値を付与した結果は定義されていない
//   255
unsigned char c1=-1;

//      
signed char c2=256

4.算術式に符号数もint値もない場合、このint値は自動的に符号なしタイプに変換されます.符号なしから値を減算するには、結果が負の値でないことを確認する必要があります(負の値の場合は自動的に型を取ります.1のように).
5.注意8進法は0の先頭であり、例えば024は8進法(oct)、0 x 24は16進法(hex)、24は10進法(dec)を表す.また小数は科学技術で表記すれば指数部はE or eで表すことができる(0.0 e 0.001はいずれも可能)
6.汎用化されたエスケープ文字:xの後に1つ以上の16進数(最大4つを超えない、超えたものは個別の他の文字で計算)を使用し、の後に1つ、2つ、3つの8進数(同様に、超えたものは他の個別の文字で計算)を使用します.
7.初期化の問題:c++11は括弧形式のリストを初期化することができ、この形式はデータを失う可能性のあるタイプの変換を許さない
また、関数内に定義された組み込みタイプオブジェクトの初期化が行われていない場合は、その値は定義されていません.クラスのオブジェクトに対して初期化が表示されず、その値はクラスによって決定されます.
long double ld=3.1315926536

int a{ld},b={ld};        //  :     ,             

int c(ld),d=ld;          //  :    ,         。            

8.表示初期化を含む宣言は、定義となります.
extern int i;    //  i    i

extern double pi=3.1416;    //  

9.役割ドメイン文字の左側にドメイン名がない場合、グローバル役割ドメインに要求し、シンボルの右側の名前を要求する(グローバル役割ドメインに名前がない;同じ名前のローカル変数がある場合、グローバルのみ使用する)
10.ポインタと参照の最大の違い:参照は1つのオブジェクトではなく(参照されていない参照など)、参照を定義するだけでは他のオブジェクトにバインドできません.ポインタ自体はオブジェクトであり、これらの制限はありません(空のポインタの場合nullptrは0、NULLも0であり、後者はcstdlibを含む必要があります).
//i int   ,p   ,r   
int i=1024,*p=&i,&r=i;


//b          (      ,  &b  b   ,  *        )
int *a;
int *&b=a;

int c=10;
b=&c;

11.複数のファイル間でconstオブジェクトを共有する場合は、変数定義の前にexternを追加する必要があります.定義に追加することに注意してください.他のファイルで参照するにはextern宣言を使用します.(定数の場合、constはコンパイル中に値を置き換え、マクロはプリコンパイル中に値を置き換えることを定義します)
12.定数、フォント値の参照はすべて定数(すなわち定数参照)でなければならない.constで修飾する必要がある.ポインタも同様であるが、フォント値を指すことはできない.式(すなわち、ポインタのタイプは指向されたオブジェクトタイプと一致しなければならないが、定数ポインタは変数を指すことができる)
int i=42;
const int &r1=i;    //  ,    
const int &r2=42;   //  ,        
const int &r3=i*2;  //  
int &r4=r1*2;       //  

13.
最上位const:ポインタ自体は定数です(ポインタ定数と呼ばれますが、C++Primerではポインタ自体が定数のものを定数ポインタと呼びます)
下位const:ポインタが指すオブジェクトは定数(定数ポインタ)です.
//   int *           , const      ,       (     ,    )

int i=0;
int *const p1=&i;    //  const,         const     ,  *          

const int ci=42;
const int *p2=&ci;    //  const,           

const int *const p3=p2;//      const,      const
const int &r=ci;       //     const    const,          (             ,         )

14.定数式コンパイル中に計算結果が得られる式
const int a=1;     //a      
const int b=a+1;  //b      
int c=12;          //    ,            
const int sz=get_size();    //           ,       


// c++ 11    constexpr    ,                    
constexpr int mf=20;            //20      
constexpr int limit=mf+1;      //mf+1      
constexpr int sz=size();        // size()   constexpr   ,       

constexprとポインタが機能する場合:常に最上位ポインタを宣言します(ポインタ自体の値、すなわち格納されているアドレスは変更できません)
const int *p=nullptr;      //p            
constexpr int *q=nullprt;  //q            

15.タイプ別名:2つの方法
//1、  typedef
typedef double wages;        //wages double    
typeder wages base,*p;       //base double    ,p double *    

//2、  using
using SI = Sales_item;

エラーポイント:元の定義を直接持ち込まないでください
typedef char *pstring;
const pstring cstr=0;//cstr       ,           ,     (        )


//        ,           
const char *cstr=0;  //cstr     const char   ,    const

16.autoとdecltypeの違い
auto:コンパイラは変数のタイプを推測し、一般的には最上位const(自分を修飾し、右から左へ1つ目)を無視し、最上位constは残ります.
//  auto        
auto i=0,*p=*i;    //  :i int,p int *
auto sz=0,pi=3.14; //  :sz pi     

//  const     
const int ci=i,&cr=ci;

auto b=ci;    //b int  ,ci   const     
auto c=cr;    //c int  ,cr ci   , ci    const
auto d=&i;    //d int *  
auto e=&ci;   //e     

decltype:内部式がどのタイプであるかは、どのタイプを返します.ポインタ解リファレンスが返すタイプのリファレンスに注意!!!decltype内で二重カッコで返されるのは常に参照タイプです
//1.decltype  
const int ci=0,&cj=ci;
decltype(ci) x=0;    //x const int   
decltype(cj) y=x;    //y const int &  ,y   x 
decltype(cj) z;      //  :z     ,     

//2.decltype   
int i=42,*p=&i,&r=i;
decltype(r+0) b;    //  :b      int  
decltype(*p) c;    //  :           ,         ,  c int &  ,  int

//3.            
decltype((i)) d;    //  :d int &,     
decltype(i) e;      //  :e        int

17.クラス内の初期値には、等号またはカッコで値を割り当てる必要があります.カッコでは使用できません.