変数と式


 プログラミングの基礎は「計算」です。グラフィックスで直線や円を描くにも背景で、細かい計算が行われています。いくつかの要素を組み合わせるとき、のも「計算」が必要です。ここでは、計算の基礎となる、「変数」と「式」の書法を紹介します。たくさん出てきますが、とりあえず、こんな機能や演算がある、くらいを眺めてください。

  1. プログラムと文

     プログラムはいくつかの<文>の集まりです。各<文>の最後には ; をつけます。
      文1;
      文2;
      ...
      文n; 
     文の途中に 半角(英数字)の空白をいれてもかまいませんが、全角(ひらがな)の空白をいれてはいけません。文の先頭または末尾に // をつけると以後は<注釈>(説明)となり、プログラム実行の対象にはなりません。文字や文字列については別項で紹介します。
  2. 数の変数

     変数(variable)は数字や文字などを記憶する「もの」です。processing では記憶する内容や大きさにしたがって型と名前を指定して変数を宣言します。以下は変数を宣言する<文>の例です。
    int kazu; //整数
    float ondo; //小数
     int が型名で 整数 の意味です。 float は 小数点付の数字を意味します。計算機内部では小数と整数では計算の方法が異なるので区別して表現します。kazu は変数の名前で英字で始まる英数字です。英字は a-z A-Z に _ を含めます。<変数>に続いて = 次に<式>を書くと、<変数>に<式>の値を代入(保存)できます。
     <変数>=<式>
     式は加減乗除の演算 +、-、*、/ と丸括弧 ( ) で記述します。整数の計算では 2/5 は0.4(これは少数)でなく 0 になることに注意してください。% は割った余りを返す演算です。
     kazu = 1;
      kazu = 3+4*5;
      ondo = 12.5;
      ondo = (3.0-6.2)/2.0;
      kazu = 2/5 ;// kazu = 0
      ondo = 2.0/5.0 ;// kau = 0.4
     変数の定義と初期値の設定を同時に行うことができます。このとき、先頭に final をつけると 以後の値の変更ができなくなります。定数として使いたいときに便利です。値を変えるとエラーになります。定数にするときは、通常名前に大文字を利用します
     float pi=3.1415;
      final float PI=3.1415
  3. 数の型とバイト数

     int 型の整数の計算は、通常、処理装置(CPU)のビット数になります。32ビットマシンなら int は32ビット(4バイト)で計算します。整数の型には他に、半分のビット数で行う short 型と倍のビット数で計算する long 型があります。ビット数を超えて計算をすると、正のはずの結果が負になる、などの「異常現象」がおこります。short の変数で 16384 を2倍すると、正の桁数の範囲を越えるため見かけ上、負の数となってしまいます。変数の値を表示するため、 println(変数); を利用しています。
      short by=1;
      for(int i=0;i<16;i++){
        println(by);
       by=(short)(by*2);
      }
    /// 結果
    1 
    2 
    4 
    略
    8192 
    16384 
    -32768 
     小数の場合、float または double を利用します。Processing では標準は float で32bit(4バイト)を利用します。double は倍で 64ビットで計算します。他に、true/false の2値を扱う boolean、1バイトのデータを扱う byte 型の変数が利用できます。

  4. 整数と小数

     整数と小数をまぜて書くと整数は小数に変換してから計算されます。小数型の変数に整数を代入すると整数は自動的に小数に変換されて代入されます。
    を利用します。以下はプログラムと実行例です。変数の値を表示するため println(変数); を利用しています。
      int kazu; //整数
      float ondo; //小数
      kazu = 2/5 ;// kazu = 0
      println(kazu);
      ondo = 2.0/5.0 ;// kau = 0.4
      println(ondo);



     整数に小数を代入するプログラムは、"cannot convert float to int" (小数は整数に変換できません)のメッセージが表示され実行できません。
     ondo = 2/5;
     println(ondo);
     kazu = 2.0;

     小数を自動的に整数に変換すると、誤差が出るため「危険」と判断するからです。この場合、次のように、(int) で整数変換を指定すると実行してくれます。この型変換機能を「キャスト」演算とよびます。
      kazu = (int) 2.0;
     整数に関しては、他に 一つ増す(減らす)演算、++、--、があります。これは注釈の代入文の省略形式です。
     int i=0;
      i++; //i=i+1;
      i--; //i=i-1;
  5. 数の型とバイト数

     int 型の整数の計算は通常処理装置のビット数になります。32ビットマシンなら int は32ビット(4バイト)で計算します。整数の型には他に、半分のビット数で行う short 型と倍のビット数で計算する long 型があります。ビット数を超えて計算をすると、正のはずの結果が負になる、などの「異常現象」がおこります。nf(by,5) は by を5ケタの数字に変換する指定です。short の変数で 16384 を2倍すると、正の桁数の範囲を越えるため見かけ上、負の数となってしまいます。
      short by=1;
      for(int i=0;i<16;i++){
        println(by);
       by=(short)(by*2);
      }
    /// 結果
    1 
    2 
    4 
    略
    8192 
    16384 
    -32768 
     小数の場合、floatは4バイトで、double は倍長の小数で8バイトになります。最近のコンピュータは double の計算をハードウエアで行いますから、double が標準になります。
  6. 論理型変数と演算

     計算機の判断は true/false であらわされる論理型になります。論理型の変数は boolean で宣言します。大小関係の判断は >、<、>=、<=、==、!=、で 大きい、小さい、以上、以下、等しい、等しくない、の意味になります。
     複数の判断の 論理積、論理和 の記号は && ,|| となります。
     boolean rs;
     rs = (kazu < 5) && (kazu > 3); //5より小さく、かつ、3より小さい
     rs = (kazu < 5 ) || (kazu > 3);//5より小さいか、または、3より小さい
     ! は 論理否定になります。
     rs = !(kazu == 5 ) ;// kazu != 5
     論理型演算は、次の章も条件付き実行や繰り返し実行での判断でよく利用されます。
    小数の場合 == の判断は不適当で、  
     abs(s-1.0)<0.00001 // abs は絶対値の計算
    のような判断が必要です。
     double s=0.0;
     for(int i=0;i<10000;i++)
      s=s+0.0001;
     boolean rs;
     rs =(s==1.0);//sは1.0に等しいか?
     println(rs);
     println(s);
    ///結果
    false
    0.9999999747378752

  7. その他の演算

     += は 左辺の変数を右辺の先頭におく演算子で、 -=、*=、/= 、なども利用できます。++、--、は1個増す、減少する演算子です。 また、 >>、<< は指定ビットだけ右または左にシフトします。1010 を左に2回シフトすると、101000 になります。
     kazu += 1; //kazu = kazu +1
      kazu++;    //kazu = kazu +1
      kazu--;    //kazu = kazu -1
     |,&,^ は整数の各ビットを倫理和(OR)、論理積(AND)、排他的論理和(EXOR)します。binary(kazu) は kazu を2進文字に変換します。
      int i=10;
      println(binary(i));
      int j=9;
      println(binary(j));
      println(binary(i+j));
      println();
      println(binary(i<<2));
      println(binary(i>>2));
      ///以下は実行結果
      1010
      1001
      10011
    
      101000
      10
     少し見慣れない演算子に 条件指定をする三項演算子があります。これは、条件演算が成立するとき 式1、しないとき 式2 の値をとり、次項で説明する if を使うこともできます。
     (条件演算)?式1:式2;
    例 int abs = (x>0)? x : -x ; //xの絶対値をabsとする

  8. まとめ

    演算子を優先順位の順に並べると以下のようになります。優先順位の低い演算を高い演算より優先して実行するには( )が必要です。「配列」については、次項を参照してください。べき乗を扱う演算子はありません。メソッドの pow() を利用します。
    ( ) [ ]  括弧、配列要素の選択
    ++ -- ~ ! (型) 増加、減少、ビット反転、キャスト
    * / % 乗算、除算、余り
    + -  加算、減算
    >> <<  >>>  右シフト、左シフト、0フィルの右シフト
    >、 >=、 < 、<=  比較
    == 、!=  同値、
    &、、^ | 論理積、排他論理和、論理和
    && 、||  短絡論理演算
    ?:    三項演算
    =、+=、 -=、 *-、 /=、  代入、演算付代入
    論理演算になれていない方は、他の web ページなどを参照してください。計算機内部では計算は2進数でお来ないます。使用できるビット数に制限があるため、許容範囲を超えると変な計算結果になりますから注意してください。16ビットの int 型の場合、2の16乗が表現できる最大数になります。この範囲で正と負の数を扱いますから、2の15乗-1(32767)が最大値になります。