パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

人気のプログラム言語TOP 10 を解説せよ」記事へのコメント

  • CはCでも・・・ (スコア:5, おもしろおかしい)

    by Anonymous Coward

    世の中はCでできている。WindowsだってLinuxだってアメンボだって、みんなみんなCでできている。

    プログラミング言語だってCでできている。PythonだってRubyだってオケラだって、みんなCでできている友達なんだ。

    アメンボとオケラのCは炭素では?

    • by Anonymous Coward

      Cの難易度が誇張されているように思うのだが。
      Javaより難しい?

      • Re: (スコア:1, すばらしい洞察)

        by Anonymous Coward

        世の中にはポインタの加算でなにが起きるか理解できてないのが結構いますから。

        • by Anonymous Coward
          「ポインタの加算」って、ポインタとポインタを足し合わせるのか?そりゃ、何がおこるか理解できんわな。
          • by Anonymous Coward
            やってみるとわかるけど、ポインタ同士の演算はコンパイル通らないから、考えなくていいんじゃね。
            • 同じ型なら引き算は通る(比較も通るけど)。結果は「(ポインタ-ポインタ)/型サイズ」だったような。

              親コメント
              • by Deasuke (34806) on 2011年02月01日 3時53分 (#1896286) 日記
                ポインタ-ポインタ = (アドレス-アドレス)/型サイズ
                と書きたかったのかな?その理解で問題ないですが、C(++)は一応「高級」言語なのでアセンブリレベルで理解しなくとも、その型の変数が間に何個入るかという理解もできます。

                template<typename T>
                ....
                T array[100];
                T *p = array +10, *q = &array[55];
                int x = q-p;

                これで x には 45が入るという寸法です。
                --
                Best regards, でぃーすけ
                親コメント
              • by Anonymous Coward
                こういうのって、言語仕様に定義がもしあったとしても
                「実装でどうなってるかわからないな」と目星をつけてもらいたいところ。
                「そらわからんな」がこういうわからなさを指しているとは思えないけど。
              • by Anonymous Coward

                ポインタの型って指している先が何であるかを示すヒントでしかなく、実態はしょせん(通常)4バイトの整数型なんだから型に寄らず演算はできると思った。。。

              • by Anonymous Coward
                コンパイルは通るけど、実行時に、両オペランドが同じオブジェクト(おなじ配列とか、おなじ構造体のメンバとか、どちらもが同じmallocの呼び出して確保したメモリの一部とか)をさしていないと、結果は *未定義* です。(比較とのときは、先頭アドレス+1もさしててもOK)
              • いや、Cのポインタにおいて、型のサイズは重要ですよ。ヒントどころじゃない。
                たとえば、int *ptr1,*ptr2、sizeof(int)==4なら、

                ptr2=ptr1+1;

                としたときに、アドレスで見るとptr2はptr1に4バイト足した位置を指すようになるわけです。

                ここから、逆に、ptr2-ptr1==1 になるようになっていて、演算の対称性が保証されている。
                つまり、ポインタ同士の引き算は「(ポインタ-ポインタ)/型サイズ」 [srad.jp]となる。

                このようなサイズ情報込みで考えると、「ポインタと整数の加減算」および「ポインタ同士の減算」は定義できても、「ポインタ同士の加算」は定義できません。
                (ポインタと整数の加算は交換則が成り立つようになっていて「ポインタ+整数」「整数+ポインタ」どちらも結果はポインタ。
                「ポインタ+ポインタ」を、「ポインタと整数の加算」と見なすには、どちらを整数と見なすかという情報が無いし、
                ポインタのサイズによっては、どちらを整数と見なすかで結果が変わります。)

                #Cの配列アクセス「array[index]」は、「*(array+index)」のシンタックスシュガーなので、「整数+ポインタ」という順番での加算計算できるってことは、「index[array]」って書いても問題ないんですよね。
                #「data = 5[ptr]; 」みたいなコードを書くと、「data=*(5+ptr);」と解釈され正しく動作するけど混乱の元。

                親コメント
              • by Anonymous Coward
                話は脱線するが・・・

                C言語のポインタごときで躓く人は適性がないから、そこで脱落したほうが幸せなので、わざと放置するが、
                いまでは、ポインタはハンドルとしての使い方だけで十分なので、そう教えると簡単だよ。

                ポインタに関する、使いもしないテクニックなんか習得しても無駄だし、そこで引っかかって立ち止まるのはアホらしい。
                いまどきのコンパイラなら、配列の添え字を使っても速度に大差ないし。

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

処理中...