使用断言而不是无符号类型来记录非负性 - 如何?

时间:2014-08-15 02:52:25

标签: c++ assert unsigned

在阅读“Google C ++样式指南”时,我对第22页中的“使用断言的变量是非负的文档,不使用无符号类型的文档”感到困惑。有一个例子:

//this code will never terminate!
unsigned int i=10;
for(i;i>=0;--i)
{
    cout<<i<<endl;
}

如果我必须使用unsigned int类型,我该如何避免这个错误?

2 个答案:

答案 0 :(得分:1)

clang ++说:

test.cc:7:8: warning: comparison of unsigned expression >= 0 is always true [-Wtautological-compare]
for(i;i>=0;--i)
      ~^ ~

g ++说:

test.cc:7:10: warning: comparison of unsigned expression >= 0 is always true [-Wtype-limits]
  

我该如何避免这个错误?

你指的是哪个错误?使用Google C ++样式指南的错误或使用始终为真的条件作为循环中的终止条件的错误?

对于第一个,请不要使用它。特别是你引用的建议:在C ++(和C)中不熟练地使用时,签名类型会更加危险。

对于第二个,

1)使用具有良好诊断功能的编译器(即使您正在使用其他产品进行生产,也要通过clang进行传递)

2)重写你的循环,有很多方法可以这样做:

for(unsigned int n = 0; n <= i; ++n) {
    std::cout << i-n << '\n';
}

do {
    std::cout << i << '\n';
} while(i-- > 0);

或者你喜欢的任何东西

答案 1 :(得分:0)

它说:不要依赖自我记录&#34;无符号类型的特征,表明它们只应该是正数。使用签名类型并检查值。

当我&#34;包装&#34;以下内容将正确终止因为-1在这种情况下等于INT_MAX。

for (unsigned int i = 9; i != -1; i--)