- 1 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 10:31:46 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/ スレを勃てるまでもないC/C++の質問はここで 3 pc11.2ch.net/test/read.cgi/tech/1187521676/ スレを勃てるまでもないC/C++の質問はここで 4 pc11.2ch.net/test/read.cgi/tech/1221633708/ スレを勃てるまでもないC/C++の質問はここで 5 pc11.2ch.net/test/read.cgi/tech/1230516307/ スレを勃てるまでもないC/C++の質問はここで 6 pc11.2ch.net/test/read.cgi/tech/1231564903/ スレを勃てるまでもないC/C++の質問はここで 7 pc11.2ch.net/test/read.cgi/tech/1232983248/ スレを勃てるまでもないC/C++の質問はここで 8 pc12.2ch.net/test/read.cgi/tech/1235921779/ スレを勃てるまでもないC/C++の質問はここで 9 pc12.2ch.net/test/read.cgi/tech/1240022781/ スレを勃てるまでもないC/C++の質問はここで 10 pc12.2ch.net/test/read.cgi/tech/1242300936/ スレを勃てるまでもないC/C++の質問はここで 11 pc12.2ch.net/test/read.cgi/tech/1245059383/ スレを勃てるまでもないC/C++の質問はここで 12 pc12.2ch.net/test/read.cgi/tech/1248010352/ スレを勃てるまでもないC/C++の質問はここで 13 pc12.2ch.net/test/read.cgi/tech/1260842197/ スレを勃てるまでもないC/C++の質問はここで 14 pc12.2ch.net/test/read.cgi/tech/1269273471/
- 307 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 22:51:08 ]
- ポインタp,qがあって参照剥がしして一致、あるいは、両方NULLならtrueにしたいときって↓でおけ?
((p && q) && (*p == *q)) || (p || q)
- 308 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 22:57:48 ]
- だめじゃね?
- 309 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 23:01:27 ]
- だめだな
- 310 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 23:06:08 ]
- どうして諦めるんだよ!
- 311 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 23:07:30 ]
- ((p&&q) && (*p==*q)) || (!(p || q))か?
- 312 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 23:20:33 ]
- 答え:(p && q && (*p == *q)) || !(p && q)
- 313 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 23:25:48 ]
- X
- 314 名前:デフォルトの名無しさん [2010/06/02(水) 23:29:56 ]
- !p && !q || p && q && (*p == *q)
- 315 名前:デフォルトの名無しさん mailto:sage [2010/06/02(水) 23:58:39 ]
- 答え。
p-q
- 316 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 00:10:52 ]
- >>314が俺好み
- 317 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 00:15:55 ]
- !p && !q と !(p || q) のどっちにするかは趣味の問題だな。
- 318 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 06:52:18 ]
- p == q || p && q && *p == *q
- 319 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 09:21:58 ]
- p == q || と || p == q のどっちにするかは趣味の問題だな。
- 320 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 09:27:53 ]
- p == q を先にチェックするほうがいいにきまってるだろ。
- 321 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 09:42:16 ]
- なんで?
- 322 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 09:48:52 ]
- p と q が 0 でない事を先にチェックした方が良い
0だと以降が実行されない p == q は p と q の両方が0でも真になってしまう
- 323 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 09:50:42 ]
- > p == q は p と q の両方が0でも真になってしまう
それが >307 が求めていたものでしょ。
- 324 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 09:55:05 ]
- >>32 参照はがしをしなくてすむなら、しないほうがはやいでしょ?
ポインタが同じところをさしているなら、ポインタの先を見るまでもない。
- 325 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 10:46:05 ]
- >>324
大人になれば分かる
- 326 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:09:17 ]
- >>324
ポインターの値が同じでも実体の値が違うことがある
- 327 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:16:50 ]
- 順序は実際のデータでプロファイリングして決めるのが一番
- 328 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:19:07 ]
- >>326
PODとは限らんからね >>324 はC++でプログラム組んだことがないんだと思う
- 329 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:29:17 ]
- >ポインターの値が同じでも実体の値が違うことがある
そんなスマポは使いたくない。
- 330 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:30:37 ]
- >>328
普通のポインタじゃなくて、スマートポインタの話をしていたの?
- 331 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:31:47 ]
- p,qが生ポインタでp == qで*p != *qって例えばどういうケースよ?現実的な事例を教えてくれ
- 332 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:32:55 ]
- メモリマップトI/Oなんて、もちださないでくれよ。
- 333 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:33:10 ]
- ポインターの値が同じでも実体の値が違う
ってどんな用途に使うスマートポインタなんでしょうか? 気になる
- 334 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:47:13 ]
- >>331
PODでなければ普通に起こるだろ。
- 335 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:49:35 ]
- >>331
それが保証されるのはCに限った話、C++は違うね
- 336 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 11:51:56 ]
- 保証されるとかじゃなくて、現実的な話として、そういう設計の有益なクラスを例示してくれって言ってるの
- 337 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:03:17 ]
- >>336
例えばベースクラスが共通(またはどちらかがベースクラス)で、 片方への cast operator が定義されている場合とか こういうコード普通に沢山存在してるだろ 有益かどうかはお前のさじ加減だし
- 338 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:19:45 ]
- p==qの時点でp,qの型は同じ
参照はがしても同じ型で比較されるだけだからキャストは関係ないだろ
- 339 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:21:59 ]
- >>337 あたまがわるいので、例が思いつかない。 具体例を教えてください。
class B { int x; }; class C { int y; }; class D : public B, C { int z; }; int main() { D* p = new D(); B* q = p; printf("p == q => %d\n", p == q); printf("*p == *q => %d\n", *p == *q); } D に、どんな演算子を定義すればいいんですか?
- 340 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:28:41 ]
- みなさんが当たり前のように言ってるC++なら違うっていうのは
!=のおかしなオーバーロードのことでいいんでしょうか? なんだか!=が真になるのが普通にあることみたいにいわれてるようなので ひょっとしてこれではないのでしょうか? あと>>334はPODって言ってますが組み込み型の間違いであっていますか? PODの構造体は比較演算子が使えないですよね?
- 341 名前:339 mailto:sage [2010/06/03(木) 12:29:06 ]
- operator == を再定義するのは反則だよねえ?
#include <stdio.h> class B { int x; }; class D : public B { int y; }; bool operator==(const D&, const B&) { return false; } int main() { D* p = new D(); B* q = p; printf("p == q => %d\n", p == q); printf("*p == *q => %d\n", *p == *q); }
- 342 名前:339 mailto:sage [2010/06/03(木) 12:31:53 ]
- >ポインターの値が同じでも実体の値が違うことがある
operator == を再定義したら、「実体の値が違う」ことにはならないか。
- 343 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:35:37 ]
- >>319 == >>329
>>318 はどちらにしろ間違ってるんで、いち抜けする。 if p == q はダメだろう。
- 344 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:41:23 ]
- >>343
>>318 のどこが間違っているって?
- 345 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:42:26 ]
- if p == q はダメだろう。
- 346 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:43:41 ]
- (1) p と q が別のオブジェクトを指していて
(2) p == q で (3) *p と *q の実体が違う ということはありえないで、ファイナルアンサー?
- 347 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:45:24 ]
- p==qかつ*p!=*qなんて非常識なケースが普通に沢山あるようなコードを自信満々に書いちゃう>>337は別業種への転職をおすすめする
そうなるように書くことはできるが、副作用も含めてそうならないようにコードを書くのが当たり前の感覚
- 348 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:47:56 ]
- >>307 に答えだしたら
p=123456; q=123456; if p == q はダメだろう。
- 349 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:49:49 ]
- >>348 どこがダメ?
- 350 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:51:27 ]
- >>348 無効なポインタを渡したときに、アクセス違反が発生しないからダメとかつまんないこといってんじゃないよね?
- 351 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:51:41 ]
- >>349
自分で適当なアドレス突っ込んだ場合、 「参照剥がしして〜」 の条件に合わなくなる(参照はがせない) って言ってるんだろ? アホかと思うがwwwww
- 352 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:53:34 ]
- 普通にやってて自分でアドレス突っ込んじゃうような子がいたら消費者に訴えられるレベル
- 353 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 12:58:58 ]
- >>338
これが違う p と q が同じ型だとはどこにも書いてないだろ
- 354 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:01:28 ]
- >>353
違う方じゃコンパイルエラーだろ
- 355 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:02:35 ]
- >>339
operator B(); というメソッド。
- 356 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:03:16 ]
- >>354
だからベースクラスが共通な場合って言ってるだろ
- 357 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:03:29 ]
- アップキャストはされるんじゃね
- 358 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:06:31 ]
- >>356
共通でなくどっちかがベースクラスの場合だね
- 359 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:07:11 ]
- >>356
codepad.org/q3SbZGSj 同じでもエラーだよ
- 360 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:12:31 ]
- p と q が別の実体を指しているのに、 p == q にするコードなんて書けないよ。
- 361 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:12:40 ]
- pとqは違うクラスです、とか、もう無茶苦茶
何考えてんだか… だったらC++と言わず char *p; long *q; でもいいわけでね…
- 362 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:15:18 ]
- >>361
>pとqは違うクラスです、とか、もう無茶苦茶 どっから同じクラスだって前提が出てきたんだ。 君の思い込みだろ?
- 363 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:15:30 ]
- >>318 がダメって言ってる奴って、ひとりだけ?
- 364 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:17:35 ]
- >>362 ばかばかしい。
次は、「釣りでした」とか「何あつくなってんの」とかかよ。
- 365 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:17:44 ]
- ひとりだけ
- 366 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:22:16 ]
- >>364
実務だと仕様書とか解釈が厳格になるからね 型が同じと書かれていないのに、勝手にそういう前提をおいたりしないんだよ まぁ趣味の人にはわからない話かもしれないけどね
- 367 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:23:21 ]
- 2chまできてお仕事ご苦労様です^^;
- 368 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:26:52 ]
- そうそう、ここは趣味の範囲だから実務の話されても困るわ。
- 369 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:45:09 ]
- C /C++という前提において仮定が無ければ、一般の場合を適合するのが普通じゃないか?
>>366は特殊な場合のみいってるよね。
- 370 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:54:55 ]
- >>307を見て、同じ型へのポインタじゃないと思えるほうが不思議
- 371 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:57:22 ]
- それはただの思い込み。
- 372 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 13:58:57 ]
- >>369 >>370
だから、趣味ならそれでいいんじゃない、大体動けばOK でも仕事なら動かない場合とかあったら問題になる だから最初から色んなケースを想定する そういう習慣がついてんだよ
- 373 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:01:02 ]
- >>372
繰り返すが、ここは趣味のスレ、お前は場違い、出て行け。
- 374 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:01:02 ]
- 仕事なら仕様を聞くだけで、余計な想像なんて入り込む余地はないだろw
- 375 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:04:46 ]
- >>374
ん? 最初の質問で p と q が同じ型だと書いてなかったら、 俺は同じ型でない場合も想定してただけだよ。 仕事でこういう場合に、勝手に同じ型だけしかありえんだろうって考えで コードを書いたらとんでもないバクを生むことになるから。
- 376 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:07:11 ]
- 屁理屈はお上手ですね。
- 377 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:09:52 ]
- どう見てもただの後付けw
- 378 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:10:11 ]
- いくら正論言おうと空気読めない奴が何をいっても無駄。
- 379 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:10:42 ]
- 実務でもありえないような数値入力して、
プログラムが暴走して損害だしても、それは入力したユーザのせいになるよ。 プログラマがそんな細かいことまで考える義務はない。 プログラマの前提が優先されるからね。
- 380 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:12:47 ]
- >>375
お前以外の99人はpとqは同じ方という前提なんだよ その時点でお前がまちがってるということ
- 381 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:14:25 ]
- 民主主義の国は何もかも多数決で決められる、
それがいやなら北朝鮮でもジンバブエでも好きなところいけ。
- 382 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:16:17 ]
- p=qなら常に*p=*qは成り立つ、これが常識
そうならないケースを考える馬鹿が一人いるってこと そして沢山の人から非難をあびている
- 383 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:20:45 ]
- p=q;
をみて /* p=q; */ まで仮定しないといけなくなるな。
- 384 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:23:50 ]
- 仮定を排除してまずコンパイラが仕様通りでバグが無いか確かめます
- 385 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:26:57 ]
- パソコンにコンセントが刺さっているか調べます。
- 386 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:27:49 ]
- 自分が仮想現実の住民でないか確かめます
- 387 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:32:58 ]
- 例外的な可能性を考慮してダメだししたって言うには、
指摘の時点でそれを言ってないとダメ。
- 388 名前:デフォルトの名無しさん [2010/06/03(木) 14:37:51 ]
- 教えてください。
クラス foo と bar を用意したとします。 bar は foo 1つにつき1インスタンス必要なので、foo のコンストラクタで bar のインスタンスを作ってます。 ただ、bar は foo の情報を元に処理するので、bar のインスタンスを作る際の引数に、this (foo) を渡そうと思いました。 要するに、相互参照です。 foo.h と bar.h とした場合、include 順の指定がうまく行かずこまっています。 これは、この設計が誤っていますか? ヘッダファイルや宣言の記述に細工が必要ですか? 正しい考え方や、記述の仕方を教えてください。
- 389 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:38:09 ]
- 馬鹿なレスが多いんで見落としてた
>>347 俺も基本的にそういう考えだよ。別に俺がそう書きたいというわけでなく、 p==qかつ*p!=*q は存在しないということに対して、存在する場合もあると言っただけだよ。 そもそも cast operator を定義する時点で怪しいコードになってくる。 けどその有用性を利用しているコードも存在している。 だから、その性質を理解しておくのは必要なことだと思っている。 例えば行列を表すクラス A があって、 それを拡張してインバース属性を持つクラス B 作るとする。 このときに B には opertore A() を用意しておき、 インバース属性が立っていれば逆行列を返すようにするとか そうすると A を使用していたコードがそのまま使える。 こういう手法を使うことはよくあるだろ。(少なくとも使ってる奴がいるだろう。)
- 390 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:41:49 ]
- ウザイ
- 391 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:43:12 ]
- ここまで来ると哀れだなw
- 392 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:43:51 ]
- >>388
'foo.h' で class bar; class foo { ..... }; のように、空のクラス宣言をしてやれば回避できる場合もある。 これでいけるかどうかは相互参照の内容次第。
- 393 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:44:31 ]
- >>389
死ねばいいのに
- 394 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 14:51:43 ]
- >>388
インナークラスとして、一つのヘッダーにまとめてしまうとか class foo { class bar { ・・・・ }; ・・・・ };
- 395 名前:388 [2010/06/03(木) 14:54:43 ]
- なるほど、空クラスですね。
やってみたのですが、やっぱり仰るとおり相互参照次第で、コンストラクタに this を渡したい場合はそれ相応の宣言が必要でした。 この考え方(構成)が間違っているという事ですかね。。
- 396 名前:388 mailto:sage [2010/06/03(木) 14:56:04 ]
- >>394
なるほど!!! 為してみます。 インナークラスかぁ。勉強になります。
- 397 名前:デフォルトの名無しさん [2010/06/03(木) 19:50:52 ]
- 質問です。
例文 int a; printf("値をいれてください:"); scanf("%d",&a); if(a<0&&a<9) { printf("値が違います!!"); } とこういう文があったとして、aにたとえば10を入力するとエラーメッセージを出してもう一度 入力させる処理に戻りたいんですがなにを付け加えればいいですか?
- 398 名前:デフォルトの名無しさん [2010/06/03(木) 19:55:37 ]
- do while
- 399 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 20:01:53 ]
- while(1) {
printf("値をいれてください:"); scanf("%d",&a); if(0<=a && a<=9) break; printf("値が違います!!"); }
- 400 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 20:03:24 ]
- int a;
INPUT: printf("値をいれてください:"); scanf("%d",&a); if(a<0&&a<9) { printf("値が違います!!"); goto INPUT; }
- 401 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 20:22:20 ]
- int a;
do { printf("値をいれてください:"); scanf("%d",&a); if (a < 0 && a < 9) { printf("値が違います!!"); } else {
- 402 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 20:23:25 ]
- 途中送信しちゃった
ごめんね break; } while (true);
- 403 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 20:56:54 ]
- >>398-402
たくさん回答ありがとうございます。gotoが一番簡単そうですね、勉強になりました。
- 404 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 21:56:15 ]
- >>403
こうする手もある int a; while (!Input(&a)) { } int Input(int* p) { printf("値をいれてください:"); scanf("%d", p); if(*p<0&&9<*p) { printf("値が違います!!"); return 0; } return 1; }
- 405 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 22:07:46 ]
- gotoは推奨されていない
- 406 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 22:13:42 ]
- それは思考放棄
gotoを使ったほうがやりたい事を的確に表現している場合はgotoを使うほうが良い
- 407 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 22:39:28 ]
- まぁgoto使った方が便利な時もあるけど
あんまり>>397の質問のレベル的にgotoを 使う癖は付けない方が良いと思う。
|

|