- ベストアンサー
C++プログラム問題(初心者です)
C++の勉強初めて1ヶ月ぐらいです。 以下にある問題がわかりません。 解説付きでお願いします。 [問題] 関数 funcのみを修正することで、標準出力に 2 が表示する。 [プログラム] #include <iostream> using namespace std; int func(int i) {return i;} int main() { int i = 1; cout << ++func(i) << "\n"; return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
int& func(int& i) { return i; } とすれば出力が2になります。 【解説】 インクリメント演算子++が適用できるのは、変数のみです。 例えば、int i=0; i++; のように。 問題の 旧関数 int func(int i) {return i;} を用いて ++func(i) とすると、func(i)の部分が数字の1に置き換わり、++1 という形になります。 つまり、変数ではなく、数字に++演算子を使ってしまったわけです。 (この数字を即値と言います) これを解決する方法が参照演算子&を用いた int& func(int& i) { return i; } です。 これは、++func(i) をすると、 main( )中の変数 i "そのもの"を引数にとり、 main()中の変数 i "そのもの"を返す関数です。 上の例と異なり、func(i)の部分が変数i に置き換わり、++i という形になります。 これならば、「インクリメント演算子++が適用できるのは、変数のみです。」 というルールに反しません。
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
> 上記の場合どのようなプログラムになるのでしょうか? > プログラムを記述していただけると助かります。 > ちなみに、問題のプログラムを確認しましたが、書き間違いではありませんでした。 すでに私が考えたのと同じ回答が出ているので省略します。 > コンパイルできる環境がないのでエラーになることも知りませんでした。 言語の勉強する時は、やはり、実際に作って動かしてみるのが一番です。 あなたが、どんな環境をお使いかわかりませんが、大抵の場合、無料のコンパイラがあるはずです。
お礼
対応ありがとうございます。 コンパイルできる環境を探して実際に動かしてみようと思います。
- asuncion
- ベストアンサー率33% (2127/6289)
>cout << ++func(i) << "\n"; この行で、コンパイルエラーが出ませんか? 質問者さんのところでは大丈夫なのですか?
- kmee
- ベストアンサー率55% (1857/3366)
確認です。 現状、このプログラムはコンパイルエラーになります。 ++ の対象には左辺値(X=a とかしたときのXの方 X )が必要で、現状のfunc関数は右辺値です。 これが正しい状態で 「関数 funcのみを修正することで、(コンパイルが成功するようにして)標準出力に 2 が表示する。」 という問題なのでしょうか? それとも、プログラムの書き間違いなのでしょうか?
補足
> これが正しい状態で > 「関数 funcのみを修正することで、(コンパイルが成功するようにして)標準出力に 2 が表示する。」 > という問題なのでしょうか? 上記の場合どのようなプログラムになるのでしょうか? プログラムを記述していただけると助かります。 ちなみに、問題のプログラムを確認しましたが、書き間違いではありませんでした。 コンパイルできる環境がないのでエラーになることも知りませんでした。
お礼
ありがとうございます。 とてもわかりやすかったです。