[ 前へ | 目次 | 次へ ]
Now Loading...
ダウンロード
PC (※スマートフォンでは動きません) でダウンロードし、ZIPファイルを右クリックメニューから展開して、できたフォルダ内の「 VCSSL.bat(バッチファイル) 」をダブルクリックすると起動します。 Linux等では「 VCSSL.jar 」をコマンド実行してください。
» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら

[公式ガイドサンプル] 四則演算の計算順序や、カッコを使った順序指定

このプログラムは、 「 VCSSLスタートアップガイド 」 の 「 式と計算、データ型 」 の回に登場するサンプルコードです。 ここでは、そのサンプルコードを実行環境ごとダウンロードして、実際に実行してみる事ができます。 プログラミングガイド的な詳しい解説については、上記ページをご参照ください。

スポンサーリンク


使用方法

ダウンロードと展開(解凍)

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされます。

Windows をご使用の方は、ここでまずZIPファイルを右クリックし、「プロパティ」を選んで開かれる画面で、 下の方にあるセキュリティ項目の「許可する」にチェックを入れて「OK」で閉じてください。 これを行わないと、ZIP展開やソフト起動時に、警告メッセージが出て展開完了/起動できない場合があります。

その後、ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合や、ファイル名が文字化けしてしまう場合は…

プログラムの起動

Windows をご使用の場合

上記の通りにZIPファイルを展開したフォルダ内にある、 「 VCSSL__ダブルクリックでプログラム実行.bat(種類はバッチファイル) 」をダブルクリック実行してください。 もしプログラムを書き変えながら使いたい場合は、代わりに「 VCSSL_Editor__プログラム編集はこちら.bat 」を実行してください。

正常に起動できると、初回のみ、Java実行環境を入手するか等を尋ねられるので、適時答えて済ませると、プログラムが起動します。 2回目以降はすぐに起動します。

» うまく起動できずにエラーになってしまう場合は…

Linux 等をご使用の場合

ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:

java -jar VCSSL.jar
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)

» javaコマンドが使用できない等のエラーが表示される場合は…

起動後

起動すると、黒い画面に値が表示されます:

7
2
320

これら値は、コード内(すぐ後で解説します)で、各行の「 println(...); 」のカッコ内にそれぞれ記述した式:

1 + 2 * 3
4 * 5 / 10
2 * ( 30 + 50 + 80 )

が計算された結果の値になっています。

コード解説

このプログラムのコードはVCSSLで記述されています。 このプログラムはサンプルコードですので、 ぜひ式の内容を書きかえて、色々な値を計算してみてください。

実際に内容を書き変える際には、 プログラムのコード「 OperatorPrecedence.vcssl 」をテキストエディタで開いて編集してください。 VCSSLはスクリプト言語なので、コンパイラなどの別ソフトは不要で、コードを書き換えるだけでOKです。 C系の単純な文法の言語なので、C言語などに触れた事のある方なら簡単に読み書きできると思います。

それでは実際に、プログラムのコード内容を見てみましょう:

たった3行の短いコードですね。内容については、 スタートアップガイドの「式と計算」の回でも説明していますので、必要に応じて併せてご参照ください。 このコードは、その記事に登場するサンプルコードです。

なお、今回の内容は、前々回の内容の続きになっています。 前々回は、かけ算と割り算を行うサンプルコードを紹介しつつ、足し算・引き算との優先度(計算順序)の違いなどの注意点を、軽く触れる程度に説明しました。 今回は、それをもう少し掘り下げた内容です。 必要に応じて、記事の記事も併せてご参照ください:

では、今回のコード内容を一行ずつ見ていきましょう。

println 関数について

前回も説明しましたが、まず各行の計算式を囲っている println(...) の部分について触れておきましょう。 これは、カッコ内の「 ... 」の所に書いた内容を画面に表示して 改行する 機能を持った関数です。 今回のように、複数の結果を表示する際などに、1行につき1つの結果を表示するのに便利です。

なお、関数名の末尾に「ln」を付けずに print(...) とすると、繰り返し呼んだ際に、改行されずに1行に続けて表示されます。println 関数は、それに自動改行機能が付いた派生版です。

