┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp  ┃ ┃'&┃&''*┃*''%┃%'  発行    江口昌宏 ***  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第11号 2001/12/xx  演算子  改定日 2002/01/05 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows とIE を前提としています。  拡張子を表示するに設定してください。 ------------------------------------------------------------------------ ▼ 演算子とは  3 + 4  と書いたとき,この + の記号を演算子といいます。英語では,operator(オペ レータ)です。3 と 4 の方は,オペランド(operand)といいます。こちらは,英語 のままの用語です。  JavaScript と Java の演算子は,ほぼ同じで,c 言語の演算子に準じています。  この号では,演算子を順に説明します。 ------------------------------------------------------------------------ ▼ 演算子の基本,代入演算子  a = 3;  と書くと,多くのプログラム言語では,代入をします。演算子の代表です。 等号(=)の左側と右側は同じ型か,左側が右側の親にあたるもの,また,数値で 言えば左側は,右側より大きな範囲を扱えることのできる型である必要があり ます。 a = a + 3;  という書き方をプログラムでよくします。これは,今の a に 3 を足して, 新しい a にするという意味です。数学の式とは違います。 ------------------------------------------------------------------------ ▼ 算術演算(四則演算)  c = a + b; c = a - b;  加算,減算は,数値型で使用可能です。加算は,文字列でも使用可能です。  c = a * b;  乗算です。  c = a / b;  除算です。整数型の計算の場合,答えも整数になりますので,注意が必要です。 マイナスが含まれているときは特に要注意です。ここまでが,四則演算です。  剰余(余り)を求めるには,  c = a % b;  があります。整数に関してのみの演算です。 ------------------------------------------------------------------------ ▼ 算術代入演算子  c = a + b;  の等号は,代入を表しました。正式には,単純代入演算といいます。単純でない 代入演算子を挙げます。 a += b; // a = a + b と同等 a -= b; // a = a - b と同等 a *= b; // a = a * b と同等 a /= b; // a = a / b と同等 a %= b; // a = a % b と同等  a = a + b と書くより,a += b と書いたほうが,コンパイルしたときの機械語 のコードが効率的になります。また,プログラムを作成するときに入力が簡潔で すので,C のプログラムで多用されました。JavaScript や Java でもよく利用 されます。 ------------------------------------------------------------------------ ▼ 単項演算子 b = ++a; // a を +1 して,b に代入。 b = a++; // a を b に代入してから,aを+1します。 b = --a; // a を -1 して,b に代入。 b = a--; // a を b に代入してから,aを-1します。 a++; // a を +1 します。 a--; // a を -1 します。  上の例で,a に ++ とか -- が掛かります。そのため単項演算子と呼ばれます。 ++ はインクリメント,-- は,ディクリメントと呼びます。for 文でよく使用し ます。 例:代入演算子,算術(四則)演算子,算術代入演算子,単項演算子 J11-01 xOpe01.java public class xOpe01 { public static void main(String[] args) { int a, b, c, d, e; a = 2; a = a + 3; System.out.println("a = 2 のとき"); System.out.println(" a = a + 3 を実行すると a = " + a); System.out.println(""); a = 5; b =3; c = a + b; d = a - b; e = a * b; System.out.println("a = 5, b = 3 のとき"); System.out.println(" c = a + b を実行すると c = "+ c); System.out.println(" d = a - b を実行すると d = "+ d); System.out.println(" e = a * b を実行すると e = "+ e); System.out.println(""); c = a / b; d = a % b; System.out.println(" c = a / b を実行すると c = " + c); System.out.println(" d = a % b を実行すると d = " + d); System.out.println(""); double f,g,h; f = 1.5; g = 0.3; h = f / g; System.out.println("f = 1.5, g = 0.3 のとき"); System.out.println(" h = f / g = を実行すると,h = " + h); System.out.println(""); a=b=c=d=e=5; a += 3; // a = a + 3 と同等 b -= 3; // b = b - 3 と同等 c *= 3; // c = c * 3 と同等 d /= 3; // d = d / 3 と同等 e %= 3; // e = e % 3 と同等 System.out.println("a, b, c, d, e がすべて 5 のとき"); System.out.println(" a += 3 を実行すると,a = "+ a); System.out.println(" b -= 3 を実行すると,b = "+ b); System.out.println(" c *= 3 を実行すると,c = "+ c); System.out.println(" d /= 3 を実行すると,d = "+ d); System.out.println(" e %= 3 を実行すると,e = "+ e); a = 3; c = 3; b = 2 + ++a; d = 2 + c++; System.out.println("a = 3, c = 3 のとき"); System.out.println(" b = 2 + ++a を実行すると,b = " + b + ", a = " + a); System.out.println(" d = 2 + c++ を実行すると,d = " + d + ", c = " + c); } } ------------------------------------------------------------------------ ▼ 関係演算子  if 文の条件式等で使用します。a = 0 とすると,a に 代入をしますので, a == 0 のようは書式にしたのでしょう。 a == 0 // 恒等演算,等しいかどうか判断 a != 0 // 不等演算,等しくないかの判断 a > 3 // 関係演算大なり a < 3 // 関係演算小なり a >= 3 // 関係演算大なりあるいは等しい a <= 3 // 関係演算小なりあるいは等しい ------------------------------------------------------------------------ ▼ ブール論理演算子(真偽演算子)  前で説明した関係演算子は,2つの数字などが等しいかどうかの判断をしまし た。ブール論理演算子は,真偽型の値で演算を行い,結論を真偽型で返します。 関係演算子と同様に if 文の条件等で使用します。 boolean x, y, z; z = x & y // 論理積 z = x | y // 論理和 z = x ^ y // 排他的論理和 z = !x // 論理否定 y&=x // y = y & x と同等,論理積代入演算 y|=x // y = y | x と同等,論理和代入演算 y^=x // y = y ^ x と同等,排他的論理和代入演算 例:関係演算子とブール論理演算子 j11-02 xOpe02.java public class xOpe02 { public static void main(String[] args) { int a, b, c, d, e; boolean x, y, z; // 関係演算子 a = 3; System.out.println("a = 3 のとき"); if (a == 3) { System.out.println(" a = 3 です。"); } if (a != 0) { System.out.println(" a = 0 ではありません。"); } if (a > 0) { System.out.println(" a は 0 より大きいです。"); } if (a < 0) { System.out.println(" a は 0 より小さいです。"); } else { System.out.println(" (a < 0) は 偽です。"); } if (a >= 0) { System.out.println(" a は 0 以上です。"); } if (a <= 0) { System.out.println(" a は 0 以下です。"); } else { System.out.println(" (a <= 0) は 偽です。"); } // ブール論理演算子(真偽演算子) System.out.println(""); x = true; y = false; System.out.println("x:真,y:偽 のとき(表示後 y:偽に再設定)"); z = x & y; // 論理積 System.out.println(" z = x & y を実行すると,z = " + z); z = x | y; // 論理和 System.out.println(" z = x | y を実行すると,z = " + z); z = x ^ y; // 排他的論理和 System.out.println(" z = x ^ y を実行すると,z = " + z); z = !x; // 論理否定 System.out.println(" z = !x を実行すると,z = " + z); System.out.println(""); x = true; y = false; y &= x; // y = y & x と同等,論理積代入演算 System.out.println(" y &= x を実行すると,y = " + y); x = true; y = false; y |= x; // y = y | x と同等,論理和代入演算 System.out.println(" y |= x を実行すると,y = " + y); x = true; y = false; y ^= x; // y = y ^ x と同等,排他的論理和代入演算 System.out.println(" y ^= x を実行すると,y = " + y); x = true; y = false; z = (x == y); // 恒等演算 System.out.println(" z = (x == y) を実行すると,z = " + z); x = true; y = false; z = (x != y); // 不等演算 System.out.println(" z = (x != y) を実行すると,z = " + z); } } ------------------------------------------------------------------------ ▼ ビット演算(ビット論理演算子,シフト演算子,ビット代入演算子)  ビット演算とは,ビット単位での演算です。ビット単位で論理演算するものと ビットをシフト(ずらす)演算あります。 ビット論理演算 z = y | x; // ビット単位の論理和 OR z = y & x; // ビット単位の論理積 AND z = y ^ x; // ビット単位の排他的論理和 XOR あるいは,EOR z = ~x; // ビット反転 シフト演算 x = x >> 2; // 2 ビット,算術右シフト,1/4 になります。 x = x << 2; // 2 ビット,算術左シフト,4 倍になります。 x = x >>> 2; // 2 ビット,論理右シフト 備考  x = x <<< 2; // 2 ビット,論理左シフト  は,ありません。  算術シフト,論理シフトの違いは,別の号でまた扱います。何故ないか不思議 です。情報をお持ち方,教えてください。 ビット代入演算子  数値の代入演算子と同様に,ビット代入演算子があります。 y&=x; // y = y & x の意味,ビットAND代入演算 y|=x; // y = y | x の意味,ビットOR代入演算 y^=x; // y = y ^ x の意味,ビットXOR代入演算 y>>=2; // y = y >> 2 y<<=2; // y = y << 2 y>>>=2; // y = y >>> 2 例;ビット演算 j11-03 xOpe03.java public class xOpe03 { public static void main(String[] args) { int a, b, c; // ▼ ビット論理演算子 a = 0xF0F0F0F0; // 1111 0000 1111 0000 1111 0000 1111 0000 b = 0xAAAAAAAA; // 1010 1010 1010 1010 1010 1010 1010 1010 System.out.print("a は, "); DspBit(a); System.out.println(" です。"); System.out.print("b は, "); DspBit(b); System.out.println(" です。"); System.out.println(" ---------------------------------------"); c = a | b; // ビット単位の論理和 OR System.out.print("a | b は "); DspBit(c); System.out.println(""); c = a & b; //ビット単位の論理積 AND System.out.print("a & b は "); DspBit(c); System.out.println(""); c = a ^ b; // ビット単位の排他的論理和 XOR あるいは,EOR System.out.print("a ^ b は "); DspBit(c); System.out.println(""); c = ~a; // ビット反転 System.out.print(" ~aは "); DspBit(c); System.out.println(""); // ▼ シフト演算子 System.out.println(""); System.out.print("a は, "); DspBit(a); System.out.println(" です。"); System.out.println(" ---------------------------------------"); c = a >> 1; System.out.print("a >> 1 ");DspBit(c); System.out.println(" 算術右シフト"); c = a << 1; System.out.print("a << 1 ");DspBit(c); System.out.println(" 算術左シフト"); c = a >>> 1; System.out.print("a >>> 1 ");DspBit(c); System.out.println(" 論理右シフト"); } static void DspBit(int x){ int y = 0x80000000; int z; for(int i=1; i<=32; i++){ z = x&y; if(z == 0){ System.out.print('0'); } else { System.out.print('1'); } if(i%4==0){ System.out.print(' '); } y >>>= 1; } } } ------------------------------------------------------------------------- ▼ 条件演算子(3項演算子)  単純な判断によって,返す値が変わる場合に使用します。  z = ((x==0)? 0: y/x);  と書くと,x がゼロであれば,z = 0 で,ゼロでなければ,y を x で割るとい う意味です。 例:3項演算子 j11-05 xOpe05.java public class xOpe05 { public static void main(String[] args) { int x, y, z; x = 2; y = 10; z = ((x==0)? 0: y/x); System.out.println("z = "+ z); // 上と同等のプログラム if (x==0) { z = 0; } else { z = y/x; } System.out.println("z = "+ z); } } ------------------------------------------------------------------------ ▼ ショートサーキット論理演算子  論理演算を効率的に行います。 boolean w,x,y,z; w = w || y || z; // ショートサーキット OR /* 式の左から,この場合だと,x, y, z の順に true かどうか調べて,true が出 たら,w = true にして論理演算を終了します。 */ w = w && y && z; // ショートサーキット AND /* 式の左から,この場合だと,w, y, z の順に false かどうか調べて,false が 出たら,w = false にして論理演算を終了します。 */ ------------------------------------------------------------------------ ▼ 文字列演算  文字列の連結は,単純に,"+" を利用すればできます。 s3 = s1 + s2; // 文字列の結合をします。 ------------------------------------------------------------------------ ▼ クラス所属判定演算  あるインスタンスがそのクラスに属しているかどうかを判定します。 z = a instanceof String; // a が文字列型のインスタンスであれば,true が z に入ります。 例:文字列連結とクラス判定演算 j11-04 xOpe04.java public class xOpe04 { public static void main(String[] args) { // 文字列演算 String a,b,c; a = "JavaScript"; b = " & Java"; c = a + b; System.out.println("a = ”JavaScript”, b = ”& Java” のとき"); System.out.println(" c = a + b は," + c); System.out.println(""); int i=256 ; double d = 0.5; System.out.println("たいていの変数は簡単に文字列になる"); System.out.println("整数と浮動小数点を表示:"+ i + " と "+ d); // クラス判定 System.out.println(""); String st="ok"; System.out.print("st が Stiring クラスのインスタンスか? "); System.out.println(st instanceof String); System.out.print("st が Object クラスのインスタンスか? "); System.out.println(st instanceof Object); } } ------------------------------------------------------------------------ ▼ 演算子の優先順位  + と * では,* の方が先に計算されます。このように演算子同士では,優先順 位があります。+ より,* や / が優先されることは,直感的に分かりますが,そ の他は,分かりにくいため,( ) を積極的に使用するとよいでしょう。 x = 1; z = 2; // のとき y = z*++x; // y = 4 となります。 y = z*(++x); // ( ) を利用して,このように記述した方がいいです。 ------------------------------------------------------------------------ ▼ いっぱいある演算子  JavaScript や Java では,c 言語からの影響で,演算子が多いです。これは, プログラムの入力を効率的やる,コンパイル後の機械語と対応しやすいようにす るという c の思想が反映しています。JavaScript や,Java では,それらのメリッ トは,小さいです。c 言語の演算子に合わせることで,JavaScript や Java では いらぬ混乱をしないようにしているでしょう。得意になって,やたらに,c 風に コーディングするのは良くないですが,c を知らずに JavaScript や Java を これから書かれる方は,いらぬ混乱を持ち込まないように,先輩のコーディング に合わせられることをお勧めします。 ------------------------------------------------------------------------ ▼ お詫び,第9号の swich文内のbreak の説明  第9号の,break を省略したときの説明が間違っていました。保存用は修正 してあります。swich の段階で値が評価されて,case のところは,ただの飛び 先です。case のところで判断をするわけではありませんでした。 ------------------------------------------------------------------------ ▼ 次号の予定  型変換  感想は,斎藤まで,suehiro@he.mirai.ne.jp  広告等のお問い合わせ:*** ------------------------------------------------------------------------ ▼ 誤字・脱字等の修正,プログラムの修正など,以下の場所で確認できます。 過去の修正版等  http://www.mirai.ne.jp/~suehiro/java/jmaga/ 登録・削除および広告の案内  http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガは役立ったあるいは勉強になりましたか? 該当するものだけ残してください。 5: 大いに,YES 4: YES 3: 普通 2: NO 1: 大いに,NO その他