gpt4 book ai didi

C++ 输入流 : operation order in Solaris vs. Linux

转载 作者:IT王子 更新时间:2023-10-29 01:21:43 24 4
gpt4 key购买 nike

我有一个非常简单的测试程序,它使用 istringstreams 从 std::string 中读取整数。代码是:

std::map<int, int> imap;
int idx, value;
std::string str("1 2 3 4 5 6 7 8");
istringstream is(str);
while(is >> idx >> imap[idx]){
cout << idx << " " << imap[idx] << endl;
}
cout << endl;

std::map<int, int>::iterator itr;
for(itr = imap.begin(); itr != imap.end(); itr++){
cout << itr->first << " " << itr->second << endl;
}

当我在 Solaris 10 上运行它时,它会产生以下输出:

1 2
3 4
5 6
7 8

1 2
3 4
5 6
7 8

但是,当我在 CentOS 7 下运行它时,我得到:

1 0
3 0
5 0
7 0

1 4
3 6
5 8
7 0
4204240 2

有谁知道为什么它在 Linux 下与在 Solaris 下会有所不同?它显然是在读入 map 索引之前将值读入 map ,但我不知道为什么。我可以通过稍微更改代码使其在 Linux 下工作:

std::map<int, int> imap;
int idx, value;
std::string str("1 2 3 4 5 6 7 8");
istringstream is(str);
while(is >> idx >> value){
imap[idx] = value;
cout << idx << " " << imap[idx] << endl;
}

std::map<int, int>::iterator itr;
for(itr = imap.begin(); itr != imap.end(); itr++){
cout << itr->first << " " << itr->second << endl;
}

我知道这是一个有效的修复,但我周围的人想知道它为什么不同。我们正在从 Solaris 迁移到 Linux,当这样的事情出现时,他们想知道为什么。我不知道为什么,所以我寻求指导。

最佳答案

is >> idx >> imap[idx]

这个表达式等同于

operator>>(operator>>(is, idx), imap.operator[](idx))

同一函数的参数求值相对于彼此是无序的; operator>>(is, idx)imap.operator[](idx) 可能首先被评估(即 is >> idximap[idx] 可能首先被评估)。如果先评估后者,则结果是一个左值,该左值引用映射中 idxold 值对应的值;第二次读取将覆盖此值,而不是与 idx值对应的值。

修改后的代码通过确保在访问 imap[idx] 之前读取 idx 来修复此问题。

关于C++ 输入流 : operation order in Solaris vs. Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27952905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com