C言語のint型の宣言とfor文について


①int型の宣言について

[code]

    int count[1 << CHAR_BIT] = { 0 };
    
[/code]

というものがあったのですが、よく分かりません。  
調べてみるとCHAR_BITは8以上と書かれていましたが、このint型の宣言の意味は分かりませんでした。

②for文について

[code]

    char *p = "ABCDEFG";
    for ( ; *p ; p++) { ～｝
    
[/code]

普通のfor文ではfor(int i = 0; i < 10;
i++)となりますが、この場合はどういうことなのでしょうか。*pの長さの分（7文字あるので7回。そのため初期値が必要ない）ということでいいのでしょうか。

よろしくお願いします。




# ① int型の宣言について

`<<` はビットシフト演算子といいます。int は32bit整数(処理系によります)ですので2進数で表すと `0000 0000 0000 0000`
となります。数値の1であれば `0000 0000 0000 0001` となります。  
ここで `1 << 8` とするとビットが左に8個動きます。つまり `0000 0001 0000 0000`
となります。これを10進数に戻すと256になります。つまり

[code]

    int count[1 << CHAR_BIT] = {0};
    
[/code]

は

[code]

    int count[256] = {0};
    
[/code]

と同じになり、intが256個格納出来る配列 count をゼロクリアで宣言する、という意味になります。

# ② for 文について

for 文は、`初期化式; 継続条件式; 再初期化式` という書式を取ります。p
は既に1行上で初期化されているので初期化式としては必要がありません。また継続条件式 `*p` は評価すると文字列の NUL ターミネータで false
になり、かつ最初期化式が `p++` であることから、文字列の中の文字全てを処理する、という意味になります。  
for 文の中で `printf("%c\n", *p);` すると全ての文字でループしている事が分かると思います。




# ① int型の宣言について

`<<` はビットシフト演算子といいます。int は32bit整数(処理系によります)ですので2進数で表すと `0000 0000 0000 0000`
となります。数値の1であれば `0000 0000 0000 0001` となります。  
ここで `1 << 8` とするとビットが左に8個動きます。つまり `0000 0001 0000 0000`
となります。これを10進数に戻すと256になります。つまり

[code]

    int count[1 << CHAR_BIT] = {0};
    
[/code]

は

[code]

    int count[256] = {0};
    
[/code]

と同じになり、intが256個格納出来る配列 count をゼロクリアで宣言する、という意味になります。

# ② for 文について

for 文は、`初期化式; 継続条件式; 再初期化式` という書式を取ります。p
は既に1行上で初期化されているので初期化式としては必要がありません。また継続条件式 `*p` は評価すると文字列の NUL ターミネータで false
になり、かつ最初期化式が `p++` であることから、文字列の中の文字全てを処理する、という意味になります。  
for 文の中で `printf("%c\n", *p);` すると全ての文字でループしている事が分かると思います。

