c++中,在调用函数的同一行不更新的引用变量传递
C++, pass by reference variable not being update on the same line on which function is called
在我的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在编译器中从右向左工作,所以首先计算最右,然后计算最左。:)
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 从C++dll访问C#中的一行主要参数
- 在C++中,我如何接受不同于同一行的用户输入
- cmake更新缓存的变量
- 更新到莫哈韦后出现cmath错误
- 如何从一行中读取特定数量的字符?(C++)
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- 使用最少/一行代码更新一维数组的多个位置
- 从文本文件中找到一行并更新/写入该行
- 数组的前一行元素也将更新
- c++中,在调用函数的同一行不更新的引用变量传递