24144


C/C++の非常に素朴な疑問です。

> a[ i ] の i の型は何か?

です。  
古き良きK&R時代であればintでしょうが、いつからか、sizeof演算子の戻り値もsize_tなので  
size_tではないのか？という疑問がわきます。

とはいえ、(ちょっと強引なコードですが)

[code]

    const char *a = "abcdefg";
    a++;
    printf("%c", a[-1]);
    
[/code]

もありなので、-1を指定できるということはint?

C++コンテナの`operator [](...)`は添字の型が定義されているから  
それ(たいてい size_type)に従えばよいのですが、

単純な配列型(`char []`など)の添字の型はなんでしょうか？


CC BY-SA 3.0
2016-04-19T05:11:52.780
24143
2016-04-19T21:22:01.743
7844
question
c++ c
配列の添字の型は何？ int ? size_t?


Ｃについてですが、

配列の宣言と使用の２種類があると思いますが、

C11 の[ドラフト](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) の  
**6.7.6.2 Array declarators**

> 1 In addition to optional type qualifiers and the keyword static, the  
>  [ and ] may delimit an expression or *. If they delimit an expression  
>  (which specifies the size of an array), the expression shall have an  
>  integer type. If the expression is a constant expression, it shall  
>  have a value greater than zero. The element type shall not be an  
>  incomplete or function type. The optional type qualifiers and the  
>  keyword static shall appear only in a declaration of a function  
>  parameter with an array type, and then only in the outermost array  
>  type derivation.

the expression shall have **an integer type**. If the expression is a constant
expression, it shall have **a value greater than zero**.  
とありますから

「整数型で０より大きい値」ということになると思います。  
（ **int** のみ(`char a[10];`←この場合はリテラルの１０はint)というわけではなく例えば`static char
a[10000ULL];`などもＯＫです）

* * *

配列としてのアクセスについては、  
**6.5.2.1 Array subscripting**

> 2 A postfix expression followed by an expression in square brackets []  
>  is a subscripted designation of an element of an array object. The  
>  definition of the subscript operator [] is that E1[E2] is identical to  
>  (*((E1)+(E2))). Because of the conversion rules that apply to the  
>  binary + operator, if E1 is an array object (equivalently, a pointer  
>  to the initial element of an array object) and E2 is an integer,  
>  E1[E2] designates the E2-th element of E1 (counting from zero).

**E2 is an integer**  
とありますからこちらも整数型（こちらはマイナス可、（結果は配列の範囲内である必要があります（アドレスとしては最後の次のアドレスは有効、この場合は読み書きはできない）））ですね。


CC BY-SA 3.0
2016-04-19T05:38:30.017
24144
2016-04-19T05:56:02.217
2016-04-19T05:56:02.217
5044
5044
24143
answer


C++に関しては、`std::ptrdiff_t`ですね。この型が実際に何になるかは実装依存ですが、符号付き整数になります。

<http://en.cppreference.com/w/cpp/types/ptrdiff_t> から引用

> std::ptrdiff_t is used for pointer arithmetic and array indexing, if
> negative values are possible.

ついでに、ちょっと古いドラフトですが、こちらかも引用。  
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>

> For every cv-qualified or cv-unqualified object type T there exist candidate
> operator functions of the form  
>  T * operator+(T *, std::ptrdiff_t);  
>  T & operator[](T *, std::ptrdiff_t);  
>  T * operator-(T *, std::ptrdiff_t);  
>  T * operator+(std::ptrdiff_t, T *);  
>  T & operator[](std::ptrdiff_t, T *);


CC BY-SA 3.0
2016-04-19T06:36:58.007
24147
2016-04-19T21:22:01.743
2016-04-19T21:22:01.743
3066
3066
24143
answer