標準出力をcloseするとどうなるのか?

標準出力を閉じると、出力されなくなるのか試してみた。 当たり前だけど、出力されなくなった。( Mac OS X で確認 )

gist8b6f99ad7d38734b76c1

$ gcc stdout_close.c
$ ./a.out
stdout:10
stderr:10
fclose(stdout)
stderr:10
$  gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
Thread model: posix

変数の有効範囲をどう伝えるか

仕事で変数の有効範囲を他者に説明する時に混乱したので整理してみる。

変数の有効範囲は、下記2つの要素で決まる。

  • 宣言箇所( 関数内, 関数外 )
  • 記憶クラス指定子( extern, static, auto, register )の指定

ソースで表すと

gist0473e607c28d6b6d97ff

仕事をするようになって、「関数内」の「記憶クラス指定子無し」の変数を「ローカル変数」から「オート変数」と呼ぶようになったのが大きそうです。

あと、オート変数はauto変数と記憶クラス指定子と関連していて、ローカル変数およびグローバル変数は宣言箇所と関連している*1のが混乱の元になっている。本来、組み合わせで変数の有効範囲を説明するべきなのに、片方だけを取り上げて有効範囲を説明している。

混乱の要因は整理できたと思うので、後は仕事先の言葉から外れないように有効範囲の説明をしていこう。

*1:関数内で宣言する変数は局所(ローカル)変数、関数外で宣言する変数は広域(グローバル)変数と説明している資料を見かける

MISRA-C 2012でのgoto

MISRA-C*1 2012では、「gotoを使用しない」が推奨になったようです。確か、2004では必須になっていたはず。

ただし、同一関数内でのジャンプに留めておく事は必須のようです。

同一関数内でgotoを使った方が良い場面って、「多重ループから一気に抜け出す」とかでしょうか。

組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド

組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド

*1:C言語向けのコーディングガイド

1から100の整数を出力してください( ただし5つの異なる方法を用いて )の11

forやめろ -- LL Diver 2014 LT枠

LL DiverのLT「1から100の整数を出力してください( ただし5つの異なる方法を用いて )」をうけてやってきましたが、10個でネタが切れたので終了にします。

慣れもあると思いますが、forループが一番考えやすいです。言語に機能が組み込まれていれば、each、iteratorの方が考える事が少ないのかも。

やった方法

1から100の整数を出力してください( ただし5つの異なる方法を用いて )の10

これまでのやり方
今回のやり方

1から100を記録したテキストファイルを読んで、出力。

1から100の整数を出力してください( ただし5つの異なる方法を用いて )の9

これまでのやり方
今回のやり方

system関数を使って、外部コマンドで出力。