見出し画像

危ないC言語を実験してみる

お疲れ様です。Y研究員です。80年代に書かれたカーニハン&リッチーというC言語の教科書を読んでいます。しらべたら初版は70年代でした。読んでいるのは2版でANSI対応です。

評価の優先順位のページを読んでいた所、なかなか面白い内容だったので共有します。

最初の例は代入演算子です。ここでは右辺を処理してから*=を実行するので、yに1を足してからxに掛け算します。

// これは
x *= y + 1;

// これと同じ
x = x * (y + 1);

// こうではない
x = x * y + 1

嫌いな人もいる三項演算子ですが、if-elseで書くと冗長になるという説明です。分かりやすい例で、三人称単数形のsがこんな風に書けるとありました。

printf("You have %d item%s.\n", n, n==1 ? "" : "s");

怖い話はここからで、コンパイラの実装によって結果が変わる場合です。iが1増える前に配列aに入るのか増えたあとに入るのかはコンパイラによると書いてあります。もしかすると、新しいC言語の仕様で固まってるのかもしれませんが調べないとわかりません。

a[i] = i++;

手元のラズパイで実験してみたところ、代入される場所はインクリメントされる前ながら、代入される値はインクリメントされた後の値でした。これは厄介。

もう一つ駄目な例もありました。2乗が計算されるのはnがインクリメントされる前か後かはコンパイラによるそうです。実験の結果は先にインクリメントされてました。

printf("%d %d", ++n, power(2, n));

今回は、例が1行だけだったので『写経』というより実験になりました。次からは制御フローです。普通はif-elseとかですが、悪名高いgoto(制御の流れが見えにくくなりスパゲッティーコードの素になる)も最後に見えます。今から楽しみです。

写真は横浜家系ラーメンです。スパゲッティで自分の写真を検索したら出てきました。麺類だから同じようなものですか。

ではまた。

般若心経の写経とプログラムの『写経』に関する記事はこちらからどうぞ。


無料のプログラミングクラブCoderDojoを運営するにあたり寄付を受け付けています。お金は会場費・Wifiの費用・教科書に使用します。