我有这段测试代码(还有很多其他材料;但是,它非常密集,可能与这个问题无关),这已经产生了一些莫名其妙的输出。编译时,这个块:
cout << team1[m].rating << endl;
cout << team2[n].rating << endl;
cout << team1.size() << endl;
cout << team2.size() << endl;
cout << (team2[n].rating - team1[m].rating) / team2.size() << endl;
cout << (team1[m].rating - team2[n].rating) / team1.size() << endl;
产生输出:
10
30
2
2
10
2147483638
'team1'和'team2'都是vector<player>
类型(没有反斜杠),'player'结构如下所示:
struct player {
string name;
int rating;
player(string Name, int Rating) :
name(Name), rating(Rating) {}
};
答案 0 :(得分:9)
team1.size()
和team2.size()
未签名(size_t
) - 将您的代码更改为:
cout << (team2[n].rating - team1[m].rating) / static_cast<int>(team2.size()) << endl;
cout << (team1[m].rating - team2[n].rating) / static_cast<int>(team1.size()) << endl;
答案 1 :(得分:5)
(team1[m].rating - team2[n].rating)
等于-20
。此表达式结果将根据混合表达式的规则提升为unsigned int
,并除以team1.size()
,产生2147483638
,unsigned int
等效于signed int
{{ 1}}。
答案 2 :(得分:4)
这是因为size()
的{{1}}函数返回std::vector
,这是无符号的。将size_t
(例如评分)除以int
时,size_t
会提升为int
。
将负数转换为无符号值将导致该值下溢,变得大于可由原始签名类型表示的最大正值。
为了防止这种情况,您需要明确说明在分割之前应将size()参数转换为unsigned int
。
int