皆さんこんにちは、南 晴輝 です。
今回は、演算子を使用する時のポイントを解説します。
演算子の優先順位
今までに紹介した演算子には優先順位があります。
例えば、足し算よりもかけ算の方が優先順位が高いので、
かけ算を先に行う等です。同じ優先順位のものは場合によっては左にある演算子から右に、
場合によっては逆に右から左に評価される場合もあります。例えば、引き算は左にある物から
評価されるので、普通の算数の場合と同じになります。
// 2012.08.07 変更
優先順位 演算子の種類 演算子
↑
高 式 () [] ->※1 .※1
単項演算子 ! ~ ++ -- (キャスト) *※2 &※2 sizeof
二項演算子 剰余 * / %
加減 + -
シフト << >>
比較 < <= > >=
等値、非等値 == !=
論理積(ビット演算子) &
排他的論理和(ビット演算子) ^
論理和(ビット演算子) |
論理積 &&
論理和 ||
条件演算子 ? :
代入演算子、複合代入演算子 = += -= *= /= %= <<= >>= &= ^= |=
低 順次演算子 ,
↓
: 同順位の演算子が並んだ場合、左にある物から評価される
: 同順位の演算子が並んだ場合、右にある物から評価される
※1 : 後述する構造体・共用体で使われる演算子
※2 : 後述するポインタで使われる演算子
これらの優先順位はすべて覚える必要はありません。
どちらかわからなくなった場合は括弧で囲めばいいのです。
逆に括弧をつけないで書こうとすると、バグの原因になったり、見直すときに見にくくなります。
また、論理演算子の「&&」「||」では注意が必要になります。「&&」の場合、1項目が「偽」になると
2項目以降は評価されません。逆に「||」では1項目が「真」になった時点で
2項目以降は評価されません。
int a, b, c;
if ( (a==1) || (b==2) || (c==3) )
c==3が評価されるのは「a!=1」でかつ「b!=2」の時だけです。
int a, b, c;
if ( (a==1) && (b==2) && (c==3) )
c==3が評価されるのは「a==1」でかつ「b==2」の時だけです。
逆にこの性質を用いると下の2例(aの値が10~20の間だけaの値が表示される)は同じになります。
#include <stdio.h>
void main(){
int a;
scanf("%d", &a);
(10 <= a) &&
(a <= 20) &&
printf("%d\n", a);
}
#include <stdio.h>
void main(){
int a;
scanf("%d", &a);
if ( 10 <= a && a <= 20)
printf("%d\n", a);
}
また、「if文」や「for文」、「while文」などで、「[条件式1]と[条件式2]が[真]なら」
という判断をする場合、
[条件式1]と[条件式2]の[偽]になる可能性が高い条件式を先に記述する方が、
処理速度が速くなることを意味しています。
#include <stdio.h>
#include <stdlib.h>
void main(){
int a;
do{
a = rand();
printf("%d\n", a);
// }while( a != 10 && a <= 20000 );
}while( a <= 20000 && a != 10 );
}
※「rand()」関数はint型の乱数を返す関数です。これを利用するためには「stdlib.h」を
インクルードする必要があります。
上の例は、乱数を取得して、20000以下の数でかつ10でなければ繰り返すというプログラムです。
一般的に考えて、「乱数20000以下」という条件と、「乱数が10でない」という条件を考えた場合、
「偽」になる可能性は前者の条件の方が高いです。
式と値
C言語では「関数や式も値を持つ」という考え方を持っています。
すなわち「a = a + 1;」という文を考えたとき、変数「a」も、定数「1」も、 演算式「a + 1」も、
式「a = a + 1」も値を持っています。
式「a = a + 1」の値は演算式「a + 1」と同じです。
前に「「a = b = 100;」は実は複雑な使い方です」と書きました。前ページの表によると、
「=が2つある場合は右側の=が先に評価される」ことがわかります。したがって、「b = 100」 が
最初に評価されます。
上で解説したように、「b = 100」の値は [100]になるため、これが変数aに代入されます。
その結果、変数aにも変数bにも 100が代入されます。
では以下のような場合、aには何が代入されるでしょうか?
a = b == c;
「=」と「==」を比較すると「==」の方が優先順位が高いので、式「b == c」が評価されます。
その結果が変数「a」に代入されます。したがって、bとcが同じならaに「真(1)」が、
bとcが異なれば「偽(0)」が代入されます。
では、以下のような場合はどうなるでしょう?
#include <stdio.h>
void main(){
int a = 10, b = 10, c = 10;
if ( a == b == c )
printf("YES.\n");
}
aもbもcも10が代入されているので、「YES.」と表示されそうですが、
[==]が2つあった場合左から評価されます。したがって「a==b」が評価され、
同じなら 1、異なるなら0という結果になります。次にその結果とcの値を評価するので、偽になります。
したがって「YES.」とは表示されません。
条件式と値
条件式は「真」か「偽」でプログラムの流れが変わることは説明しました。
「真」というのは「0以外の値」で、「偽」というのは「0と等価」であることも説明しました。
したがって、「if文」などの条件式には、「==」や「>=」といった演算子だけでなくても
良いことになります。
つまり条件式の中に「a--」とか 「a = a + 1」とか書いても良いことになります。
以上のことから以下の例のように書き換えることもできます。
while(a != 0)
↓
while(a)
while(a == 0)
↓
while(!a)
以上で、C言語講座初級を終わります。
次回から、受講者からの質問についての回答を解説します。
最後まで、読んでくださりありがとうございました。
質問のある方は、以下のメールアドレスに質問をお寄せください。
e-mail : minami-1@ex.bw.dream.jp
よろしく、お願いします。
南 晴輝




