(C++)i++とi++の左、右の問題について
1168 ワード
1、左と右の値は何ですか.
左の値は式の左側に現れる値(等号の左側)で、データ値を格納するメモリのアドレスであり、変数のアドレスとも呼ばれる.
右の値は、あるメモリアドレスに格納されたデータであり、変数とも呼ばれるデータである.
左の値は右の値として使用できますが、右の値は左の値ではありません.
そのため、アドレスを取るには左の値しかありません.
2、二つの質問を挙げます.
int i = 0;
(i++)+=i;//エラー
(++i)+=i;//正しい
int *ip = &(i++);//エラー
int *ip = &(++i);//正しい
3、どうしてi++は左の値にできないのですか.
i++とi++の実現を見るとわかります.
簡単に理解すると、i++は一時変数を返し、関数が戻った後にアドレスされて得られず、アドレスではなくデータ値であるため、左値として使用できない.
より簡単なコード解釈:
参考記事:
http://blog.csdn.net/zlhy_/article/details/8349300
左の値は式の左側に現れる値(等号の左側)で、データ値を格納するメモリのアドレスであり、変数のアドレスとも呼ばれる.
右の値は、あるメモリアドレスに格納されたデータであり、変数とも呼ばれるデータである.
左の値は右の値として使用できますが、右の値は左の値ではありません.
そのため、アドレスを取るには左の値しかありません.
2、二つの質問を挙げます.
int i = 0;
(i++)+=i;//エラー
(++i)+=i;//正しい
int *ip = &(i++);//エラー
int *ip = &(++i);//正しい
3、どうしてi++は左の値にできないのですか.
i++とi++の実現を見るとわかります.
// :
int& int::operator++() // ,
{// , 1
*this += 1; //
return *this; //
}
// :
const int int::operator++(int) // , 。
{// ,
int oldValue = *this; //
++(*this); //
return oldValue; //
}
簡単に理解すると、i++は一時変数を返し、関数が戻った後にアドレスされて得られず、アドレスではなくデータ値であるため、左値として使用できない.
より簡単なコード解釈:
// i++:
{
int tmp;
tmp=i;
i=i+1;
return tmp;
}
// ++i:
{
i=i+1;
return i;
}
参考記事:
http://blog.csdn.net/zlhy_/article/details/8349300