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

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

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

    by Anonymous Coward

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

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

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

    • by Anonymous Coward

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

      • Re:CはCでも・・・ (スコア:1, すばらしい洞察)

        by Anonymous Coward on 2011年01月31日 10時42分 (#1895831)

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

        親コメント
        • by Anonymous Coward
          「ポインタの加算」って、ポインタとポインタを足し合わせるのか?そりゃ、何がおこるか理解できんわな。
          • わからんでもないけど、この文脈だと「ポインタの加算」は「ポインタ値への数値加算」でいいと思うんだが。

            ...人間には優しくないからこそ、分かりやすいほうに倒して会話しないとドッチボールになっちゃうし

            --
            M-FalconSky (暑いか寒い)
            親コメント
          • by Anonymous Coward
            とりあえず、「ポインタの加算」を「ポインタとポインタを足し合わせる」こととしか解釈できない人が、ここにいるようですね。
          • by Anonymous Coward
            やってみるとわかるけど、ポインタ同士の演算はコンパイル通らないから、考えなくていいんじゃね。
            • by annoymouse coward (11178) on 2011年01月31日 13時13分 (#1895933) 日記

              > ポインタ同士の演算はコンパイル通らないから

              ポインタ同士の"引き算"ならコンパイル通りますよ。

              親コメント
            • 同じ型なら引き算は通る(比較も通るけど)。結果は「(ポインタ-ポインタ)/型サイズ」だったような。

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

                ポインタに関する、使いもしないテクニックなんか習得しても無駄だし、そこで引っかかって立ち止まるのはアホらしい。
                いまどきのコンパイラなら、配列の添え字を使っても速度に大差ないし。
          • by Anonymous Coward
            いや、そのくらいは理解白。
            ポインタa とポインタb の足し算a+bは
            bを整数と見立ててaの型でb個分先を指すとコンパイラが解釈するか
            型に関するコンパイラエラーがでるかどっちかだと想像白。

            たしかに、その想像ができない程度じゃCを使うとドツボにはまりそうだな。
            • by Anonymous Coward

              理解できてないじゃん……自明でない疑問に不確定な答え返して何がしたいんだか。

          • by Anonymous Coward
            整数はオフセットという名のポインタさ。とかいってみるテスト。

普通のやつらの下を行け -- バッドノウハウ専門家

処理中...