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

悩まされてしまうプログラミング言語の奇妙な特徴は?」記事へのコメント

  • Cのポインタはそれ自体が曲者だと思いますよ。

    • by Anonymous Coward on 2014年09月06日 18時03分 (#2671914)

      ポインタを使わないのならCを使う意味がない、と言ってもいいと思います。

      親コメント
      • by Anonymous Coward

        そうだよな。
        ポインタぐらいでgdgd言ってたら、ダブルポインタ必要な時、どうするのかと。

        • by Anonymous Coward

          ポインタ配列のポインタとか、アロケータブルなメモリ管理用のメモリ空間へのポインタのポインタとか頭痛くなったもんなぁ

          • by Anonymous Coward

            3年目くらいまでは「毎回」マス目を書いて矢印書いてってやってました。
            ポインタから離れて久しいので今やるとやっぱりマスと矢印書くと思います。

          • by Anonymous Coward

            配列へのポインタとか、関数へのポインタとか、
            関数の配列へのポインタとか。
            更に上に上げたポインタを返す関数とかになると更に強烈な妖怪と化します。
            標準関数ではsignalのプロトタイプ [c-tipsref.com]がまさにそれです。

            /* ただし最近はtypedefを使って定義されているので妖怪度は低いです */

            関数の配列へのポインタは有限状態機械を実装するのに実際に使ったことがあります。
            というかこれってポインタの問題ではなくてCのポインタ宣言の構文の問題ですね。

    • ポインタに魅了されてしまったせいで、他の言語が使いこなせ(使いたく)なくなる。

      それくらい有害な機能だと思います。

      親コメント
    • Cのポインタは、インデックスレジスタ(汎用レジスタのアドレスポインタモード)を抽象化した物だから、機械語が分かっていれば何の不思議も無い。

      でも、Cでのポインタ関連の「宣言構文」は、凄く曲者だと思う。
      何で、あんな仕様になったのやら...

      --
      -- Buy It When You Found It --
      親コメント
      • by Anonymous Coward on 2014年09月06日 22時08分 (#2672030)

        あれはそれなりに合理的かつわかりやすいのですが、演算子の前置後置や優先度がややこしいので台無しになっています

        あと、人はどうも変数を宣言するときと使うときで別の思考回路が働いている印象はあります
        pointer to array of intはわかりやすいし、(*a)[10]もわかりやすいですが、int (*)[]は軽く死ねます
        真ん中の式からaとか10を取り除いただけですが

        親コメント
        • by Anonymous Coward
          int *a, b;

          これはなんとかしてほしいところ。

          あとは宣言時と利用時とは別の記号にしてほしかったかなー。
          宣言時は *付きがポインタを意味するけど、利用時は *付きは実際の値を意味する(ポインタじゃなくなる)。
          • by Anonymous Coward

            いや、
            int *a;
            は、*aがint型である、という意味だから。
            そう考えると、とても素直な表現だと思うよ。

            わけがわからなくなったのはC++以降。

            • by Anonymous Coward

              なんでaの宣言に*aのことを書くのん?

              • by Anonymous Coward

                aの宣言なのにintって書くでしょ?

            • by Anonymous Coward
              a に * をつけると int になる。そこから逆算して a は int へのポインタである。
              a について直接語っていないので人によってはすごく判りにくいとおもう。
              この表現が素直だと思えるようになるのは慣れればこそじゃないかな。
              int *a は a ではなく *a について述べていると読めば多少は理解しやすくなるかも。

              #この記法は判りやすさではなく使う記号とシンタックスを節約した結果だと思う。
            • by Anonymous Coward
              > int *a, b;
              で指摘したかったのは、a がポインタなのに b は int ってことでしょ。
              言語仕様として両方ともポインタと言うことにしておけばわかりやすかったと。
              # int *a;
              # ではなくて
              # int * a;
              # と記述する流儀もあります。
              • by Anonymous Coward
                補足ありがとうございます。

                そうです、元々言いたかったのは bがintになる所です。
                特に
                    int* a, b;
                とした時ですね。

                # int * a は初めて見ました。 サイズ計算してるみたいに見えますね。

                (int *a, b で bがポインタになると逆に勘違いしてました。)
              • by Anonymous Coward on 2014年09月08日 8時39分 (#2672602)

                int* a,b;
                と書く流儀はC++以降ですが、はっきりいって糞だと思います。

                親コメント
              • by Anonymous Coward

                (int*) a, b;
                のように書きたいなあ

              • C++というかStroustrup氏の流儀だとおもいますが、そのスタイルの場合、

                int* a;
                int b;

                のように、「一宣言文で複数の変数を宣言しない。変数宣言は一行一変数。」という流儀もセットです。片っぽだけ採用しちゃだめ。

                #そう徹底すれば、確かに「int* a,b」問題は起きませんけど…、冗長なので私は好きになれません。

                親コメント
            • by Anonymous Coward
              ごめんなさい、逆でした

              int* a, b;

              で、bがintであるという所。
            • by Anonymous Coward
              私も個人的には int *a で *aがintであるというのは好きなんですけど、
              ネットでは 「ポインタ型」の宣言なんだから 型の部分が int* の方がわかりやすいという意見も結構あるみたいですね。

              いずれにしてもどっちでもよくなってしまったがために面倒な事になってる気がしますが。
              • by Anonymous Coward

                > ネットでは 「ポインタ型」の宣言なんだから 型の部分が int* の方がわかりやすいという意見も結構あるみたいですね。

                マシン語を経験したことのない人にはそちらの方が分かりやすいかも知れませんが、もっと複雑なことを考えると破綻します。
                「int*」は整数へのポインタ型を表す表記として、じゃあ「ポインタへの配列」とか「関数へのポインタ」はどういう表記をすればいいの?って。

                そもそも「*」は演算子ですし。

                8ビット時代のBASICから入った私としては、スペースなんてどうでもいいのですが。

    • by Anonymous Coward on 2014年09月06日 21時19分 (#2672011)

      それを言われたらプロセッサの立つ瀬が無くなる
      インデックスレジスタや間接アドレッシングが曲者(?)だとでも言うのか?
      もともとC言語はハード(プロセッサ)に近いところにある「低レベル」なプログラミング言語
      最近の抽象化が進んだモダンなプログラミング言語とは違う
      Cのポインタが使えない・使う必要が無いのならそもそも他の言語を選ぶべきなのだ

      親コメント
    • Cでポインタいじっていると高級アセンブラだなと実感する。
      親コメント
    • by Anonymous Coward

      ポインタが曲者だっていうのは単にそいつの理解力が貧弱なだけだが、
      5["abcdef"]って書ける(C言語FAQ 6.11参照)ようになってるのは、
      C言語の奇妙な特徴として挙げるにふさわしいね。

      • >5["abcdef"]って書ける

        これ逆じゃないすか。
        "abcdef"[5]=='f'

        親コメント
        • by Anonymous Coward

          別ACだけど、
          > C言語FAQ 6.11参照
          って書いてあるんだから、ちゃんと読もうよ。

      • by Anonymous Coward

        なぜそうなっているか、というロジックは分かってしまえば単純だけど、
        あえてその書き方をするのは邪悪ですね。
        (配列表現そのものがポインタの糖衣構文だから、より分かりにくくなってしまうのは糖衣構文の意義に反する)。

        そもそもその書き方ができることは、IOCCC [ioccc.org]で初めて知りました。
        と言うかそれ以外では見たことがありません。むしろIOCCCでは定番の表現ですね。
        それほどにまで邪悪で奇妙だと言えるでしょう。

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

処理中...