私が経験した周りだけのことかもしれませんが、IT業界の人ほど新しい物事を基礎的に習っていない傾向にあると考えます。 例えば、プログラミング言語は最初だけ入門し、後からはいわゆる「地頭力」的な力で覚えていると考えます。
地頭力は危険
プログラミングじゃない分野で地頭力は行動指針を決める参考程度にしかならないと言いました。 他人への助言に地頭力は使ってはいけません。 それと同様に新しい言語を習うときに完全な地頭力を使うと大きな失敗をします。
確かに変数の宣言、代入、ループなどは大きく違わないので地頭力でコードを読み続けることが出来ます。 しかし、地頭力による理解では全く新しいコンセプトは理解できないと考えます。
C++とConst
実は私は仕事でC言語やC++を使っていました。今でもどこかで私が書いたサービスが動いているのではないかと考えます。 しかし、最近C++の解説書であるプログラミング言語C++を読んで衝撃を覚えました。
実は新しい言語を古いスタイルで使っていたと言うところです。私はC++を「構造体に関数を書くことが出来る便利な言語」と言う程度でしか考えていませんでした。
知らなかったことの一例をあげると const です。 もちろん、const は定数の宣言であることは知っています。
const float g = 9.8;
って書けば浮動小数点型でgという変数が定数として宣言される。そしてプログラム内部で書き換えようとするとコンパイルエラーとなると言う事は知っていました。
しかし、これはどうでしょうか?
- int x;
- scanf("%d",&x);
- const int y=x;
- for(int i=0;i<x;i++) printf("*");
えっ、constなのにプログラム中で変化する数字を代入しているの? って疑問です。
constの真の意味
上記のコードでは2行目で入力した値をxに代入しています。そして、そのxを定数型のyに代入しています。 当然xは入力される値で不定です。だったら、y=x; としているからconst 定数じゃないだろ?
ここではそういう意味ではなく、4行目では変化するxを今から定数にすると言う意味で使っています。
このため、4行以降で y=3; とするとコンパイルエラーになります。
変数の自動宣言
そう言われてみれば auto という宣言が有ったと思いますが、その真意は知らないままだと思います。
- #include<stdio.h>
- int f(int a){
- return a*a;
- }
- main(){
- int x;
- scanf("%d",&x);
- const auto y=f(x);
- printf("%d\n",y);
- }
このコードの12行目で const auto y=f(x); としています。 この宣言をすることでyは関数f()の戻り値で型式を宣言されます。
これにより、一箇所のintの定義によりそれに関連する場所全てが int で宣言されます。 また、const により関数f()の戻り値が代入されたyはこの後書き換わることが無いということも明示されています。
余談ですが、このコードを見ると古株から
「変数は関数の開始時に定義するように」
と言われそうです。しかし、C++の解説書では代入間違えをしないという意味で、途中で宣言することに意味があるとしています。
今回のyもmain関数の先頭で宣言するより、途中で明確に const であるとしたほうがわかりやすく意図しない変更防止が出来るとしています。
最後に
ITエンジニアってMicrosoft Office の入門書って読んだことが無いのではと考えます。私もそうでした。ただ、最新のOfficeの入門書を読むと昔とはコンセプトが違うことに気が付きます。 それと同じように、新しい言語も古い言語には無いコンセプトがあります。
もちろん、言語なので昔のコンセプトで組むことも出来ますが、それでは新しい言語を使っても楽は出来ません。 新しいツールには確実に楽に出来る機能が追加されています。
ですので、C言語からC++を覚えた人や、C++はクラスが追加されただけと思っている人は是非入門書や解説書を読んでみて下さい。