print / println 関数の働きのイメージを図にすると、以下のように「 カッコ内に値や式を投げ込んで、それを表示してもらう 」という感じです。

print / println 関数の働きのイメージ

整数同士の割り算

それでは、最初の行についてです。

前々回も登場した通り、「 * 」記号は、多くのプログラミング言語では「かけ算の記号」として使われていて、VCSSLでも同様です。「×」の代わりに「 * 」と書く、という具合です。

先に述べた println 関数の説明と併せると、つまるところ上の行は

1 + 2 * 3

をの値を計算して、それを画面上に一行で表示する、といった処理になります。そして、結果の最初の行に、その答えが

7

と表示されたわけです。

足し算とかけ算が混ざった式では、通常、かけ算が先に計算される

さて、上で見た計算には、一つ注意が必要な点があります。それは、

「 1 + 2 * 3 」の計算において、「 1 + 2 」の部分ではなく、「 2 * 3 」の部分が先に計算されている

という点です。その後で、左にある足し算が行われて、1 が足されています。なので、結果が 7 になったわけです。 だって、もしも左から順に、「 足し算 → かけ算 」の順番で計算されたとすると、結果は 9 になるはずですよね。

つまり、このコードで何が言いたいかというと、

プログラミングでは、計算式の中の足し算とかかけ算とかは、書いた通りの(左からそのままの)順番で計算されるのではない

という事実です。シンプルな電卓などは、叩いた通りの順序で計算されるので、電卓との違いには注意が必要です。

この点は、前々回の記事の後半でも触れたので、併せてお読みください。 今回はその続きなので、重複する内容については飛ばし気味に説明していきます。

演算子の優先度

では、一体どういう順序で計算されるのか? が重要ですよね。

簡単な言い回しでは、前々回に触れた通り、「 足し算・引き算よりも、かけ算・割り算(&剰余演算)が先に計算される 」と言えます。 で、今回はここをもう少し、ちゃんとプログラミング言語の言い回しを使って、少し掘り下げてみましょう。

まず前提として、「 +(足し算)」「 -(引き算)」「 *(かけ算)」「 /(割り算)」「 %(剰余演算)」などのように、基本的な演算をする時に使う記号の事を、「 演算子(えんざんし) 」と呼びます(※)。 なんだか難しそうな呼び方ですが、意味的にはただの「演算の記号」以外の何者でもないので、怖がる必要はありません。

※ プログラミングの用語では、このように「 〜子(し)」と呼ばれるものが多数あります。識別子とか、修飾子とか、初期化子とか、などなどです。列挙子(れっきょし)という、なんだか物凄く強そうな響きのやつもあります(三国志とかに出てきそうな意味で)。

で、プログラムの文法において、何かしらの働きを持っている語句など(単語とか名前とか)は、大体このような呼び名を持っています。 ルーツになっている英語での呼び名と比べると、大体は和訳において、「 -er や -or 」の部分に「 〜子 」を当てはめたものになっています。 そして、「 -er や -or 」というのは、「 何かを行うやつ 」といった意味合いを持ちます。つまり「 〜子 」は、「 〜を行うやつ 」みたいに読み替えれば、意味をイメージやすいかもしれません。

いまの場合にあてはめてみましょう。「 演算子 」は英語で「 Operator(オペレーター)」ですが、これは「 演算する 」という意味の「 Operate 」に「 -or 」が付く事で、「 演算を行うやつ 」みたいなニュアンスになっている単語です。 なので和訳でも、「 演算 + 子 」をそのまま「 演算 + を行うやつ 」と読み解けば、「 なるほど、確かに『 + 』とか『 − 』とかはそうだなあ 」としっくりきませんか?

そして、各種の演算子には、それぞれ処理順序における優先度(Precedence)が決まっています。これは言語のルールとして決まっています。多くの言語(VCSSL含む)では、四則演算については、下図のような優先度になっています:

優先度の高低の図

上図の通り、足し算の「 + 」演算子よりも、かけ算の「 * 」演算子の方が優先度が高いので、かけ算の部分が先に計算された というわけです。

