2011-08-10 28 views
0

在我的C++程序的同一行,我有这样的功能,C++,通过引用传递变量不被更新在其上调用函数

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; 

然后,工作正常。我的问题是为什么它不是在第一种情况下工作。

+0

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

回答

0

Cout在您的编译器中正确地左对齐,因此首先对最右边进行求值,然后再对其进行求和。 :) 所以引用变量的值不会改变。

2

因为在第一种情况下,表达式中的maxOccurances的值在调用MostFrequentCharacter之前被解析。它不一定是那样,但它是不确定的行为。

对于不同的编译器或编译器选项,您可能会遇到不同的结果。例如,如果你在VC++上尝试同样的事情,我相信你会看到不同的结果。

1

你一定要注意,如果你看到<<你实际上是调用operator<<方法 - 所以编译器正在制定的参数的值传递到您的变量修改之前该功能。

换句话说,你有什么类似于

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

...既然函数参数计算顺序是不确定的,它取决于编译器。

3

在C++中,

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++也许评估第一或者
由编译器

鉴于上述实施,这是没有办法来定义这个排序,因此没有解释是一些神奇的订购可能。


从C++ 03标准相关引用:
1.9节

某些其它方面和抽象机的操作在本国际标准被描述为未指定例如,对函数参数的评估顺序)。在可能的情况下,本标准定义了一系列允许的行为。这些定义了抽象机器的非确定性方面。

+0

@Seth卡内基:请检查upddated答案。 –

+0

好的,那样更好。 –

相关问题