[セットトップ]C++Primer学習ノート_17_式(続き1)--矢印、条件、sizeof、カンマ式、複合式の評価



式#シキ#
--矢印、条件、sizeof、カンマ式および複合式の評価
1、C++は、ポイントオペレータと参照オペレータを含む式に同義語を提供します.矢印オペレータ(->)
[cpp] view plain copy print ?
Sales_item *sp = &item;  
  • (*sp).same_isbn(item_other);  

  • sp -> same_isbn(item_other);//前の文と同じ
    	Sales_item *sp = &item;
    	(*sp).same_isbn(item_other);
    	sp -> same_isbn(item_other);	//        
    

    [cpp] view plain copy print ?
    //P 142練習問題5.18
  • int main()  

  • {  
  •     vector strVec;  

  •     string value;  
  •   

  •     while (cin >> value)  
  •     {  

  •         string *pstr = new string;  
  •         *pstr = value;  

  •         strVec.push_back(pstr);  
  •     }  

  •   
  •     for (vector::iterator iter = strVec.begin(); iter != strVec.end(); ++iter)  

  •     {  
  •         cout << **iter << " size: " << (**iter).size() << endl;  

  •     }  
  •   

  •     for (vector::iterator iter = strVec.begin(); iter != strVec.end(); ++iter)  
  •     {  

  •         delete *iter;  
  •     }  

  •   
  •     return 0;  

  • }  
    //P142   5.18
    int main()
    {
    	vector<string *> strVec;
    	string value;
    
    	while (cin >> value)
    	{
    		string *pstr = new string;
    		*pstr = value;
    		strVec.push_back(pstr);
    	}
    
    	for (vector<string *>::iterator iter = strVec.begin(); iter != strVec.end(); ++iter)
    	{
    		cout << **iter << " size: " << (**iter).size() << endl;
    	}
    
    	for (vector<string *>::iterator iter = strVec.begin(); iter != strVec.end(); ++iter)
    	{
    		delete *iter;
    	}
    
    	return 0;
    }
    

    2、条件式の優先度はかなり低く、通常はカッコで式を拡大する必要があります
    [cpp] view plain copy print ?
    cout << (i < j ? i : j) << endl;  
  • cout << (i < j) ? i : j << endl; //ERROR  

  • cout << i < j ? i : j << endl;       //ERROR  
    	cout << (i < j ? i : j) << endl;
    	cout << (i < j) ? i : j << endl;	//ERROR
    	cout << i < j ? i : j << endl;		//ERROR
    

    [cpp] view plain copy print ?
    //P 144練習問題5.21
  • int main()  

  • {  
  •     vector ivec;  

  •     int value;  
  •   

  •     freopen("input.txt","r",stdin);  
  •     while (cin >> value)  

  •     {  
  •         ivec.push_back(value);  

  •     }  
  •   

  •     for (vector::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)  
  •     {  

  •         *iter = (*iter % 2 ? *iter * 2 : *iter);  
  •         cout << *iter << ' ';  

  •     }  
  •     cout << endl;  

  • }  
    //P144   5.21
    int main()
    {
    	vector<int> ivec;
    	int value;
    
    	freopen("input.txt","r",stdin);
    	while (cin >> value)
    	{
    		ivec.push_back(value);
    	}
    
    	for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
    	{
    		*iter = (*iter % 2 ? *iter * 2 : *iter);
    		cout << *iter << ' ';
    	}
    	cout << endl;
    }
    

    3、sizeofオペレータ
    sizeofオペレータは、オブジェクトまたはタイプ名の長さを返し、戻り値タイプはsize_t,長さ単位はバイトである.
    sizeof式の結果はコンパイル時定数です.
    [cpp] view plain copy print ?
    Sales_item item,*pi;  
  • cout << sizeof(Sales_item) <<  endl;  

  • cout << sizeof item << endl;  
  • cout << endl;  

  •   
  • cout << sizeof(pi) << endl;  

  • cout << sizeof(*pi) << endl;  
  • cout << endl;  

  •   
  • cout << sizeof(9 + 8) << endl;  

  • cout << endl;  
  •   

  • char *p = new char[50];  
  • cout << sizeof(p) << endl;  

  • cout << sizeof(*p) << endl;  
  • cout << endl;  

  •   
  • char arr[50];  

  • cout << sizeof(arr) << endl;  
  • cout << sizeof(*arr) << endl;  

  • cout << sizeof(char) << endl;  
  • cout << endl;  

  •   
  • Sales_item &refiterm = item;  

  • cout << sizeof(refiterm) << endl;  
        Sales_item item,*pi;
        cout << sizeof(Sales_item) <<  endl;
        cout << sizeof item << endl;
        cout << endl;
    
        cout << sizeof(pi) << endl;
        cout << sizeof(*pi) << endl;
        cout << endl;
    
        cout << sizeof(9 + 8) << endl;
        cout << endl;
    
        char *p = new char[50];
        cout << sizeof(p) << endl;
        cout << sizeof(*p) << endl;
        cout << endl;
    
        char arr[50];
        cout << sizeof(arr) << endl;
        cout << sizeof(*arr) << endl;
        cout << sizeof(char) << endl;
        cout << endl;
    	
        Sales_item &refiterm = item;
        cout << sizeof(refiterm) << endl;
    

    4、カンマオペレータ
    カンマ式は、左から右に計算されるカンマで分割された式のセットです.ただし、カンマ式の結果は、その右端の式の値です.
    5、複合式の優先度と結合性は、式のどの部分がどのオペレータのオペランドとして使用されるかを決定しますが、優先度を上回るため、カッコを使用して特殊なグループを強制的に実現することもできます.
    6、評価順
    を除いて演算子以外のオペレータの演算順序は指定されていません.
    オペレータの2つのオペランドが同じオブジェクトに関連し、その値が変更されると、オペランドの計算順序が結果に影響します.
    C++は計算が左から右になることを保証しません!
    【P 149提案:複合式の処理は一読に値する!】
    1つの式では、2つ以上のサブ式で同じオブジェクトを自己増加または自己減少させないでください.