C言語入門::演算子
次は演算子の話ですもちろん,+とか-とか*とか/も演算子です.
単項演算子,二項演算子,三項演算子
算術演算子
- '-'
- '+'
- '*'
- '/'
- '%'
加減乗除(+,-,*,/)
これは良いですね.まぁ,「*」が掛け算で「/」が割り算であることくらいです.
整数型の場合,割り算をすると小数点以下は切り捨てられます.
余り(%)
「%」は余りを求める演算子です.
a = 10 % 3;
とすると,10/3の余りである1がaに入ります.
代入演算子
代入演算子は,変数の内容を変化させます.
- '='
- '+='
- '-='
- '++'
- '--'
x+=2 は x=x+2 と同じです.
*= /= &= とかたくさんありますが.
x=x+1 は x+=1 とは書かずに普通は x++ と書きます.
論理演算子
- '&&' AND かつ
- '||' OR または
- '!' NOT 否定
C言語では,0を「偽」,0以外を「真」として扱います.
論理積(AND)「&&」
A && B
AとBがともに「真」である場合のみ,結果も「真」となります.
if (x==1 && y==2) { // x==1 かつ y==2 のときに実行される }
論理和(OR)「||」
A || B
AとBのどちらかが「真」であれば結果は「真」となります.AとBがともに「偽」である場合のみ,結果は「偽」となります.
if (x==1 || y==2) { // x==1 または y==2 のときに実行される }
否定(NOT)「!」
階乗を求める演算子ではありません.
!A
Aが「偽」ならば「真」,「真」ならば「偽」になります.
if (!(x>1)) { // x>1 が成り立たないときに実行される }
これは,
if (x<=1) { // x>1 が成り立たない(つまりx≦1)ときに実行される }
とも書けますね.
ビット演算子
この辺から難しくなってきます.
- '&' AND
- '|' OR
- '^' XOR
- '~' NOT
- '<<'
- '>>'
整数型のデータは,0や1が並んだビット列とみなせます.そのビット列を操作するのがビット演算です.
AND
ビットごとにANDを取ります.
OR
NOT
コンピュータのCPU内部では,全ての計算をこのような演算の組み合わせで行っています.
その他
- '?:' 三項演算子
- ',' 順次演算子(カンマ演算子)
三項演算子「~?~:~」
あまり使いませんが,ifやswitchを書くほどのことでは無いときには良く使います.
順次演算子「,」
さらに使われないものとして,順次演算子があります.左の式から計算して,結果は右の式の値になります.
単純な例をあげるなら,whileの条件式に以下のように書いた場合です.
while (i++,i<10) { }
というwhile文では,i++を計算して,その後にi<10を評価した結果をwhileの条件として使えます.まぁ,こういう場合は,
while (++i<10) { }
と書くか,素直にfor文を使いましょう.
優先順位
普通の数学と同じように,演算子には優先順位があります(例えば足し算より掛け算を先にやるとか).
- ( ) [ ] -> . 後置++ 後置--
- ! ~ 前置++ 前置-- 関節演算子(*) アドレス演算子(&) sizeof
- キャスト()
- * / %
- + -
- << >>
- < <= >= >
- == !=
- &
- ^
- !
- &&
- ||
- ?:
- = += -= *= …
- ,
下に行くほど優先順位は低くなります.
ちょっとした小話
ビット演算や論理演算が分かって無いとつらいです.
いまどきビットの操作なんかしないよとか思う人もいるかもしれませんが,少なくともマイコン上のプログラムでは必須です.
この文書の履歴
- 2006-04-XX まだ未公開