1

克拉阿。

我是一所编程学校的学生,要求我们用少于 25 行代码编写 C 函数。所以,基本上,每一行都很重要。有时,我需要像这样缩短作业:

#include <stddef.h>
#include <stdio.h>

#define ARRAY_SIZE  3

int     main(void)
{
    int     nbr_array[ARRAY_SIZE] = { 1, 2, 3 };
    size_t  i;

    i = -1;
    while (++i < ARRAY_SIZE)
        printf("nbr_array[%zu] = %i\n", i, nbr_array[i]);
    return (0);
}

这段代码的重要部分是size_t名为 的计数器i。为了节省几行代码,我想在循环的条件下预先增加它。但是,只要 C 标准定义size_t为无符号类型而言,我在这里所做的基本上是使i变量下溢(从 0 到一个非常大的值),然后将它上溢一次(从那个大值到 0)。

我的问题如下:无论必须缩短代码的不良做法如何,将( ) 变量设置为 -1 然后在每次迭代时预递增它是否安全unsignedsize_t以浏览数组是否安全?

谢谢!

4

3 回答 3

4
于 2013-12-21T18:38:30.227 回答
1

准确地说,C 标准保证了两件事:

  • 任何整数到unsigned类型的转换都是明确定义的(好像有符号数表示为 2 补码)
  • 整数的上溢/下溢unsigned定义明确(带 2^n 的模运算)

由于size_t是无符号类型,因此您没有做任何邪恶的事情。

于 2013-12-21T18:45:37.257 回答
1

无符号算术永远不会“溢出/下溢”(至少在标准谈论有符号算术溢出的未定义行为的方式上)。所有无符号算术实际上都是模算术,因此是安全的(即它本身不会导致未定义的行为)。

于 2013-12-21T18:40:54.820 回答