C 用作数组索引时的标准无符号literal后缀

C 用作数组索引时的标准无符号literal后缀,c,indexing,types,c99,C,Indexing,Types,C99,我为你读了建议 写未签名的便笺的标准便携方式是什么 为什么规范的方式不是: size_t i; unsigned char uchar[10U]; uchar[0U]=10U; for(i=2U;i<uchar[0U];i++) { uchar[i]=i; printf("%u\n",uchar[i]); } size\u ti; 无符号字符集[10U]; uchar[0U]=10U; 对于(i=2U;i而言,0U中的U只是噪声-因为它是一个简单的常数,它的类型并不重

我为你读了建议

未签名的
便笺的标准便携方式是什么

为什么规范的方式不是:

size_t i;
unsigned char uchar[10U];

uchar[0U]=10U;

for(i=2U;i<uchar[0U];i++) {
    uchar[i]=i;
    printf("%u\n",uchar[i]);
}
size\u ti;
无符号字符集[10U];
uchar[0U]=10U;

对于(i=2U;i而言,
0U
中的
U
只是噪声-因为它是一个简单的常数,它的类型并不重要。更糟糕的是,
size\U t
没有后缀

实际上,您很少需要后缀,甚至在这种情况下,更经常的情况是让唠叨的编译器保持沉默


size\u t
建议适用于用于存储数组索引和带有未知项的索引计算的对象,或者类似于
1000*1000*1000*10
的数组维度计算的对象-这些应该发生在
size\u t
中,其中存在整数溢出或环绕的危险。

标准和端口写入无符号文字的有效方法是写入
U

但是,由于各种原因,不建议在数组索引上使用此选项:

  • 您将要使用的大多数常量数组索引都在
    INT\u MAX
    UINT\u MAX
    下面 如果你使用的是常数数组索引,那么你应该考虑重新思考你的方法。< /P>
  • 这些只会使您的代码更大(如果只有几个字节),更难理解


  • 建议编写uchar[1U]吗?@OneArb否。
    U
    是不需要的,所以它只是一个绒毛,使您的代码更难理解。@JL2210谢谢。我的想法是:无符号类型的常量应该有一个“U”,但括号中使用的索引不需要无符号或非负。
    a[-1]如果
    a
    当前指向数组中的第2..n个元素,@OneArb该页是错误的。隐式转换规则已经涵盖了这一点。将文本索引和大小写入整数的正常标准方法是纯十进制(通常)整数-
    无符号字符uchar[10];uchar[9]='\0';
    等等。其他任何事情都是不寻常的-必须有一个好的理由去做(而且很少有好的理由,所以很少做).对于变量-使用
    size\u t
    是合理的,但使用普通
    int
    通常也可以。在遇到
    size\u t
    问题之前,您可能会遇到普通
    int
    问题,但您正在处理极端情况。