なんだか言い回しがややこしくなっただけに感じますか? でも、各種の演算子がそれぞれ優先度を持っているというイメージは重要です。 なぜなら、四則演算だけでなく、大小比較や、「かつ」とか「または」みたいな条件記述のための演算子も、全て優先度を持っているためです。 演算子の種類はかなり多いので、「 〇〇は●●よりも先に計算される 」といった言い回しでは、正確な把握に限界があります。

各種の演算子の優先度は、例えばC言語等の場合は「 C言語   演算子   優先度(とか優先順位とか) 」などとWeb検索すると、表のような形でまとめられているページが多数見つかります。 他の言語でも同様です。VCSSLやVnanoの場合は、こちらのページなどで大体把握できます。 なお、この種の表は大抵、優先度は数字で書かれていて、値が小さい方が優先度が高く、先に計算されるので、読む際に注意が必要です。

同じ優先度の演算子が並ぶ場合

さて、それでは次のコード行を見てみましょう:

これは、以下の計算:

4 * 5 / 10

の結果を表示するものですね。

さて、先ほどの優先度の話を踏まえると、かけ算の「 * 」演算子と割り算の「 / 」演算子で、優先度が高い方が先に処理されるはずです。 という事で優先度を調べると、実は

「 * 」と「 / 」の演算子の優先度は全く同じ

です。これは困りましたね。こういう場合はどっちが先に処理されるんでしょうか?

もし「 * 」が先に処理されれば、答えは「 20 / 10 = 2 」になるはずで、逆に「 / 」が先に処理されれば、答えは「 4 * 0 (※整数除算、前回参照) = 0 」になるはずです。 実際の結果は:

2

と、この通り「 * 」が先に処理された事がわかります。

基本的に、足し算・引き算・かけ算・割り算・剰余演算のカテゴリー内では、同じ優先度の演算子が並ぶ場合、左にあるものから順に処理されると見なせます。 なので上の例では、左側にあった「 * 」が先に処理されたわけですね。

ところで、上の事は、全ての種類の演算子について成り立つわけではないという事に留意が必要です。 具体的には、上の事は、「 左結合 」という種類の演算子について成り立ちます。

逆に、「 右結合 」という種類の演算子では、同じ優先度のものが並ぶ場合に、右にあるものから順に処理される事になるので、その事は意識に留めておく必要があります。

ただ、右結合の演算子の多くは、演算対象の値を一つしか持たない(例外あり)ので、並べても「 イメージ的にそうなりそう 」という素直な順序になる事が多いです。 なのでこれまでの例と比べると、そこまで混乱する場面に出会う事はレアかもしれません。むしろ優先度の方が要注意だったりします(キャストとか)。

優先度によらず、処理の順序を自由に調整したい場合は、カッコでくくる

さて、最後のコード行です:

これは、以下の計算式:

2 * ( 30 + 50 + 80 )

の結果を表示する内容です。この計算式には、新たに カッコ「 ( ) 」が登場しています。

これはもうイメージ通りで、カッコ内に書いた内容が、カッコの外側よりも先に計算されます。 カッコの外にどれだけ優先度の強い演算子が「くっついて」いようが、問答無用でカッコ内の計算完了が優先されます。

計算結果は:

320

と、この通り、本来はかけ算の方が足し算よりも優先度が高いはずなのに、カッコ内の「 30 + 50 + 80 = 160 」が先に計算され、その後にかけ算「 2 * 160 = 320 」が行われた事がわかりますね。

今回の内容は以上です。今回触れた、演算子の優先度や結びつき方は、間違って把握していても、大抵エラーにはなってくれず、「動くけど何かおかしい挙動や値になる」という、ややこしいバグが生まれます。 たとえば if 文の条件指定で「 && 」や「 || 」演算子を並べて書く際にも、優先度には注意が必要で(&& が優先されます)、間違っていても「 想定外の状態で if 文に突入する 」だけで、走ってしまいます。 怖いですね!

記事の著者

松井 文宏 - Fumihiro Matsui
RINEARN代表、VCSSL & Vnano やリニアングラフ3D/2D、その他 諸々を開発しています。

ライセンス

