分岐文3
演算子
引き続き演算子について取り上げます。
◆代入演算子
代入演算子とはすでに紹介した「=」です。この代入演算子は単独で使用する場合と複合で使用する場合があります。
単独で使用する場合は、以前にも説明したように右辺の値を左辺に代入するという動作になります。
複合の場合は、基本的に右辺の値を左辺に代入するということには変わりありませんが、その際に算術演算子などと
組み合わせることで表記を省略することができます。
例えば以下のような式があったとします。
a = a + b;
複合を使用した場合、以下のように書き換えられます。
a += b;
また複数の代入式を以下のように書き直すこともできます。
a = 10; b = 10; a = b = 10;
◆sizeof演算子
sizeof演算子はデータ型のサイズを計算するための演算子となります。メモリを確保するときに確保するサイズを
を調べるといった目的で使用されることがあります。書式は以下のようになります。
sizeof( サイズを調べるもの );
コードで確認
以下のコードで確認してみましょう。
#include <stdio.h> int main(void){ int a = 10; printf(“%dn”,sizeof( a )); return (0); }
~~~~実行結果~~~~
4
~~~~~~~~~~~~
結果をみるとint型のサイズなので4バイトとなっています。(処理系によります)
◆条件演算子
条件演算子とは三項演算子ともいわれるもので「?」を使用します。if文と同じことができます。
書式は以下のようになっています。
条件 ? 文1 : 文2;
条件のところが真ならば文1が行われて偽であれば文2が行われます。以下のif文と同じことになります。
if(条件式){ 文1 ; }else{ 文2 ; }
コードでの確認
ではコードで確認してみましょう。
#include <stdio.h> int main(void){ int a = 10, b = 20; printf(“%dn”, a > b ? a – b : b – a); return (0); }
~~~~実行結果~~~~
10
~~~~~~~~~~~~
4行目のところが条件演算子を使用しているところとなります。変数aと変数bを比較してaが大きい場合は「a – b」が実行され
bが大きい場合は、「b – a」が実行されます。今回はbが大きいので後ろの方が実行されてそれが画面に表示されます。
条件演算子とif文は同じ動作ですが条件演算子を使用するとconst変数の値を条件によって変えるといったことが
できるようになります。
#include <stdio.h> int main(void){ int num = 5; const int a; if(num >= 5){ a = 10; }else[ a = 0; } return(0); }
このコードはコンパイルエラーとなります。const修飾子がついている変数の値を変更しようとしているからです。
そこで以下のように書き換えます。
#include <stdio.h> int main(void){ int num = 5; const int a = num >= 5? 10: 0; return(0); }
このようにしておけばコンパイルエラーとはなりません。
■演算子の優先順位
ここまで様々な演算子を使用してきましたが、それぞれの演算子には優先順位があります。この順位を意識しておかないと想定外の順番で
処理が行われてしまうことになります。
演算子 | 結合性 |
---|---|
( ) [ ] . –> | 左から右 |
! ~ ++ – + - * & (type) sizeof | 右から左 |
* / % | 左から右 |
+ - | 左から右 |
<> | 左から右 |
< >= | 左から右 |
== != | 左から右 |
& | 左から右 |
^ | 左から右 |
| | 左から右 |
&& | 左から右 |
|| | 左から右 |
?: | 右から左 |
= += -= *= /= | 右から左 |
, | 左から右 |
表の下に行くほど優先順位が低くなります。
結合性というのは同じ行の演算子の場合の処理順序のことになります。
結合性が右から左となっているからといって演算子のところに書いてある右が優先されるという意味ではありません。
ここでの意味はソースコード内に記述している順番のことになります。
2行目の「*」はポインタを表していて3行目の「*」は算術演算を表しています。
コードで確認
では演算子の優先順位を確認してみましょう。
#include <stdio.h> int main(void){ int a = -1; int b = 4; int d = 2; printf("%dn",-a+2); printf("%dn",b>>d<<1); a = b =10; printf("%dn",a); return(0); }
~~~~実行結果~~~~
3
2
10
~~~~~~~~~~~~
符号の方が優先順位が高いため符号反転後足し算されます。シフト演算は左から右なので4が右に2シフトされた後、
左に1シフトされます。代入演算子は右からなのでbに10が代入されその後bの値がaに代入されます。
分岐文以外でも条件式を使用することがありますので、演算子の使用方法について押さえておいて下さい。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載