プログラム小話〜意外な落とし穴、演算子の優先順位。
言語を学ぶにあたり演算子の優先順位が必ず出てくると思います。* が + より優先なのは数式でお馴染みですが、<<(左シフト演算子)や >>(右シフト演算子)などは優先順位を忘れがちです。
highを8ビット左シフトしlowを加えた値を求めたいのですが…
//8ビットの数値を合成し16ビットの数値に
value = high << 8 + low;
上のように書くとはまります。+ 演算子の方が優先であるため、実際は以下のように解釈されます。
//8ビットの数値を合成し16ビットの数値に
value = high << (8 + low);
当然valueは予期しない値になりますからプログラムは動きません。にしてもコンパイラも黙々とコンパイルしないで、そんなに左シフトしても仕方ないでしょうよ、と言ってくれて構わないと思いますが、g++ 2.96は何も言ってくれません(ちなみにVC++ 6.0だとwarning C4554が出ます)。
以上、気づくまで20分強かかりました。この程度か?情報3年なのに_| ̄|○|||
< | 2003 | > | ||||
<< | < | 11 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | - | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | - | - | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)