[過去ログ]
【初心者歓迎】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バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
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
918: デフォルトの名無しさん [] 2017/07/12(水) 18:19:22.64 ID:Oma/x2r0 ユーザーヘッダーファイルを作って #include<stdio.h> #include<math.h> #define PI 3.14 double r; void nyuuryoku(void) { printf("半径を入力してください。\n"); scanf("%fl", &r); printf("%f\n", r); return; } double keisan(void) { printf("%f\n", r); return PI*pow(r, 2); } と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。 rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1478440682/918
919: デフォルトの名無しさん [sage] 2017/07/12(水) 18:34:20.99 ID:+I30gFZ0 void nyuuryoku(void) { char buf[256]; printf("半径を入力してください。\n"); if(NULL==fgets(buf,sizeof(buf),stdin)){ printf("ちゃんと入力しろやボケ\n"); return; } sscanf(buf,"%fl", &r); printf("%f\n", r); return; } http://mevius.5ch.net/test/read.cgi/tech/1478440682/919
920: デフォルトの名無しさん [sage] 2017/07/12(水) 18:44:41.01 ID:FRCEttse >>918 × scanf("%fl", &r); ○ scanf("%lf", &r); http://mevius.5ch.net/test/read.cgi/tech/1478440682/920
921: デフォルトの名無しさん [sage] 2017/07/12(水) 18:45:48.34 ID:+I30gFZ0 %lfちゃうか? http://mevius.5ch.net/test/read.cgi/tech/1478440682/921
922: デフォルトの名無しさん [sage] 2017/07/12(水) 18:46:07.89 ID:+I30gFZ0 失礼しますた http://mevius.5ch.net/test/read.cgi/tech/1478440682/922
923: デフォルトの名無しさん [] 2017/07/12(水) 18:49:05.30 ID:Oma/x2r0 oh.... コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;) ありがとうございました http://mevius.5ch.net/test/read.cgi/tech/1478440682/923
924: デフォルトの名無しさん [sage] 2017/07/12(水) 19:24:59.74 ID:iSKiMIM1 -Wallつけるか、clang使え http://mevius.5ch.net/test/read.cgi/tech/1478440682/924
925: デフォルトの名無しさん [sage] 2017/07/12(水) 21:38:59.46 ID:Q4X+sAyq >>912-914 なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ http://mevius.5ch.net/test/read.cgi/tech/1478440682/925
926: デフォルトの名無しさん [sage] 2017/07/12(水) 23:05:57.46 ID:2e79StFo 最近のチラシは両面印刷で困る http://mevius.5ch.net/test/read.cgi/tech/1478440682/926
927: デフォルトの名無しさん [sage] 2017/07/13(木) 00:31:49.82 ID:/oMuxl/G >>907 >pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない Cの規格をよく読み直したらそうでもなかった http://mevius.5ch.net/test/read.cgi/tech/1478440682/927
928: デフォルトの名無しさん [sage] 2017/07/13(木) 01:06:35.55 ID:+2MHjXyv >>912-914は基礎的なところで間違った理解をしていると そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ http://mevius.5ch.net/test/read.cgi/tech/1478440682/928
929: ◆QZaw55cn4c [sage] 2017/07/13(木) 06:27:44.49 ID:NDMOLt7F >>927 >>880 int **pp = &p; でpp[1] は書いちゃだめだろう? http://mevius.5ch.net/test/read.cgi/tech/1478440682/929
930: デフォルトの名無しさん [sage] 2017/07/13(木) 07:12:43.09 ID:/oMuxl/G >929 その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが 6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある http://mevius.5ch.net/test/read.cgi/tech/1478440682/930
931: ◆QZaw55cn4c [sage] 2017/07/13(木) 08:39:26.58 ID:045lcfaT >>930 シンタックスではなくセマンティクスというわけですか‥ありがとう http://mevius.5ch.net/test/read.cgi/tech/1478440682/931
932: デフォルトの名無しさん [] 2017/07/13(木) 18:16:27.80 ID:PDgj9Ebq #include<stdio.h> #include<string.h> #define NUM 10 int main(void) { int length; char name[NUM * 2 + 1]; char family_name[NUM + 1]; char first_name[NUM + 1]; printf("姓を入力してください\n"); scanf("%s", family_name); printf("名を入力してください\n"); scanf("%s", first_name); strcat(name, family_name); strcat(name, first_name); length = strlen(name); printf("名前:%s\n", name); printf("長さ:%d\n", length); return 0; } このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって 結合結果がフフフフフフフってなります。どうしてでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1478440682/932
933: デフォルトの名無しさん [sage] 2017/07/13(木) 18:29:33.51 ID:lX8cJUTX 笑われてんじゃね? http://mevius.5ch.net/test/read.cgi/tech/1478440682/933
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 69 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.021s