今日やっとまとまってお小遣いを使えるチャンスがめぐってきたので。
念願のC++言語のカラクリ購入させてもらいました!><b
めっちゃ楽しみです。実は←でオヌヌメするとか言いつつまだ読んでなかったのはオイラだったのです・・;。
επιστημηさん、おゆるしくだされOTL
それに関連して、先日のスーパーあんどちんさんの「あえて反旗を翻す」という記事に今頃乗っかってみます。
たとえばC#から入ってみると、そこには全くポインター演算の無い世界が広がっています。・・・本当にそうなんでしょうか?
実際には言語上の怪しい・・・そうそれこそカラクリでもってそれは巧妙に隠されているだけですよね。それは参照型か値型かの違いとC#のマニュアルには書いてあります。その違いの把握ってのは、やっぱりポインターという概念の把握と全く同じことであって言葉上「ポインター」って単語が出てきていないに過ぎません。 そこを突き詰めるとアセンブラーやらCやらで色々と面倒だったことがC++やらC#やらで高級になって不要になったわけじゃなくて、やっぱり先人たちの最初に築き上げたコンピュータプログラミングの基盤というのはどれも形を変えて今も生き残っています。
そういうのをスマートに理解するには参照型たら値型たら言うよりもCとかアセンブラーをちょろっとやったほうが断然分かり良いと私には思えます。そういう私はアセンブラーはほぼ知らずですが一応C言語から入ったクチです。
果たしてC#から入って一切アセンブラー的な教育(しごき?洗礼??)を受けないで下のコードを参照だから、とか値だから、とかをどうやって頭に描いてるのかすごく興味を感じるところです。
using System;
namespace Console1
{
class Class1
{
internal int N;
public Class1(int n)
{
N = n;
}
}
struct Struct1
{
internal int N;
public Struct1(int n)
{
N = n;
}
}
static class Program
{
[STAThread]
static void Main(string[] args)
{
Class1 ca = new Class1(10);
Class1 cb = ca;
cb.N++;
Console.WriteLine("ca.n={0}, cb.n={1}", ca.N, cb.N);
Struct1 sa = new Struct1(10);
Struct1 sb = sa;
sb.N++;
Console.WriteLine("sa.n={0}, sb.n={1}", sa.N, sb.N);
}
}
}
上のコードの
青い部分と
赤い部分は識別子の並び的には全くイコールの部分に見える。しかし結果は以下のように違う。 違いは”参照型”か”値型”かなのである。
