如果您知道变量永远不应为负数,那么将变量声明为无符号变量是否重要?它是否有助于防止将负数以外的其他内容馈入不应具有的函数中?

最佳答案

将语义非负值的变量声明为unsigned是一种好的样式,也是一种好的编程实践。

但是,请记住,这不会阻止您犯错误。如果将负值赋给无符号整数是完全合法的,则根据无符号算术规则将值隐式转换为无符号形式。在这种情况下,某些编译器可能会发出警告,而其他编译器会悄悄地这样做。

还值得注意的是,使用无符号整数需要了解一些专用的无符号技术。例如,关于此问题经常提到的“经典”示例是向后迭代

for (int i = 99; i >= 0; --i) {
  /* whatever */
}

上面的循环使用带签名的i看起来很自然,但是不能直接转换为无符号形式,这意味着
for (unsigned i = 99; i >= 0; --i) {
  /* whatever */
}

并没有真正完成预期的工作(实际上是一个无休止的循环)。在这种情况下,适当的技术是
for (unsigned i = 100; i > 0; ) {
  --i;
  /* whatever */
}

或者
for (unsigned i = 100; i-- > 0; ) {
  /* whatever */
}

通常将其用作反对无符号类型的参数,即,据称上述循环的上述无符号版本看起来“不自然”和“不可读”。实际上,尽管我们在此处理的问题是在封闭范围的左端附近工作的一般性问题。此问题在C和C++中以许多不同的方式体现出来(例如,使用迭代器在标准容器上使用向后迭代的“滑动指针”技术在数组上进行向后迭代)。 IE。无论上面的无符号循环对您有多大影响,即使您从不使用无符号整数类型,也无法完全避免它们。因此,最好学习这些技术并将其包括在您已建立的习惯用法集中。

关于c++ - 声明变量为无符号的重要性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3729465/

10-11 17:54