c++中,在调用函数的同一行不更新的引用变量传递

C++, pass by reference variable not being update on the same line on which function is called

本文关键字:一行 更新 引用 变量 调用 函数 c++      更新时间:2023-10-16

在我的c++程序中,我有这个函数

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

和main()中的

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

但是这不起作用,虽然我得到了正确的字符,但maxoccurrence仍然为零。但是如果我将main中的上述代码替换为以下代码,

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

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

在c++中

cout << a << b 

By结合律求值为:

(cout << a) << b 

,但编译器可以自由地以任何顺序计算它们。

。e,编译器先对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++可能先求值Or
编译器实现的一些神奇排序

鉴于以上所述,没有办法定义这种排序,因此也不可能解释。


相关引用自c++ 03标准:
1.9节

抽象机器的某些其他方面和操作在本国际标准中描述为未指定的 (例如,函数的参数求值顺序)。在可能的情况下,本国际标准定义了一组允许的行为。这些定义了抽象机器的不确定性方面。

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

使用不同的编译器或编译器选项可能会得到不同的结果。例如,如果你在vc++中尝试同样的事情,我相信你会看到不同的结果。

您只需要注意,在您看到<<的地方,您实际上是在调用operator<<方法-因此编译器正在计算参数的值,以便在变量被修改之前传递给该函数

换句话说,你所拥有的与

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

…由于函数参数的求值顺序是未定义的,它取决于编译器。

Cout在编译器中从右向左工作,所以首先计算最右,然后计算最左。:)