[過去ログ]
【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
【初心者歓迎】C/C++室 Ver.100【環境依存OK】 [無断転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1478440682/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
893: デフォルトの名無しさん [sage] 2017/07/10(月) 06:54:34.99 ID:t9ouoliu アドレス計算自体はOKだと思うよ。 http://mevius.5ch.net/test/read.cgi/tech/1478440682/893
894: 名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/07/10(月) 07:04:04.53 ID:Ols/UzwR 配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている http://mevius.5ch.net/test/read.cgi/tech/1478440682/894
895: 名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/07/10(月) 07:05:58.47 ID:ZgtWUD/x 無効エリアのアドレス計算 値不定か動作不定かどっちだか忘れた これらをOKと呼ぶならOKなんでしょう http://mevius.5ch.net/test/read.cgi/tech/1478440682/895
896: 名無しさん@そうだ選挙に行こう! Go to vote! [sage] 2017/07/10(月) 07:13:12.05 ID:ZgtWUD/x >>894 -1も有効だとうれしい事があるけど、-1はダメなんだよね http://mevius.5ch.net/test/read.cgi/tech/1478440682/896
897: デフォルトの名無しさん [sage] 2017/07/10(月) 22:27:20.57 ID:WIOZS2V0 >>894 つまり式「&pp[1]」は大丈夫でないと? http://mevius.5ch.net/test/read.cgi/tech/1478440682/897
898: デフォルトの名無しさん [sage] 2017/07/11(火) 13:12:04.11 ID:eWIFW1BW ppは配列じゃないだろ http://mevius.5ch.net/test/read.cgi/tech/1478440682/898
899: デフォルトの名無しさん [sage] 2017/07/11(火) 18:17:43.80 ID:L5b0rMHK これがアスペいうやつだな 配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で pは配列じゃないからな→わかる ppは配列じゃないからな→頭悪いな ppは配列じゃないだろ→アスペ http://mevius.5ch.net/test/read.cgi/tech/1478440682/899
900: デフォルトの名無しさん [sage] 2017/07/11(火) 20:17:20.41 ID:gS+YojZ9 ん?まったくよくわからんのだが、だれか解説して >配列でないオブジェクトも要素数1の配列として考える仕様 ↑まずこれがよくわからない 配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね で、下二行の意味も分からない http://mevius.5ch.net/test/read.cgi/tech/1478440682/900
901: デフォルトの名無しさん [sage] 2017/07/11(火) 22:08:22.53 ID:qjau/h5c 配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る http://mevius.5ch.net/test/read.cgi/tech/1478440682/901
902: デフォルトの名無しさん [sage] 2017/07/11(火) 22:10:11.51 ID:qjau/h5c >>894は配列じゃない場合に関しては何も言ってないから間違いではないが わざわざ配列と書いてるので配列以外は違うと思ったかわからなかったか だろう http://mevius.5ch.net/test/read.cgi/tech/1478440682/902
903: デフォルトの名無しさん [sage] 2017/07/11(火) 22:14:58.67 ID:qjau/h5c >>897 「つまり」が意味不明 >>894は配列じゃない場合には何も言ってない 「大丈夫でない」は正しい >>898 配列じゃないから何? >>899 実際には配列ではない http://mevius.5ch.net/test/read.cgi/tech/1478440682/903
904: デフォルトの名無しさん [sage] 2017/07/11(火) 22:28:18.47 ID:gS+YojZ9 いや、それは俺も思ったんだが ppが配列じゃないのは当たり前なんだが(てかポインタだし) おそらくはそんなことは問うてないって言いたいんだと思う つまり、ppが指している先が何であるかが問題であるから 配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと 同じことをもう一度言うけど pp[1]としたとき問題になるのはppの指してる先がどうなっているかで 今回の場合はそれは「p」であるから 正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと http://mevius.5ch.net/test/read.cgi/tech/1478440682/904
905: デフォルトの名無しさん [sage] 2017/07/11(火) 23:00:18.82 ID:634mVLA8 >>901 なら&pp[1]も大丈夫なんじゃね? http://mevius.5ch.net/test/read.cgi/tech/1478440682/905
906: デフォルトの名無しさん [sage] 2017/07/12(水) 07:01:19.46 ID:Mf+sZV2C pp[1]の時点で動作不定 正しく動かない環境はもしかしたら存在しないかもしれないけど http://mevius.5ch.net/test/read.cgi/tech/1478440682/906
907: ◆QZaw55cn4c [sage] 2017/07/12(水) 07:26:19.94 ID:9q9UgJkW >>880 ん、最初にもどってメッセージを書くとすれば、こうなるかな >ポインタそのものにオブジェクトってできるんでしょうか? 私が意味を取り違えているかもしれないが、「できない」 ポインタを取得したからといって、オブジェクトが生えてくることはない あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる >例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、 array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。 pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない &pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない アドレスを生成できるからといって、その領域が意味のあるものとは限らない >>881 では意味のないことを求めてしまいごめんなさい http://mevius.5ch.net/test/read.cgi/tech/1478440682/907
908: デフォルトの名無しさん [sage] 2017/07/12(水) 08:20:30.93 ID:SNfdy8To >>906 >pp[1]の時点で動作不定 ちなみにそれを規定する規格の記述はどこ? Cでは明確に禁止されているようだがC++では見つけられなかった http://mevius.5ch.net/test/read.cgi/tech/1478440682/908
909: デフォルトの名無しさん [sage] 2017/07/12(水) 09:01:11.94 ID:6a7v2dDL https://www.google.com/search?q=%22behaves+the+same+as+a+pointer+to+the+first+element+of+an+array+of+length+one%22 http://mevius.5ch.net/test/read.cgi/tech/1478440682/909
910: デフォルトの名無しさん [sage] 2017/07/12(水) 09:10:12.68 ID:6a7v2dDL https://www.google.com/search?q=%22If+both+the+pointer+operand+and+the+result+point+to+elements+of+the+same+array+object%2C+or+one+past+the+last+element+of+the+array+object%22+%22otherwise%2C+the+behavior+is+undefined%22 http://mevius.5ch.net/test/read.cgi/tech/1478440682/910
911: デフォルトの名無しさん [sage] 2017/07/12(水) 13:20:57.39 ID:ahqaJGrL >>907 まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは 1.ポインタ自身もポインタというオブジェクトじゃないのか? 2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは http://mevius.5ch.net/test/read.cgi/tech/1478440682/911
912: デフォルトの名無しさん [sage] 2017/07/12(水) 13:41:52.51 ID:uqOuLEsE そんで俺はちょっと思ったんだけど Cはポインタを配列のように扱えるのが便利だなぁと 逆に配列名を参照したらポインタ値になるし あと他、関数ポインタを普通の関数のように扱えたり 逆に関数名を参照したらポインタ値になったり 意味の上で別解釈しようがないからそれでいいだろ、的な 二つに共通しているのは (1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう (2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう というもので、これでシームレスになるしタイプも減るから便利だろう、と でもそういう方針なんだったら何故我々は「.」と「->」を 使い分けなきゃならないんだ?と思わんこともない 意味の上で別解釈できたり不明瞭だったりは無いのに ただ、Cの構造体は(1)を満たしていない もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので 代入演算子で代入したり、関数に値渡ししたりが出来なくなる ただし、C言語がそのような仕様になっていた可能性は十分にあると思う というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで 先頭アドレスからのオフセットでアクセスするのは同じであるから そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に なっていた可能性はあると思う 構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる で、そうはしなかった代わりに「->」演算子が有る、とも取れる http://mevius.5ch.net/test/read.cgi/tech/1478440682/912
913: デフォルトの名無しさん [sage] 2017/07/12(水) 13:42:12.78 ID:uqOuLEsE 気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと 代入したり、関数のreturnで値として返したりができない となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう (実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い ポインタ相当に勝手に成り下がってしまうので代入ができない) ただ、このことが本当に良かった事なのかどうなのかは分からない GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない 他の言語のほとんどがオブジェクトを参照で扱うのを見てると Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない C++のクラスは、状況に合わせて、これを選べる、という立場になってるが もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い http://mevius.5ch.net/test/read.cgi/tech/1478440682/913
914: デフォルトの名無しさん [sage] 2017/07/12(水) 13:43:43.81 ID:uqOuLEsE よくよく考えてみればなかなかに奇妙 まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない プログラマは基本的に几帳面で、整合性を気にする生き物だから ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから &arrayとか&funcとか書かせたくなるのが普通だろう そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう ところがCは、レジスタに乗らないもの、演算できないもの、を 勝手にポインタと同等に格下げするというルールを設けたうえで そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという ウルトラCをやってのけた ここまででも俺ではちょっと思いつかないなーと感心するわけだが 逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人 その方が整合性がありそうな気がするから なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る それはそれで奇妙なことだと思ったりもするが、とにもかくにも この辺がC++の基本方針や特色にものすごく影響が出てる GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも そして構造体をベースとするC++とCの配列は相性が悪いという C言語の功罪は凄い http://mevius.5ch.net/test/read.cgi/tech/1478440682/914
915: デフォルトの名無しさん [sage] 2017/07/12(水) 13:48:37.49 ID:vq82ZnF5 3行で(´・ω・`) http://mevius.5ch.net/test/read.cgi/tech/1478440682/915
916: デフォルトの名無しさん [sage] 2017/07/12(水) 17:58:12.38 ID:SNfdy8To 駄レスの関係無いリンク先をまじまじと読んでしまった 日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった http://mevius.5ch.net/test/read.cgi/tech/1478440682/916
917: デフォルトの名無しさん [sage] 2017/07/12(水) 18:07:40.57 ID:SNfdy8To >>915 「初期のK&Rが至高と考えるボクは 構造体がコピーできる仕様にハンタイです」 http://mevius.5ch.net/test/read.cgi/tech/1478440682/917
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 85 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.023s