2012-02-29 18 views
1

関数の参照渡しのパラメータを渡す機能をテストするためにC++プログラムを作成しました。C++ - intを返す関数の参照渡しパラメータ

#include <iostream> 

using namespace std; 

int f(int &b) { 
    b = b + 1; 
    cout << b << endl; 
    return b; 
} 

int main() { 
    int t = 10; 

    cout << f(t) << " " << t << endl; 
    //cout << f(&t) << " " << t << endl; 

    system("PAUSE"); 

    return 0; 
} 

このプログラムはf関数の実行後tの値には影響しませんん、なぜあなたは私に説明してもらえますか? bパラメータが渡されているので、私は、プログラムの実行後に値が変わると思っていました。なぜなら、私は実際の変数をコピーしていないmain関数から処理しているからです。この場合、私はそれが11であると予想しますが、プログラムの実行によって影響を受けません。

どうしてですか?

答えて

5

値はtです。は増分します。

cout << f(t) << endl; 
cout << t << endl; 

をあなたの元の単一の出力文で:あなたは二つに出力文を分割する場合は、これを参照してくださいよ

cout << f(t) << " " << t << endl; 

コンパイラがで生産、f(t)tを評価することは自由ですあなたが見ている出力。詳細については、cout << order of call to functions it prints?

+0

はい、どうして増えませんか?それは参照によって渡されていませんか?それは 'main'関数内でも変更する必要がありますか? – Simon

+0

これは、すべての出力を1行で期待して注文しているだけではありません。 2つの保証の上にそれを分割することは、あなたが望む順序で起こります。 – BoBTFish

+1

@サイモン:いいえ、それは 't'をインクリメントします。何が起こるかは、**印刷**された値は、関数が呼び出される前の値です。私の更新された答えを見てください。 – NPE

0

を参照してください。ステートメントのどの時点で定義されていないため、コードに未定義の動作があります。

これは、コンパイラによっては、異なる結果を得る可能性があります

cout << i++ << ++i; 

に似ています。

0

sequence pointsという問題が発生していると思います。同じ式でtの値を修正して印刷しています。

コンパイラがtを評価すると、評価がf(t)と決定したときの順序は不定です。だから、あなたが思うように、関数は最初に呼び出されないかもしれません。

印刷を2つのステートメントに分割すると、実際にtが変更されていることがわかります。たとえば、

cout << f(t) << " "; 
cout << t << endl; 

の出力が期待されます。

0

言語では、演算子の引数が評価される順序が指定されていないため、式が関数呼び出しの前後にtの値をとるかどうかは不定です。

あなたはシーケンスポイントを導入する場合は、おそらく二つの表現にそれを分割することによって、期待した結果が表示されます。

cout << f(t) << " "; 
cout << t << endl; 
0

あなたは、出力順につまずくしています。指摘したように、tになりますが、出力の順番を混乱させる可能性があります。

しかし、私は質問から少しはずして、すぐに問題が起こるだけでなく、なぜ彼らが最初に困っているのかを理解する方法を見つけようとしています。

デバッガを習得する必要があります。

コードをステップ実行して、任意の時点でtの値を参照して、実際に何かの努力を払って実際に増分する(正確な時期と方法を含む) 。また、再帰のような概念を含むデバッガを使ってコードをトレースすることで、コードがどのように機能するかを理解することができます。

これをすぐに開始することをお勧めします。実際にコードがどのように出力されているかを推測することなく、実際にどのように動作するかを知ることができます。

関連する問題