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が unsigned 型として定義している限り、私がここで基本的に行っていることは、i変数を (0 から非常に大きな値に) アンダーフローさせてから (その大きな値から 0 に) 1 回オーバーフローさせることです。

私の質問は次のとおりです。コードを短くしなければならないという悪い慣行に関係なく、 ( ) 変数を -1 に設定し、反復ごとに事前にインクリメントして配列を参照することは安全ですか?unsignedsize_t

ありがとう!

4

3 に答える 3

4
于 2013-12-21T18:38:30.227 に答える
1

Unsigned arithmetic never "overflows/underflows" (at least in the way the standard talks about the undefined behavior of signed arithmetic overflow). All unsigned arithmetic is actually modular arithmetic, and as such is safe (i.e. it won't cause undefined behavior in and of itself).

于 2013-12-21T18:40:54.820 に答える
1

正確には、C 標準は次の 2 つのことを保証します。

  • 型への整数変換unsignedは明確に定義されています (符号付き数値が 2 の補数として表されているかのように)
  • 整数のオーバーフロー/アンダーフローがunsigned明確に定義されている (2^n のモジュラー演算)

は unsigned 型なのでsize_t、悪いことをしているわけではありません。

于 2013-12-21T18:45:37.257 に答える