LoginSignup
23
6

変数の代入演算子と等価演算子について

Last updated at Posted at 2018-07-07

はじめに

C言語系は代入の構文がわからない人お断りでそこでつまづく人は結構見た。 aの値をbにするというのが「a=b」でプログラミング経験の無い人にはaとbは等しいという関係式にしか見えない。

というコメントを何かで見た。自分は件について躓いたことが無いので分からなかったけど、そういうところで躓くんだな。

【2023/11/14追記】 いい記事があった。

仕事で、たまにDelphi5(Object Pascal)のアプリケーション改修をすることもあってPascal言語を扱うのですが、変数の代入には「a := b」と「:=」を使用します。不慣れで「:」を忘れてコンパイルエラーになることがあります。

面倒くさいなと思っていたのですが、人工知能ブームで数学を意識するようになり数学に関する記事を書くようになって、代入演算子の見方を変えてもいいかなと思いました。
調べてみるとPascal言語は数学の表現を重視しています。例えば対数はDelphi では「ln」 ですが、他の言語は「log」を使用しています。

代入演算子と等価演算子

C言語、Perl、Javaなど多くのプログラム言語の代入演算子には「=」、数学での「=」に当たる等価演算子は 「==」(ダブルイコール)を使用しています。
これらの言語に対し、Pascalなどは代入演算子には「:=」(コロンイコール)、数学の用法と同じく等価演算子は「=」を使用します。
BASICは、代入と等価演算は同一の「=」を使い、文脈によって等価演算子か代入演算子かを判断している。
※本来、変数代入時にはLETキーワードを指定するが省略可能なため使用されることはほぼない。

起源

=を代入に使うのは FORTRAN が起源とされる。FORTRAN は文字・記号の種類を非常に少なく設計しており、なおかつプログラムでは頻繁に使われる代入を簡単に表せるようにするため、このような言語仕様になった。なお、のちの多くの言語と異なり、FORTRAN の等価演算子は == ではなく .EQ. である。
等号 wikipedia
※Fortran 90からはC言語ライクな等価演算子の ==もサポート

「=」を代入演算子に使用したのは確かに FORTRAN ではあるが、C言語やPascalの先祖とも言えるALGOL(1960年誕生) は代入演算子に「:=」、等価演算子は「=」でした。C言語を作るときにALGOLと同じにすることも出来たのですが、代入の方が等価演算より書く機会が多いので、短く書ける代入演算子を「=」、等価演算子に「==」を割り当てたようです。

各プログラミング言語の使用方法

※関数型言語の場合、代入演算子は束縛という意味を含めている。
参照:関係演算子 wiki

様式 代入演算子 等価演算子 備考
数学 := =
フローチャート <- = 矢印(<-)は反対向き(->)も可能
ALGOL 68 := =
BASICライク[note 1] = = 代入時にはLETキーワードを使用(省略可能)
C言語ライク[note 2] = ==
COBOL = or MOVE TO = = 演算子を使う際にはCOMPUTEキーワードを付ける
ColdFusion = EQ
Fortran = .EQ. Fortran 90からはC言語ライクの等価演算子もサポート
APL = 専用のキーボードを使い直接入力可能
Smalltalk = Pharoなど比較的新しい処理系では代入に:=も使用可能に
GO = or := == 関数内に限り:=演算子を使用することで、varキーワードも省略可能
Haskellライク[note 3] = = 束縛時にLETキーワードを付けるとローカル変数、付けないとグローバル変数扱い
Javascript = == 代入時にvarキーワードを付けるとローカル変数、付けないとグローバル変数扱い
Pascalライク[note 4] := =
PL/SQL(Oracle) := =
Prolog = is or =:= 代入は束縛
Scala = = varキーワードを付けると再代入可能、valキーワードを付ける再代入不可
R <- or = == 矢印(<-)は反対向き(->)も可能、= 演算子は関数呼出の際の引数[省略]名時に使用
shライクなシェル[note 5] = -eq
MATLAB = ==
Mathematica = ==
バッチファイル = EQU 代入時にはSETキーワードを使用
なでしこ = or は or 代入 = or == 変数への代入方法は3つ。変数 = 値、変数は値、値を変数に代入

note(注釈番号)

  1. VB.NET、OCaml、PL/I、SQL、Standard MLなど。
  2. C、C++、C#、D、Erlang、Elixir、Groovy、Haxe、Java、Julia、Kotlin、Lua、Objective-C、Perl、PHP、Python、Ruby、Swiftなど。
  3. F#、OCaml、Rustなど。
  4. Ada、Delphi、Standard MLなど。
  5. bash、ksh、Windows PowerShellなど。

細かいところで、constキーワードやJavaのfinalキーワードなど再代入不可など含めると書くのが大変になるのでほどほどにします。

どうして1+1=2なの?

10年前に放送したドラマに「エジソンの母」というのがありました。1
主人公は東京都杉並区内の公立小学校1年の担任教師。世界的な発明家、トーマス・エジソン並みの才能を持つ(と言われている)小学生の少年に引っ掻き回されながらも、懸命に奮闘する規子と児童との格闘をコメディタッチで描く。

第一話では「どうして1+1=2なの?」という小学一年生の男の子の問いかけにクラスが騒然となるという話でした。
この中で相談された大学の先生らが、「1+1=2」ではないという例えを出してくるわけです。

  • 2進法 1 + 1 = 10
  • 論理和 1 + 1 = 1
  • 文字列 1 + 1 = 11
  • 剰余系 1 + 1 = 0
  • bool代数 1 + 1 = 1

結局、「1+1=2」というのは、あくまで算数というローカルの世界での正解でしかないという結論です。

母親が「たぶんね、1+1=2っていうのは、ただの決まりごとなの。 けれど、そうやって前に進んだら、 いろんなことがわかってくるようになるのよ」という話で、そのドラマ内の子供は納得して終わったと記憶しています。

先ずはルールとして覚えなさいとなるわけです。

最後に

小学生のプログラミング教育は、「コンピューターが身近に活用されていることや、問題解決をするには必要な手順があることを気付かせる」ことであって、入力の仕方やプログラミング言語を覚えることではないとのこと。

子供向けプログラミング言語 Scratch(スクラッチ)では、変数ブロックを用意して「(変数名)を(値)にする」というようにしています。代入演算子は出てきませんが、演算ブロックでは左と右の値が「等しい」として等価演算子「=」が使われます。

件のC言語系の代入の構文がわからない人は、最近話題のPythonの代入演算子でも「=」ですからね、やはり一旦フローチャートかPascalかR言語を先に習って慣れてからC言語系に移行するようにしたらいいのではないでしょうか。

  1. 10年前に別ブログに感想を書いていた。

23
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
6