作者:My_Qzj | 来源:互联网 | 2023-06-04 19:59
我的印象size_t是unsignedint。但是我可以只写unsignedint而不是size_t在我的代码中吗?回答size_t是描述数组和对象大小时使用的最正确的类型。它保证
我的印象size_t
是unsigned int
。但是我可以只写unsigned int
而不是size_t
在我的代码中吗?
回答
size_t
是描述数组和对象大小时使用的最正确的类型。它保证是未签名的,并且据说“足够大”以容纳给定系统的任何对象大小。因此,它比 用于该目的更便于携带unsigned int
,实际上在所有普通计算机上都是 16 位或 32 位。
因此,for
迭代数组时最规范的循环形式实际上是:
for(size_t i=0; i{
do_something(array[i]);
}
而不是int i=0;
这也许是更常见的,即使在一些C的书可见。
size_t
也是sizeof
操作符返回的类型。在某些情况下,使用正确的类型可能很重要,例如printf("%u", sizeof obj);
是形式上未定义的行为,因此理论上它可能会导致 printf 崩溃或打印出乱码。你必须使用%zu
for size_t
。
很可能size_t
恰好是与unsigned long
orunsigned long long
或uint32_t
oruint64_t
虽然完全相同的类型。
@JDługosz This was originally tagged C when I answered the question. If the question has been vandalized since then, that's no fault of mine.
回答
该类型size_t
是一种无符号类型,能够表示sizeof
和_Alignof
运算符的所有可能结果。见https://port70.net/~nsz/c/c11/n1570.html#6.5.3.4p5
Theunsigned int
是 ... 的无符号变体int
,可以表示从 0 到 65535 的整数。它可能能够表示更大的整数。见https://port70.net/~nsz/c/c11/n1570.html#5.2.4.2.1
它们可能是也可能不是同一类型。在现代 64 位机器上,它们不是。