避免有符号整数除以无符号整数

3
我在编写以下代码时遇到了问题:

int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();

如果在vi.size()上没有进行int转换,输出结果会是垃圾值,因为size()返回的是无符号整数。

如果我没有通过谷歌搜索vector的参考资料,我永远不会想到这一点。有没有避免这种陷阱的方法?使用-Wall-pedantic,gcc似乎不会给出任何关于这种除法的警告。


你也应该小心那段代码中的溢出问题。 - Adam
1个回答

5

gcc-Wconversion选项,对于这种情况会发出警告:

warning: conversion to ‘int’ from ‘std::vector<int>::size_type {aka long unsigned int}’   may alter its value [-Wconversion]
     int average = std::accumulate(vi.begin(), vi.end(), 0) / vi.size();
                                                            ^

gcc文档中提到:

-Wconversion

警告可能会改变值的隐式转换,包括实数和整数之间的转换,例如 abs(x) 当 x 是 double 类型时;有符号和无符号之间的转换,例如 unsigned ui = -1;以及转换为较小类型,例如 sqrtf(M_PI)。不要对显式转换(如 abs((int)x) 和 ui = (unsigned)-1)或者值没有被转换改变的情况(例如 abs(2.0))进行警告。使用 -Wno-sign-conversion 可以禁用关于有符号和无符号整数之间转换的警告。

对于 C++,还会警告用户定义转换的混淆重载解析以及永远不使用类型转换运算符的转换:转换为 void、相同类型、基类或它们的引用。除非显式启用 -Wsign-conversion,否则默认禁用关于有符号和无符号整数之间转换的警告。


Visual Studio编译器有没有类似的标志? - jpo38

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接