为了账号安全,请及时绑定邮箱和手机立即绑定

我应该在for循环中使用std :: size_t还是int?

我应该在for循环中使用std :: size_t还是int?

C++
慕村225694 2020-02-04 15:26:58
我只是想知道我应该使用std::size_t循环和东西而不是int?例如:#include <cstdint>int main(){    for (std::size_t i = 0; i < 10; ++i) {        // std::size_t OK here? Or should I use, say, unsigned int instead?    }}通常,关于何时使用的最佳实践是什么std::size_t?
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

一个好的经验法则是,您需要在循环条件下将其与自然存在的事物进行比较std::size_t

std::size_t是任何sizeof表达式的类型,并保证能够表达C ++中任何对象(包括任何数组)的最大大小。通过扩展,它也保证对于任何数组索引都足够大,因此它是数组上逐个索引循环的自然类型。

如果您只是在计算一个数字,那么使用保存该数字的变量类型或一个intunsigned int(如果足够大)的类型可能会更自然,因为这些对于机器而言应该是自然大小。


查看完整回答
反对 回复 2020-02-04
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

size_tsizeof运算符的结果类型。

使用size_t变量数组中的模型的大小或指数。size_t传达了语义:您立即知道它代表一个以字节为单位的大小或一个索引,而不仅仅是另一个整数。

同样,使用size_t字节表示大小有助于使代码具有可移植性。


查看完整回答
反对 回复 2020-02-04
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

该size_t类型用于指定内容的大小,因此很自然地使用它,例如,获取字符串的长度然后处理每个字符:


for (size_t i = 0, max = strlen (str); i < max; i++)

    doSomethingWith (str[i]);

你也必须注意,当然边界条件,因为它是一个无符号类型。顶端的边界通常并不那么重要,因为最大值通常很大(尽管有可能到达那里)。大多数人只是将an int用于此类事情,因为他们很少拥有足够大以超过该能力的结构或数组int。


但是请注意以下事项:


for (size_t i = strlen (str) - 1; i >= 0; i--)

由于无符号值的包装行为,这将导致无限循环(尽管我已经看到编译器对此提出警告)。也可以通过以下方式缓解此问题(稍难理解,但至少可以避免包装问题):


for (size_t i = strlen (str); i-- > 0; )

通过将减量转换为延续条件的检查后副作用,这将对减量前的值进行连续性检查,但仍在循环内使用减量值(这就是循环从而len .. 1不是从处运行的原因len-1 .. 0)。


查看完整回答
反对 回复 2020-02-04
  • 3 回答
  • 0 关注
  • 1574 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信