2011-08-10 11 views
0

呼び出される関数に同じ行に更新されていない参照変数で通過++プログラム、私は(C++、私のC IN

char MostFrequentCharacter(ifstream &ifs, int &numOccurances);

主に、この機能を持っている)、このコードは、あります

ifstream in("file.htm"); 
int maxOccurances = 0; 
cout <<"Most freq char is "<<MostFrequentCharacter(in, maxOccurances)<<" : "<<maxOccurances; 

しかし、私は正しいcharを取得していますが、これは機能しません。maxOccuranceはゼロのままです。私はこれでメインで上記のコード、そして、

ifstream in("file.htm"); 
int maxOccurances = 0; 
char maxFreq = MostFrequentCharacter(in, maxOccurances); 
cout <<"Most freq char is "<<maxFreq<<" : "<<maxOccurances; 

を交換する場合 しかし、それは正しく機能しています。私の質問は、なぜそれが最初のケースで動作していないのですか?

+0

がhttp://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-i-i-i-i-i-etc –

答えて

0

Coutはコンパイラの右から左に作用するので、最初に右端が評価され、次に左端が評価されます。 :) 参照される変数の値は変更されません。

2

最初のケースでは、MostFrequentCharacterを呼び出す前に式のmaxOccurancesの値が解決されているためです。それはそのような方法である必要はありませんが、それは不特定の動作です。

異なるコンパイラまたはコンパイラオプションで異なる結果が生じることがあります。たとえば、VC++で同じことを試してみると、異なる結果が出てくると思います。ので、コンパイラがあなたの変数が変更され前に、その関数に渡す引数の値を働いている -

1

あなたはちょうどあなたが<<を参照してくださいどこが実際にoperator<<メソッドを呼び出していることに注意する必要があります。言い換えれば

、何を持っていることは

operator<<(operator<<(cout, f(x)), x); 

に似ている...と関数の引数の評価順序は未定義であるから、それはコンパイラに依存します。結合性によってC++、

cout << a << b 

3

があると評価:

(cout << a) << b 

コンパイラは、任意の順序でそれらを評価することは自由です。

すなわち、コンパイラは、その後、a、まず最初に<<動作と第2 <<操作をbを評価することができます。上記のソースコードで

#include<iostream> 
    int main() 
    { 
     int i = 0; 
     std::cout<<i<<i++; 
     return 0; 
    } 

std::cout<<i<<i++; 
簡略化のために <<


に関連付けられたシーケンスポイントが存在しない。このため、私たちは同等である次のコードを考えてみましょう

は、関数呼び出しで評価します。

operator<<(operator<<(std::cout,i),i++); 

operator<<(std::cout,i)またはi++が最初に評価されるかどうかは、未指定です。すなわち:

operator<<(std::cout,i)は多分、多分いくつかの魔法の注文が、この順序を定義する方法はありませんので、何の説明がされていないことを、上記のコンパイラによって

を実装FIRSTまたは
を評価した最初のまたは
i++を評価しました可能です。 C++ 03標準から


関連する引用:
セクション1.9

いくつかの他の側面と抽象機械の操作には、この国際規格で説明されています不特定例えば、関数への引数の評価の順)。可能であれば、この国際規格は一連の許容される行動を定義する。これらは抽象機械の非決定論的側面を定義する。

+0

@Sethカーネギーを参照してください:upddated答えを確認してください。 –

+0

よかったです。 –