ブロック

ブロックは、'{'と'}'で囲んだ場所のこと・・・。
関数や、if文、for文など、処理をまとめたところにはほとんど必ずといっていいほど使われている・・・。

ブロックの先頭で宣言した変数は、そのブロックの末尾を抜けるまで有効であり、値が保持されていて、参照や代入に使うことができる・・・。
この変数の有効範囲をスコープという・・・。

グローバル変数は特殊で、このモジュール内すべてで有効・・・。
ただし、externではないので、他のモジュールからは参照できない・・・。

main関数のブロックの中で、さきほどのグローバル変数と同じ名前の変数xを20に初期化している・・・。
名前は同じだが、これはmain関数内の新たなローカル変数xと認識されるので別物である・・・。
そしてxの値を出力しているが、同じ名前の変数がある場合は、より内側のブロックで宣言されたものが優先となる・・・。
この場合、内側のxが優先されるので20が出力される・・・。

xは20なのでif文の中が実行される・・・。
その内部で、また新たなローカル変数xが30に初期化される・・・。
先ほどと同じように内側が優先されるので、xは30と出力される・・・。

ここだけのローカル変数を使いたい場合などでは、単独でブロックで囲むこともできる・・・。
これも内側優先なのでxは40となる・・・。

先ほどの単独ブロックを抜けたので、ここでxを出力すると、if文ブロックで宣言されていたxの値30が出力される・・・。

ここでfuncを呼ぶ・・・。

これまでのスコープとは関係ない関数のブロック内でxを出力しているので、xはグローバル変数の値10が出力される・・・。

main関数のブロックで出力しているので、main関数の最初の部分で初期化された時の20を出力・・・。

$ vi block.c
$ gcc block.c -o block
$ ./block
x = 20
x = 30
x = 40
x = 30
x = 10
x = 20
$

このようになる・・・。

Sample/block.c at master · bg1bgst333/Sample · GitHub