请考虑以下内容:
unsigned foo(unsigned u) {
return u;
}
int main() {
foo(-1);
return 0;
}
在这里,函数
foo
被调用时,u
等于4294967295(或类似的大值)。如果程序员没有注意到这一点,可能会出现意外情况。例如,也许您正在实现
pow
来将多项式类提高到幂。由于只有正幂是可能的,因此您决定采用以下签名。Polynomial pow(const Polynomial& p, unsigned exp);
然后,一个不小心的程序员调用
pow(p, -1)
来获取逆,而不是出现警告或错误,它似乎可以工作,但可能会使用极大的内存和时间来生成完全错误的答案。g++ 5.3.0 和 gcc 5.3.0 使用
-Wall -Wextra
编译此代码而没有任何投诉。使用选项
-Wsign-conversion
将发出警告,但这会警告每个从 int
转换为 unsigned
的转换,这很快就变得太烦人了(例如,每次使用 int
索引到向量中,vec[i]
,都会发出警告)。gcc 可以仅警告将负文字面常量或其他负编译时常量用作无符号参数吗?
pow
函数接受浮点参数而不是整数。 - Thomas MatthewsPolynomial pow(const Polynomial& p, int exp);
并断言exp
是正数(或非负数,任何一种都可以)。 - Baum mit Augenpow()
在处理负数幂时没有问题。唯一的限制是,如果底数为负数 且 指数为负数,则指数必须是整数值。 - vacuumhead