C ++, передача по ссылочной переменной не обновляется в той же строке, в которой вызывается функция - PullRequest
0 голосов
/ 10 августа 2011

В моей программе на С ++ у меня есть эта функция,

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

и в main () этот код,

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

Но это не работает, хотя я получаю правильный символ, maxOccurance остается нулевым. Но если я заменю приведенный выше код в основном на этот,

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

Тогда он работает правильно. Мой вопрос: почему он не работает в первом случае?

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

В С ++,

cout << a << b 

По ассоциативности оценивается в:

(cout << a) << b 

но компилятор может оценивать их в любом порядке.

Т.е., компилятор может сначала оценить b, затем a, затем первую << операцию и вторую << операцию. Это потому, что нет никакой точки последовательности, связанной с <<


Ради простоты рассмотрим следующий код, который эквивалентен:

 #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) может быть оценен первым или
i++ может быть оценен первым или
Some Magic Ordering реализован компилятором

Учитывая вышеизложенное, нет способа определить этот порядок, и, следовательно, объяснение также невозможно.


Соответствующая цитата из стандарта C ++ 03:
Раздел 1.9

Некоторые другие аспекты и операции абстрактной машины описаны в этом международном стандарте как не указано ( например, порядок вычисления аргументов функции ). Там, где это возможно, этот международный стандарт определяет набор допустимого поведения. Они определяют недетерминированные аспекты абстрактной машины.

2 голосов
/ 10 августа 2011

Поскольку в первом случае значение maxOccurances в выражении разрешается до вызова MostFrequentCharacter.Хотя это не должно быть так, это неопределенное поведение.

Вы можете получить разные результаты с разными компиляторами или опциями компилятора.Если вы попробуете то же самое на VC ++, например, я думаю, вы увидите другие результаты.

1 голос
/ 10 августа 2011

Вы просто должны заметить, что там, где вы видите <<, вы фактически вызываете метод operator<< - так что компилятор определяет значение аргументов для передачи в эту функцию до вашей переменной изменен.

Другими словами, то, что у вас есть, похоже на

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

... и поскольку порядок вычисления аргументов функции не определен, это зависит от компилятора.

0 голосов
/ 10 августа 2011

Cout работает справа налево в вашем компиляторе, поэтому сначала оценивается самый правый, а затем левый.:) Таким образом, значение указанной переменной не изменилось.

...