このVCSSL/Vnanoコード( 拡張子が「.vcssl」や「.vnano」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 記事中にC言語/C++/Java言語などでのサンプルコードが掲載されいてる場合は、それらについても同様です。 そのままでのご利用はもちろん、改造や流用などもご自由に行ってください。

※ ただし、このコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。

※ Vnano の実行環境については、別途スクリプトエンジンのソースコードも一般公開しており、 何らかのソフトウェア内に組み込んでご利用いただく事も可能です。詳細はこちらをご参照ください。

この記事中の商標などについて

  • OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  • Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
  • Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
  • その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。


スポンサーリンク



[ 前へ | 目次 | 次へ ]
[公式ガイドサンプル] 四則演算の計算順序や、カッコを使った順序指定

「VCSSLスタートアップガイド」内のサンプルコードです。四則演算が計算される順序や、カッコを使って順序を指定する方法を例示します。
[公式ガイドサンプル] 割り算の結果や、余りなどを画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。整数や小数(実数)における割り算結果や、整数の場合の余りを画面に表示します。
[公式ガイドサンプル] かけ算と割り算の結果を画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。かけ算と割り算を行って、結果を画面に表示します。
[公式ガイドサンプル] 引き算の結果を画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。引き算を行って、結果を画面に表示します。
[公式ガイドサンプル] 式を複数行にわたって書く

「VCSSLスタートアップガイド」内のサンプルコードです。足し算を行う式を、複数行にわたって記述します。
[公式ガイドサンプル] 足し算の結果を画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。足し算の結果を求めて、画面に表示します。
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(魔法陣形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、魔法陣のような3次元曲面のグラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで3次元のメッシュグラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、3次元のメッシュグラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(花形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、花の形の3次元曲面のグラフを描画します。
[公式ガイドサンプル] CSVファイルに書かれた数値データを、配列として読み込んで表示する

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルに記載された数値データを、読み込んで配列に格納してから、内容を画面に表示します
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで3次元の線グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、3次元の線グラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを丸めて書き出し、読み込んで2次元グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを、丸め処理を行った上で書き出し、さらにそれを読み込んで、2次元グラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで2次元グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、2次元グラフを描画します。
[公式ガイドサンプル] CSVファイルを読み込んで2次元グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルに記載されたデータを読み込み、2次元グラフを描画します。
この階層の目次
[ 前へ | 目次 | 次へ ]
お知らせ

関数電卓 RINPn をアップデート、折りたたみ可能なキーパネルを搭載
2022/11/11 - 関数電卓 RINPn のアップデート版を公開しました。画面デザインを少し見直し、今回から、1クリックで折りたたみ/展開が可能なキーパネルを搭載しました。詳細をご紹介します。

リニアングラフ3Dをアップデート、軸反転がリセットされるバグの修正など
2022/11/03 - リニアングラフ3Dのアップデート版をリリースしました。軸反転がリセットされるバグや、設定ファイル読み込み時に等高線の区間数が反映されないバグの修正を行いました。

各ソフトウェアのアップデートのお知らせ
2022/10/12 - リニアングラフ3Dなどの各ソフトウェアのアップデート版を、一括でリリースいたしました。各ソフトの更新内容をお知らせします。

新着
角度の「度」とラジアンとを相互変換し、図示もするツール

45度などの「度」の値と、ラジアンの値とを相互に変換できるツールです。対応する角度の図示もできます。
2022/11/22
[公式ガイドサンプル] 立体モデルを回転させるアニメーション

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、アニメーションで回転させ続けます
2022/11/18
[公式ガイドサンプル] 立体モデルを回転させる

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、指定した角度だけ回転させます。
2022/11/17
[公式ガイドサンプル] 四則演算の計算順序や、カッコを使った順序指定

「VCSSLスタートアップガイド」内のサンプルコードです。四則演算が計算される順序や、カッコを使って順序を指定する方法を例示します。
2022/10/31
[公式ガイドサンプル] 割り算の結果や、余りなどを画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。整数や小数(実数)における割り算結果や、整数の場合の余りを画面に表示します。
2022/10/30
開発元Twitterアカウント