1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net] エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1500329247/
486 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 15:20:01.32 ID:drN9+cfC.net] >>474 は 関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、 というごく当たり前の文意だろ普通に読むと。 どう読むと 関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ 自分以外は文法もセマンティックもろくに知らないという前提はやめるべき
487 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 20:18:51.07 ID:B7amW+qm.net] >>470 スコープはmaim( )内にしたいけどスタックは使いたくないってケースかな
488 名前:はちみつ餃子 mailto:sage [2018/04/09(月) 01:15:21.26 ID:fbTUuQs/.net] >>470 ウェブ版をざっと探してみたら main 内で satatic 変数を使ってるのはこれだけだったんだけど、 これのことか? www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02037.html
489 名前:472 mailto:sage [2018/04/09(月) 08:00:59.66 ID:4Qmw3/oH.net] 関数スコープのstaticなクラス・インスタンスのコンストラクタは main()以前でなく、最初にその部分が実行されたときに初期化されるんだっけか。 static なら一律にmain()の前、基本型や単純な構造体のstaticはロード時に初期化、 だと勘違いしていた。 訂正してくれてありがとう。そして間違ったことを書いてすまぬ。
490 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 08:28:16.55 ID:arNj8dw4.net] 初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通
491 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 14:14:56.77 ID:iBEYls0Z.net] いつやっても同じものはいつやっても同じだからな
492 名前:デフォルトの名無しさん [2018/04/09(月) 15:10:57.47 ID:cuDt6une.net] >>480 ありがとうございます。本とは内容が違うようです。 int main() { static const double ARRAY1[] = {1, 2, 3, -1}; static const double ARRAY2[] = {0.5, 1.5, ,-1}; static const double ARRAY3[] = {-1}; static const double* const ARRAY[] = {ARRAY1, ARRAY2, ARRAY3}; … } というコードが該当箇所です。
493 名前:片山博文MZ mailto:sage [2018/04/09(月) 15:13:59.63 ID:4wbW7ji0.net] staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。
494 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:16:14.76 ID:cuDt6une.net] >>485 でも、速さがどうとかいうことについては何も書いていないんです。 staticを付けていることについては何の説明もありません。
495 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:31:05.83 ID:iBEYls0Z.net] >>486 >>485 はきちんとした回答だと思うよ。 配列が大きくなれば顕著になる。 「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど
496 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:38:58.45 ID:7w9BViIO.net] 定数だからstatic constにした というだけのことでそれ以上の意味はないと思うが
497 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:39:52.73 ID:Cpp6LEO8.net] その変数をコンパイル時点で確定しようとしている。 ローディング時間も早くなる
498 名前:はちみつ餃子 mailto:sage [2018/04/09(月) 15:40:56.15 ID:fbTUuQs/.net] >>487 だぶんだけど、 >>486 が言おうとしているのは「>>485 だとしたら入門書としては不親切だよね!」って話じゃねーの。
499 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 15:57:19.85 ID:XexqtlKa.net] >>484 ROMとRAMに別れてる環境、 つまりほとんどの小規模な組み込み環境だと static const は通常ROMに配置される 要するにRAMの節約 速度は逆にRAMの方が速いのが普通
500 名前:デフォルトの名無しさん [2018/04/09(月) 16:42:59.75 ID:cuDt6une.net] クラスの定義をヘッダファイルに書くときに、 privateなメンバまで書くのはなぜですか? 必要ないように思います。
501 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 16:45:14.78 ID:cuDt6une.net] >>484 みなさん、ありがとうございました。 速度について気にしているのなら、ロベールにはそう書いてほしかったです。 例では、非常に小さな配列ですから速度について気にしていることは読み取りにくい ように思います。 >>488 定数だから const にしたというのなら分かるのですが、なぜstaticをつけるのでしょうか?
502 名前:デフォルトの名無しさん [2018/04/09(月) 16:46:43.49 ID:cuDt6une.net] >>492 private なメンバはむしろ、クラスのメンバ関数を実装する .cpp ファイルに書いた方がいいように思います。
503 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 16:48:38.97 ID:EW8VU1tO.net] sizeof で大きさ取れなくなるね
504 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 16:50:38.53 ID:cuDt6une.net] >>495 なるほど、ありがとうございました。
505 名前:片山博文MZ mailto:sage [2018/04/09(月) 16:52:05.66 ID:4wbW7ji0.net] >>494 pimplイディオムで、クラス詳細を隠蔽できるよ。
506 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:17:18.89 ID:R2K+YmFs.net] >>493 あの部分では特別に速度を意識した記述ではなく普通に意識する程度の事だから一々説明されないということではないかな 速度や使用メモリを気にするのはCやC++プログラマの癖または習慣みたいなもので特にロベールみたいな昔の人は体に染み付いているだろうからね
507 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:28:43.00 ID:arNj8dw4.net] >>493 今回はたまたまmainであり、 たまたま小さなデータだったというだけで、 より汎用性の高いコードにするのはプログラミングの基本 staticを付けるメリットは ・データ構造の初期化が1回(ROMだと0回)で済む ・スタックを浪費しない ・関数を抜けてもデータが保持される ・番地が固定 デメリットは ・関数を通らなくても初期化される ・関数外でもメモリを使う
508 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:32:13.19 ID:arNj8dw4.net] 一番重要なのは>>491 PCプログラムしかやらない人は知らないだろうけど
509 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:49:30.99 ID:m9zaOBXx.net] test2の形だと上手く動作しないのですが何故でしょうか 環境はvc6とstlport521です void test1(const char* cstr, ...) { char buf[1024]; va_list args; va_start(args, cstr); vsprintf(buf, cstr, args); va_end(args); printf(buf); } void test2(std::string str, ...) { const char* cstr = str.c_str(); char buf[1024]; va_list args; va_start(args, cstr); vsprintf(buf, cstr, args); va_end(args); printf(buf); } void main() { test1("hello1 %d\n", 123); test2("hello2 %d\n", 123); } //結果 //hello1 123 //hello2 1819043176
510 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 18:56:07.59 ID:arNj8dw4.net] 引数を std::string &str, ... にすればなおる
511 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:06:25.54 ID:m9zaOBXx.net] 引数を参照とポインタでも試してみましたが結果は変わらなかったです void test3(std::string& str, ...) { const char* cstr = str.c_str(); ・・・ void test4(std::string* str, ...) { const char* cstr = str->c_str(); ・・・ void main() { ・・・ std::string str3("hello3 %d\n"); test3(str3, 123); std::string str4("hello4 %d\n"); test4(&str4, 123); } //結果 //hello1 123 //hello2 1819043176 //hello3 1819043176 //hello4 1819043176
512 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:14:40.36 ID:arNj8dw4.net] va_start(args, cstr); なんでcstr?
513 名前:片山博文MZ mailto:sage [2018/04/09(月) 19:15:26.84 ID:4wbW7ji0.net] va_startの指定が間違ってる。
514 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:22:49.12 ID:m9zaOBXx.net] ああなんとなく意味が分かってきました va_startはマクロであってcstrの部分は引数の変数名が指定されなければならないということですかね
515 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:41:37.65 ID:m9zaOBXx.net] こういうコードにすると期待した動作をするようになりました ありがとうございました void test5(std::string str, ...) { char buf[10
516 名前:24]; va_list args; va_start(args, str); vsprintf(buf, str.c_str(), args); va_end(args); printf(buf); } void main() { ・・・ test5("hello5 %d\n", 123); } //結果 //hello1 123 //hello2 1819043176 //hello3 1819043176 //hello4 1819043176 //hello5 123 [] [ここ壊れてます]
517 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:45:39.82 ID:yhCzF70B.net] ついでに言うと va_start の第二引数については仕様上結構な制限、 各 argument に課される制約と同じ制約がある 配列はダメ、参照はダメ、基本型が格上げされる型との互換性が必要、など 最後のはクラスオブジェクトや float はダメということ 仕様として結果が不定なだけで違反してもエラーにはならないし 意図した通りに動くことも多い 詳しくは default argument promotions va_start で検索
518 名前:片山博文MZ mailto:sage [2018/04/09(月) 20:00:39.54 ID:4wbW7ji0.net] va_listとC++は、相性が合わないんだよな。呼び出し側でc_str()するとか。
519 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 20:14:56.03 ID:arNj8dw4.net] 相性が合わない
520 名前:はちみつ餃子 mailto:sage [2018/04/10(火) 00:44:35.92 ID:141aKXKv.net] 特に強い理由がなければ variadic template を使った方が安全だし簡単に書ける。 template<class... T> void test6(std::string str, T... args) { char buf[1024]; std::sprintf(buf, str.c_str(), args...); std::printf(buf); }
521 名前:デフォルトの名無しさん mailto:sage [2018/04/10(火) 08:29:44.17 ID:aAychsYe.net] strがなんで値渡し? アホなの?
522 名前:はちみつ餃子 mailto:sage [2018/04/10(火) 11:04:36.10 ID:141aKXKv.net] クソザコです
523 名前:デフォルトの名無しさん mailto:sage [2018/04/10(火) 21:38:17.71 ID:sbGIaKQd.net] なにこのバッファ溢れさせてくださいって釣り針
524 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 07:10:13.25 ID:5X4H9iqq.net] 色々とクソコテクオリティ
525 名前:はちみつ餃子 mailto:sage [2018/04/11(水) 11:17:54.25 ID:ZSzBt9iE.net] えー、可変長引数の例にしただけなので、そんなどうでもいいとこを言われても困るよ。
526 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 12:37:28.30 ID:FCilzVhB.net] そう言うところにしか突っ込めない雑魚の相手するなよ...
527 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 12:58:23.58 ID:0UD5Vzkt.net] わざわざ互換性を下げなくてもいいのに
528 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:16:27.05 ID:0UD5Vzkt.net] >>511 なんでbufに一旦書いてるの? 直接printfじゃだめなん?
529 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:20:49.36 ID:yjo2onbY.net] 実行目的ならvprintf使うんじゃね?
530 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:29:16.68 ID:0UD5Vzkt.net] 普通はね クソコテがコードサイズ、互換性、実行速度など 全て犠牲にしてもテンプレートを使いたかったみたい
531 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:46:51.95 ID:4xNEGOrU.net] va_start の第2引数の型の制限を知らなくてもor気にしなくても良いように C++ らしく va_start 使わない例を出したんだろ… と書いてはみたが、 そういう意図が通じるわけないか 通じる人は最初からわかってるもんな
532 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:49:14.05 ID:4xNEGOrU.net] そもそも何でbufにって質問は コメント元の>>507 にすべきだろ
533 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:50:42.77 ID:IGuJq2PQ.net] こんな辺境ですらイキリ散らすなんて呆れる他ありませんわ
534 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 21:54:51.56 ID:5X4H9iqq.net] >>522 誰も求めてないwww
535 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 22:01:42.55 ID:5X4H9iqq.net] 危険てんこ盛りなコードの危険性が低い部分をなおしてどうすんの?アホなの? オナニーは隠れてやれ
536 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 22:53:04.70 ID:4xNEGOrU.net] c++ スレで variadic template 紹介されてこの反応
537 名前:はちみつ餃子 mailto:sage [2018/04/12(木) 00:24:16.88 ID:csgoYI7G.net] >>526 危険性が高いかどうかは重要じゃなくて、話題のテーマに近いかどうかだろ。 本題に関係ないところなんてどうでもいいじゃないの。
538 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 02:27:29.73 ID:iYyApZ27.net] >>501 とvariadic templateは関係ないわけだが
539 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 02:36:35.20 ID:iYyApZ27.net] わざわざ環境まで書いてあるのに アホですね
540 名前:デフォルトの名無しさん [2018/04/12(木) 10:41:06.56 ID:KhnSMF/h.net] const double const ARRAY[] = { 3, -1 }; const double ARRAY[] = { 3, -1 }; の違いを教えてください。
541 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 10:48:56.23 ID:ySRK5Kj5.net] ポインタ変数なら ・変数も指し先も書き換えられない ・変数は書き換え可能。 指し先は書き換えられない のパターンだけど 対象が配列の場合、元々変数の書き換えができないから同じ意味じゃないかと
542 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 12:23:14.02 ID:aCAyQDuf.net] >>531 > const double const ARRAY[] = { 3, -1 }; コンパイルエラーにならないんだっけ?
543 名前:デフォルトの名無しさん [2018/04/12(木) 12:25:36.92 ID:KhnSMF/h.net] >>532 ありがとうございました。 >>533 Visual Studioではコンパイルエラーになりません。
544 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 14:29:59.20 ID:ZdndFYj4.net] あいうえお
545 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 14:43:04.91 ID:Htzfym0f.net] おこそとの
546 名前: mailto:sage [2018/04/12(木) 15:19:35.63 ID:4odEe1
] [ここ壊れてます]
547 名前:Tq.net mailto: とりなくこえすゆめさませ [] [ここ壊れてます]
548 名前:デフォルトの名無しさん mailto:sage [2018/04/12(木) 21:59:02.17 ID:nMaemNOx.net] const double const a[]; は const double a[]; と同じ意味 const const double const const a[]; なんて書いてもいいし double const a[]; と書いてもいい const typename と typename const と同じ しかもconstはいくつ書いてもいい
549 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 10:38:13.53 ID:roGFrSR8.net] Win32のBOOL型を返す関数を複数回呼んで、 すべて成功したときのみTRUEを返したいのですが (途中で失敗しても関数自体はすべて呼んでおく)、 BOOL Test() { BOOL bResult = TRUE; bResult &= Api(...); bResult &= Api(...); bResult &= Api(...); return bResult; } と書いてとりあえず動くのですが、よく考えたら&=はビット演算だし、 Win32のBOOL関数は成功時にTRUEを返すとは書いていないので、 例えば関数が成功時に2を返すパターンがあったら、 すべて成功しても戻り値はFALSEになるのではと思っています。 この場合、 bResult = Api(...) && bResult; bResult = Api(...) && bResult; bResult = Api(...) && bResult; みたいな書き方をするしかないのでしょうか。
550 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 10:57:04.94 ID:UdLtdLwz.net] result &= !!api(...); という風に!!を使うのも zero, non zero を false/true に正規化するイディオムだけど、 何にしても見た目は汚いと思う 文字数は増えるがif文を使って if (!api()) result=false; の方が可読性高いかもしれない
551 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 11:38:56.36 ID:OgXHMhZG.net] >>539 成功した回数をカウントして呼び出す関数が3つなら3でTRUEにするかな BOOL Test() { int count = 0; if(Api() != FALSE) count++; if(Api() != FALSE) count++; if(Api() != FALSE) count++; if(count == 3) return TRUE; }
552 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 12:44:10.91 ID:mVcRE5FO.net] 結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。
553 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 12:50:27.67 ID:UkpF6ptq.net] >>539 > bResult = Api(...) && bResult; > bResult = Api(...) && bResult; > bResult = Api(...) && bResult; これでいいと思う >>541 3個位ならいいけどたくさんになると数え間違いとかやらかしそう
554 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:35:54.06 ID:OgXHMhZG.net] >>543 1年後の自分がやらかしそうだわw
555 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:37:30.50 ID:eQfDSJES.net] 普通に&で繋げてしまえば。 return Api()&Api()&Api()...;
556 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:44:49.05 ID:lxf6ix6+.net] >>545 そもそもの質問のキモがわかってないよ
557 名前:539 mailto:sage [2018/04/13(金) 15:24:49.14 ID:roGFrSR8.net] みなさんご意見ありがとうございます。 例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、 常に同じ関数が3回というわけではありませんでした。 失礼しました。 bResult = Api(...) && bResult; の書き方自体は、そこまで汚いわけではないのですね。 同じような書き方をしているソースも、検索してみたら出てきました。 個人的には、 bResult &&= Api(...); のような記述ができるとありがたかったです。
558 名前:はちみつ餃子 mailto:sage [2018/04/13(金) 16:20:54.65 ID:RMqAMM1S.net] >>547 こういう手段もあるぞ。 bResult *= Api(...); 一度 0 になったら何をかけても 0 だ。
559 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:33:04.14 ID:cn4ajNkQ.net] &&= と書けないことをこの質問で知ったわ。 >>548 「返り値が0でなければ成功」の関数で変テコな返り値が来ると 組み合わせでダメになるかも。 256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。
560 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:33:39.54 ID:aZorcSvM.net] 明確なメリットが無いのに、 無駄にトリッキーなコードを書くのはおすすめしない
561 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:39:34.39 ID:aZorcSvM.net] 数が少なく重要な箇所であれば、 デバッグ用コードを追加しやすい以下で良い <
562 名前:br> if (!Api(...)){ bResult = FALSE; } ... 数が少なく重要じゃなければ >>547 で良い 数が多ければ色々と工夫しようか [] [ここ壊れてます]
563 名前: mailto:sage [2018/04/13(金) 16:44:07.64 ID:fORiWt/O.net] >>548 適当なニ数をかけたら 0 になってしまった、とかはあり得るのでしょうか? …んー、ないな、何故ないのだろう?
564 名前:デフォルトの名無しさん [2018/04/13(金) 17:53:26.34 ID:ledbPVdv.net] 基底クラスのメンバ関数に virtual をつけないことってあるんですか? つけてもつけなくてもどちらでもいいという場合はあると思いますが、 つけちゃいけないという場合が考えにくいのですが、そういう場合は あるのでしょうか?
565 名前:デフォルトの名無しさん [2018/04/13(金) 17:55:06.07 ID:ledbPVdv.net] 逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の デフォルトの機能にすればいいのにと思います。 どうでしょうか?
566 名前:片山博文MZ mailto:sage [2018/04/13(金) 17:56:07.81 ID:meZ//aXI.net] >>553 仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。
567 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 17:58:31.25 ID:ledbPVdv.net] >>555 virtualはつけなくてもかまわない場合には付けない方がいいということなんですね。 ありがとうございました。
568 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 19:32:26.21 ID:UkpF6ptq.net] >>552 オーバーフローで0とか
569 名前:はちみつ餃子 mailto:sage [2018/04/13(金) 21:02:41.55 ID:RMqAMM1S.net] >>557 せやな。 普通はないと思うが、無いと言い切ることもできない。 ここまでいろんな案が出てるけど、なんだかんだで >>539 が自分で結論出してるのがベストだと思う。 書き方の話なら、マクロでもクラスでも適当なものでラップすれば見栄えはどうとでも出来ることだし。
570 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 21:13:39.42 ID:ko86uHhA.net] 浮動小数点ならダーティー0とかあるけど 普通は意識しないでしょうねぇ
571 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 00:48:59.29 ID:qJeIaUAA.net] 今回は「非ゼロ」が様々な数値である場合について考えているわけだから 0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然
572 名前:デフォルトの名無しさん [2018/04/14(土) 01:08:45.20 .net] int64_t 使えばいいだろwww ケチケチすんなってwwwww
573 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 03:21:52.45 ID:yJ5VtHzf.net] 4つ掛けたらアウトじゃん ほんとうにバカだなあ
574 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 05:40:34.13 ID:DUdlBUp3.net] >>547 汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。 俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、 そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。
575 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 07:52:50.53 ID:Fxbc5uis.net] !か!!使えば1か0にしかならんからそれかけるとか
576 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 08:44:41.44 ID:whWbsAFN.net] それをシフトと組み合わせると、エラー箇所までわかって便利だね
577 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 10:42:40.78 ID:pziCCgl7.net] >>556 補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ
578 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 11:38:28.43 ID:aYmqXLA5.net] >>565 ネタだろうけど、ほんとにそれが必要としてもよほどメモリーに困ってるのでないなら>>542 とかでいいだろ
579 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 11:59:10.38 ID:gkV4B+Je.net] メモリをけちるとかそんなけちな理由じゃない
580 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 12:05:20.64 ID:whWbsAFN.net] selectって知っている?
581 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 12:31:15.66 ID:aYmqXLA5.net] select? その時代の知識で止まってるの?
582 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 17:00:09.46 ID:6q9VmxFv.net] a=1に対して、 cout << a << a++なら21 cout << a++ << aなら12 cout << a++ << a++なら21 と表示されました。 coutはどんな順番で評価されているのでしょうか?
583 名前:デフォルトの名無しさん [2018/04/14(土) 18:21:04.74 .net] >>571 確かに以下は https://ideone.com/sBACG3 21 12 21 と表示される でも、手元のVC 2017 / Windows 10 では 11 12 11 と表示された g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では 11 12 12 と表示された
584 名前:デフォルトの名無しさん [2018/04/14(土) 18:31:12.32 .net] >>572 codepad.org/KVv4KD8O ではコンパイルエラーになった。 cc1plus: warnings being treated as errors In function 'void test1()': Line 6: warning: operation on 'a' may be undefined In function 'void test2()': Line 12: warning: operation on 'a' may be undefined In function 'void test3()': Line 18: warning: operation on 'a' may be undefined techtipshoge.blogspot.jp/2012/01/c.html www.kouno.jp/home/c_faq/c3.html www.st.rim.or.jp/~phinloda/cqa/cqa7.html こんな書き方をするなってことだね
585 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 00:38:00.30 ID:/OvgYAab.net] >>571 いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、 評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。
586 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 08:36:03.86 ID:IUBKEb9a.net] 未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで 同じ順序で評価されない可能性もある、じゃないかな。 実際のところ、コンパイルごとに評価順が変化するとも思えないけど。 いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。