gotoの話でもするか? それともマクロ? ハード絡みのところなんか俺的にはオモロイが
前スレ999だけと循環してないよ 仮想アドレス使ったら必ずページフォルトするわけじゃない MMUの仕組みわかってる?
こらこら、前スレ999は俺だぞ なりすましすんなカス
>>7 999へのレスって意味ね 文脈で理解してほしいところだが で循環論法でないことわかった? 環境を限定しないならこれ以上続けても無駄 全ての環境を知ってるヤツでない限り
struct AutoDeleteFile { const WCHAR *m_file; AutoDeleteFile(const WCHAR *file) : m_file(file) { } ~AutoDeleteFile() { DeleteFileW(m_file); } };
それではおじいちゃんのaddress談義 続きをどうぞ
ともかく最初に思ってることがあって 要は荒らしてやろうと 今回は結構うまくいった方かな この前は 「std::deque には begin() end() clear() があるのに std::queue と std::stack にそれらが無いのは何故? 有ったほうが便利なのでは?」 って質問で大分いい感じにスレを流した そら、有ったほうが便利に違いないし、無いことに合理的な理由など無いわけだから荒れる そういう、荒れそうなネタ考えるのに毎回結構頭使う ただ、ちょっと前の goto のやつ、あれはダメ 初心者がワーワー騒いでるだけで、ほとんどのベテラン連中は静観してたと思う 俺の狙いはそれじゃない あと、妹大好きです
でも、もともと主張がおかしかったから、釣りだったのはホントじゃないの。
釣りっていうかただの構ってちゃんな。何か深い考えがあるというわけでもないし。
釣りじゃなかったら相当痛い人だし。 釣りならちょっと痛い人で済むよ。
ところで僕は自分の職業の板ってまったく見ないんだけど。 ここは職業プログラマが多いの?
わしも見ない あそこは仕事のグチを書きこむとこやん こっちは言語仕様のグチを書きこむとこや
break break; bresk break break; break continue; こんな書き方ができたら嬉しい?
多重ループを抜ける方法 ループに名前は名前を考えるのがイヤ break [数字] は数えるのがイヤ 関数を分けてreturn はもっとイヤ 変数を使ってbreakで抜けるのは論外 でもgotoはなんとなくイヤ 全ての要望に答えたのが >>32 バカの要望を聞いてさらにロクでもない方向に行ってしまうっていう わかりやすい例を提供してくれてありがとう。
ん? 皮肉のつもりで書いたんだけど 真面目な書き込みととらえられるとは思わなかった
あえて説明してるところで恥ずかしいことになってる奴w
>>37 おれはおもしろいアイデアと思う 他に考えるとしたら やはり名前があった方が変更に強いと思うのでその線でいくと 大抵ループにはイテレータやカウンタが紐づいてるから それを使って for (auto& x : なんとか) { for (auto& y : なんとか) { .break x; } } とかどうだろ? for以外で使えないしforでも宣言空だとだめだけど 頻繁に使うわけじゃないだろうから妥協できるかなと while(){} や do{}while(); で使えないので却下
for(int x = 0; i < ... ) { int y = 0; LOOP: a[x][y]... ++y; if(...){ break; /*多重ループ脱出*/ } goto LOOP; }
>>37 何個の break を書くのか、と break の後に書く数字は? で 結局のところ同じように数えなきゃならないでしょ。 >>32 はcontinueを混ぜられるのが面白いけど、やるならこうだな。 break n; continue n; こういうしょーもないシンタックスの話って馬鹿でもしやすいのが盛り上がる理由なんだろうな。
特定の言語のスレ シンタックスを語らずに何を語る?
break 9; を数えたく無いとか言ってたヤツがいたけど そういう時は素直にgotoを使えば良い
>>55 C++ ではオブジェクトの寿命の管理と辻褄を合わせなきゃならないんだから full continuation は無理だぞ。 ループに名前を付け、その名前で離脱や継続を行う。 ループA {
途中で送信してしまった。面倒だから書き直さないが、 breakやcontinueはキーワードが紛らわしいのでPerlのlastとnextを拝借する。 last ループA; とか next ループA; みたいな感じ。
gcc5ぐらいから一気にgcc10にしたらエラー表示とかデフォルトの警告とか色々変わっててわろた
>>61 まあね。だけどgotoはフリーダムすぎて良くないでしょ。 いや全然そう思わない gotoで何か不都合がある?
>>52 コンパイラ毎の最適化における癖とか、例外の実装についての差異なんかも語ってもいいんだぞ。 >>63 goto は自由すぎるけども、ループを何段階も一気に抜けたいとかいう状況がすでにだいぶん自由だと思うぞ。 そういう状況が生まれたらもう駄目なんだよ。 ごちゃごちゃとした使い分けを考えるよりおとなしく goto した方が「そこが悪い」ってのが目立って良い。 一番使いたいのは2段break 行列や画像など2次元構造では当たり前のように2重ループになる 2重ループを抜けたい状況は設計が悪い と思う感覚が全く理解できない
構造化を壊さないことを保証した仕組みで脱出したいってことでしょ
2次元構造の2個のループを抜ける為に 非常に関連のある2個のループを別関数に分ける この方が設計が悪い というのがおれの感覚
>>67 gotoは悪、多重ループは悪、みたいなどこかで聞いたルールを杓子定規に常に遵守すべき絶対ルールのように考える人が少なからずいるんだろうね。声が大きいだけかもしれないけど。 gotoの利用にコンパイラの補佐があればよかったのに
中カッコ、変数の有効範囲含め スコープ内に飛び込むジャンプを一切禁止、前方のみと決めれば なかなか直観的でわかりやすいキーワード だとおもうのに
一切禁止とか言うから それが絶対だと初心者が思って思考停止する この典型がgoto 使った方が良い時は使う 再帰も生ポもグローバル変数も多重継承も多重ループも
>>67 ここでワイが「悪い」って言ってるのは使うなとか別の方法がとれるとかいうほどの強い意味じゃなくてさ、 気を付けなきゃならないポイントとして目立ってもらわなきゃ困るって程度の意味。 だけど、日常的にそこら中でそういうポイントがあるのならやっぱり悪いとは思うけど……。 二重ループの脱出は [&]{ for(){ for(){ return; } }}(); で結論出たはずだが
関数オブジェクトはまともなコンパイラならインライン展開される
贅沢言いすぎだね 素のPascalなんてreturnすら無いからね もはやどうやってプログラムを書いたらいいか分からないレベル
Pascalは完璧な構造化言語を目指したから 入口と出口を常に一つずつにするというポリシーがあって それゆえreturnが無いんだよね returnがあると出口があちこちに散らばるので 構造化じゃない、汚い、という考え なお、breakは有るもよう
[&]{ try{ for(){ for(){ throw 0; } }catch(...){} }}();
抽象的なレベルで考えたら break は 「残りの文が if 式で囲まれていると見なして暗黙のフラグを設定する (そのフラグは暗黙にループの終了条件でもある)」 とも考えられるから、構文糖だといえば構造化は壊れていない。 だけどなぁ、プログラムは人が書くものだし、人にとってどう見えるかも大事なんだよな。 そこらへんは見方によってどうとでも理屈を付けられてしまう。
[&]{ try{ for(){ for(){ throw 2; } } }catch(int d) {printf("%d段階ジャンプしたお¥n",d);} }();
>>82 break 2 も gotoでループを抜けるのも同じ >>83 それは最悪 throw 3; って書いてもチェックされないし >>67 3重ループは? 4重ループは? なんで2だけなの? [&]{ try{ for(){ for(){ throw "リレミト"; } } }catch(const char*s) {printf("%sの呪文を唱えた¥n",s);} }();
>>87 答えられないならレスしないで下さい ウザいだけです for () { for () { goto done; } } done: どう考えてもこちらのほうが綺麗
>>90 だな 必要になったことを変に偽装する悪癖を治すべき病人多すぎ ほんまになぁ。 そんな簡単なことをラベル付き break だのなんだのって面倒なだけとしか思えぬ。 もう構造化は破綻してるんだからおとなしく goto しとけよな!
>>89 日本語が不得意みたいなので英語で説明しますね Double loop frequently appears to treat a two dimension structure such as matrix or image data, so "break from double loop"is used by programmers related mathematical or visual product. >>67 states that is good reason and s not always bad design. >>93 意味わかんね なんでそんなことするの? アホだから? それともバカだから? >>94 It's purely kindness for non-Japanese speaker. Did you not like it? >>92 構造化的には breakも途中でreturnもgotoでループを抜けるのも同じだよ Пожалуйста, говорите по-японски.
なんだロシア人か Я не понимаю >>67 , потому что я не понимаю японский? >>96 同じだからそれ以上に新しい文法を持ち込んでもそれほど綺麗にならんって! ということを言いたい。 >>96 gotoは正しく使えばという但し書きがつくでしょ そこをなんとかしたいという話だと思ってる それが論点だとするとgoto使えというのは解にならない >>102 正しく使う前提なのは当たり前 なんでgotoだと正しく使わない前提になるのか不思議 危ない操作はできないようにしようってのが言語の進化だからな それ無視して、安全に使うのが前提とか、正しく使うのが前提とか、それ言っちゃね なんかおかしな方向へ行くよね
>>104 構造化プログラミングの概念は知ってるんだよね? gotoを正しくしか使えないように改良したのがreturn、break、continue ってことも忘れずに
>>104 構造化プログラミングでは使わない制御構造を 使うべきでない理由が構造化プログラミングって論法に 抜け出せない枠があるとは思わないの? >>108 continueだけ、それで正解なんだが 他はみんな間違ってるよ 見てください皆さん、ID:BhmlSyWc ← ひどいですよ まず何言ってるか分からない このレベルはきついな
>>106 どの辺からgotoが危ない操作だと思うの? まあ1万行ある関数の中で、5千行目ぐらいにgotoがあって、ラベルが関数の先頭付近にあるとか、それに近いのは見たことあるが、あれはどう考えてもgotoの悪い例だからな 包丁で味噌汁食ってるようなもん
>>110 きつくて気の毒だな 不勉強なやつは自業自得なので同情はしない 不定値や無限ループの危険はgotoに限ったことじゃないし ループを抜けるgotoには関係ない話 goto特有の危険な場面 何を心配してるんだろう 酸っぱいブドウ?
gotoはどこへ飛ぶか分からないから読みにくいんだよ 前に飛ぶのか、後ろに飛ぶのか、それすら分からない 飛び先を分かりやすく改良したのがreturn、break、continue それぞれ飛び先が決まっているから追うのが楽 その英知が分からんっていうならreturn、break、continueを使わずに 全部gotoでやれば?って話
どこに飛ぶかわかる名前にするってのが普通の発想 意味でも構造でも文章でも好きな名前を付けられる 関数も変数も名前空間も全てそう
>>117 飛び先じゃなく飛ぶこと自体の問題なんだがw つまりはそういう話で、追いやすいように飛び先を制限したいよねーってのが根底に有って (当然そういうのが念頭にあってreturn,break,continueは生まれたわけで、前例に倣いたい所) それでブロックに名前を付けるだのbreak 2だのって書き込んでいる人がいるわけで gotoでいいんじゃね?っていうなら、return,break,continueもgotoでいいんじゃね? むしろforやwhileもgotoでいいんじゃね?gotoを正しく使えばいいんだろ?ってなる
構造化プログラミング知らずにgotoいきって使うのはさすがにやばい
>>122 どうなっていれば「追いやすい」のかを まず明らかにしようぜ 俺ルールでもいいし 広く認知されているルールでもいいし 巻数はどこに飛ぶか分からないが、必ず元に戻ってくる(のが基本) 行きっぱなしというか、ただのジャンプのgotoやらbreakやらとは違うのだよ 関数のコールは入口と出口が一つになってて非常に構造化されてる好例 こういうところ分からないってのはセンスないよ
使い所でgotoが使えないのはセンス無い 使い所でgptoを使わないのはコードが見にくい 使い所でgotoを使わないのは危険なコード goto否定派にレベルを合わせた主張をするとこんな感じ
本心では誰もgotoは否定していないんじゃないかな 今は多段breakの機能が無いんだからgotoを使えばいいだろう しかし、もしgotoを使わないで済む多段breakの新機能があったのなら それを使ったほうがいいだろうし じゃーその新機能はどんなものが考えられるか?って遊びだろ? ブロックに名前付けるだとかbreak nだとかは
多段breakは考えた奴は脳味噌が糞すぐる… ループの深さを変えたとたんにバグるじゃん? ループの深さは金輪際変えないとか ループの深さを変えるとき必ずループ全体を机上確認するとかだったら gotoでも逝けるじゃん??
ああ、そうだな break 2だとfor文が3重になったときにバグるな 個人的には面白いと思ったが
画像処理とかで2重ループ良く書くけど、最近2段階breakしたくなった記憶がないな 実は要らないんじゃね
まーC++がプリプロセッサを殺すために進化しているのと同様 Cはgotoを殺すために進化したともいえるわけで たとえば、関数、for、return、などなど、制御構造にかかわるほとんどの物が gotoを殺すために有るといってもよい だから、もっとgotoを殺すにはどうすればよいか、考えるのは自然な発想かと C++でもテンプレートなどで出来ないことはプリプロセッサでしなければならないし ただ、同じことがテンプレートとかで出来るならそのほうが良いだろうし もっとプリプロセッサを殺すためにはどういう機能を追加すればよいか考えるのは自然な事だろう 同じ同じ
goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね C/C++ の goto とかはどう頑張っても関数の中でだけしか跳べないのだから、BASIC の GOTO ほどにはスパゲッティ状態を招けないのではと考えます 無論、その関数が異様にデカければ別ですが、そんなデカい関数を書くほうが問題であって goto が問題なのではないかと
ループを抜ける為にだけ使われる変数を使ったループ抜け 世の中にはたくさんこういうコードがある たくさんのコードを見る機会がある人なら たくさん見たことがあるはず gotoネガティブキャンペーンのせいだよ
>>136 gotoが使わないで済むように進化してくのは期待している。 ただ現状として、多重ループを抜ける場合みたいにgotoを使うのがシンプルで分かりやすいならば、毛嫌いしたり盲目的に原則振りかざすよりgoto使えばいいだけのことだと思うよ。 >>138 お前ほんとに病気だな 多重ループ脱出でgotoが簡潔なのはみなわかってる でもgotoは自由度が高すぎて構造を壊す可能性があるわけ だから改善するとしたら何があるかという話をしてるだけであって 別にgoto禁止とかの話はしてない 好きなだけ使ってろよ あと構造化プログラミングぐらい知っとけ for () { break label; } label; for () { for () { break label1 } label2; } label1; こういう風にfor文のお尻にラベルを付けられるようにすれば局所化したgoto風のbreakが使えるのでは
for () { goto label; } label:; for () { for () { goto label1; } label2:; } label1:;
Pythonはループにラベルをつける手が使えた と思った(幻覚でなければ
またgotoの話になってんのかよ。。 だからいっそ禁止にと思ったが、それよりもさらにクソな構文の提案が出てたり。。 想定を超えた馬鹿どもばっかりじゃねーか。
ただ、凝りに凝った複雑怪奇なテンプレートより シンプルに作ったマクロの方が読みやすいって事例も当然あるだろうよ てか、わりと、最近、残念ながらその傾向が・・・で、C++が嫌われる理由にも・・・ だからgotoを殺すのも上手くやらないとむしろ酷くなる そこが腕の振るいどころで面白い部分でもあるし、言語作ってる連中もそんなことで頭いっぱい 変なゲーム性が有って、逆にそれがまたダメな部分でもあって あと、妹大好き
多段breakの使用頻度がそれほど多くないことを加味すれば break n;方式が妥当だろうね これだと2重ループを3重ループに書き換えたときにバグる、とか 意味不明なことを言ってる奴もいるが それは1重ループをbreakで抜けてたのを2重ループに書き換えたらバグった と言ってるのと同じであって、当たり前の話だし、今でも同じことだ break n;が一番シンプルで妥当だと思うね
breakの後にマジックナンバーを書くのが気に入らない 定数には意味のわかる名前を付けたい
ただし、break n;のnの部分が変数でもOKとかなってたらかなりウザいが そこはnは定数と定めたいね、でもC++の場合は定数と言っても・・・ 複雑にしようと思えばいくらでも複雑にできるわなー 普通に使う分には問題ないかと 明日からbreak n;が入っても、たぶん誰も困らないし、混乱も起きないだろう 割のいい賭けだし、俺はアリだと思うね
breakとbreak nが同じとか意味不明な主張をなさる御仁がいらっしゃるが じゃあcontinueがcontinue nになったらどんな地獄が発生するか 考えてみたら良い
別にcontinue n; 全然ありでしょ これと同等の事を、何か別の方法でやるよりスマート for(;;){ bool do_continue = false; for(;;){ if(...){ do_continue = true; break;} } if( do_continue ){ continue; } } ↓ for(;;){ for(;;){ if(...){ continue 2; } } }
do { do { ... if (cond) { continue 2; } } while (副作用の有る式1); } while (副作用の有る式2); とから?
break nなんてやるくらいならbreak label で抜けるループを明示的に指定したいな ↓ ループにラベルをつけるとして、先頭では見づらくて邪魔だな ↓ ループの末尾にラベルを付ければ見やすいけど、それだとlabelついたループを抜けると言うよりlabelの指す位置へのジャンプだな ↓ なんだgotoでいいじゃん 個人的には breakto label という記法でループ出口に書いたラベルに飛べるとするのが分かりやすいと思うけど、こんなことに新しい予約語を導入するくらいならgotoで十分だと思う。
break nが良いとか言ってる椰子は ついでに行番号も復活してほしいと思っているに違いナス
do{ do{ if(...) goto NEXT; }while(...); NEXT; }while(...); と等価だろう 要はこういうgotoを置き換えるために作られたのが continueなのだから、そのルールに従うのが普通だろうね もしくはgoto使わずにフラグでやっても、どのみち内側のループの条件式は実行されないわけで do{ bool do_continue = false; do{ if(...){ do_continue = true; break; } }while(...); if(do_continue) continue; }while(...); これ以外の解釈ってのは難しい
そういう機能要望みたいなのここでやる意味ある? C++Slackでやった方がよくない?
,,-―--、 |:::::::::::::;;;ノ |::::::::::( 」 <もう構造化は破綻してるんだからおとなしく goto しとけよな! ノノノ ヽ_l ,,-┴―┴- 、 ∩_ /,|┌-[]─┐| \ ( ノ / ヽ| | バ | '、/\ / / / `./| | カ | |\ / \ ヽ| lゝ | | \__/ \ |  ̄ ̄ ̄ | ⊂|______| |l_l i l_l | | ┬ |
>>136 Cはgoto殺すために進化してねえよ Cのgotoが関数外に飛べないのはスタック巻戻しのような仕掛けが複雑になりすぎるからで 構造化プログラミングで否定されるからという理由ではない 構造化プログラミングで否定される制御構造を持たないことにするなら breakやlongjmpは存在できないはずだ 結論が先にあって理由が後付けだから支離滅裂、一貫性の欠片もない事を書く もはや宗教
ほんと、宗教だね 洗脳されてるやつは強固に思考停止していて 何を言おうが馬の耳に念仏だ
>>159 根底がわかってねえやつが多いからだよ 古典的な基本がわかってねえやつは若造と爺のどっちに多いだろうね 頓珍漢なことを書いて袋叩きにされたからって逆恨みする精神性なやつはどっちに多いだろうね break labelでいいんじゃね gotoと同じだが、labelがbreak的な位置にない場合コンパイルエラーになれば良い
gotoは便利なswitchだからね。 便利すぎるわこれ。 これからも積極的に使っていこうと思います。
さすがにgotoでジャンプテーブル化の最適化までやる処理系は まれだと思う
アドレス直接指定なのに、テーブル必要ないんじゃないの。 テーブル必要ない分、switchより有利なんじゃないかと思いました。
(条件分岐無しの素のgotoだけでどうやってswitchの便利な代替品にするつもりなのやら…
頑張ってひねり出した!! けどウンコにしか見えない。 納得できるものを頼む。
>>175 お前が何をいってるのか、何を考えてるのか理解できないのに、お前を納得させられる奴なんていないぞw お尻にラベルつけて break ラベル; がいいとか言ってる奴は構造化の意味がわかってなさ過ぎ ラベルは飛び先じゃなくてループに付けて break ラベル; でそのループから抜けるんだよ なので break ラベル が使える言語はたいていループの頭にラベルをつけるようになってる あと break レベル数 とか言ってる老害は早く滅びろ
名前使うならこんな感じか void main(){ auto scope1 { for(;;){ for(){ break scope1; } } }
>>176 俺自身何を言っているのかよくわからないのだが。 もしくは、forの直後 void main(){ for(;;)scope1{ for(;;){ break scope1; } } }
ループの先頭にラベルを書くくらいなら gotoの方が分かりやすい
あの、スレとは全然関係ないんだけど。 Boostでデバッグとリリース判別するマクロってありますか? イテレータを1億回ほど回すのでデバッグだけテストを迂回したいんですが。
NDEBUGを知らなかったからです。 おまえらおせーよ。
NDEBUGってISO/IEC9899やん おまえさんがboostっていうから レスポンス鈍かったんだよ
今の一重ループを抜けるときの普通のbreakにはラベルを付けないのに 多重ループを抜けるためのbreakにはラベルが無いと読みにくくなるっていう 発想というか対称性というか整合性というか必然性が全く見えないんだが 今ラベル無しの一重breakで誰も発狂することもなく普通に使えているのに 多重breakになった瞬間にラベルが無きゃダメってなるのはなんか弱い 同じことを二回書いたけども ラベル無しでも別に普通に読めるでしょ、今まで読めてるんだから 大体ラベル付けるんならgotoと手間自体は変わりないしな
下方向にだけ飛べるgoto相当機能があればgotoは要らなくなるんじゃない?
>>190 は、Cにgoto <label>とbreakがあるのになぜCはbreak nを設けるところまで踏み込まなかったのか、とか break <n>で即値<n>に行き当たったコード閲覧者が行き先を知るために何をせねばならないかとか、 考えた方が良いので は… >>190 break nを勧めている人? 対象が1段なのと複数段とでは大きなギャップがあるでしょ。単純に対称性があると言えるものではないと思う。 ラベルつけるならgotoと手間が変わらないというのは同意。ただ、重要なのは手間が減ることではなく、複数段のループの外に出ることが明示されることだから、gotoと意味が混同されず同じ程度の手間でできる記法があるならそれは嬉しい。 現実のC++について話せ ここで新機能の導入について議論しても無駄だ フォーラムでやれ
手間が減ることは重要だよ ラベル名を考える手間をかけて良いならgotoで良い
大体だよ、多重ループはbreakで抜けれないので、仕方なくgoto使うときの そのgotoを使う都合で必要になった、そのラベルをだよ じゃーブロックにラベルをつけましょう、ってなんでそーなんだよ 元々のbreakにはラベルなんかねーのに breakにラベルが無くて混乱したやつ居るか? ご飯が無いからパンを食べてた状況なのに すり替わってパンありきになって、パンが無きゃ話にならないとか言い出す始末 別にパン(ラベル)なんかなくても、ご飯があるならご飯食べろよ ラヘルラベルって、そのラベルがどこ由来か考えてみろよ、gotoだろ? もう一度言うが、もともとのbreakにはラベルなんかないし、それでみんな普通に過ごせてるし、混乱も起きてない ただ、gotoで抜けるためには文法上/機能上ラベルが必要だったねってだけで、そこに着目しても仕方がない 本質的には無くても別に困らない
ソースコードチェック目的でプログラム読むとき、gotoが出てきたら そのgotoの使用方法が問題ないものなのか、いちいちチェックしないといけない。 breakならループ抜けるという意図が明白なので、チェックしなくてよい。
そんなに名前が無いと発狂するんならもうgoto使えば?って思うし なんなら関数化して正式に名前付ければって思うし そこまでしたくないってときにbreak nが便利なわけだ やりたいことは「多重ループから抜けたい」であって 「名前を付けたい」ではない!!
関数コールも問題のないコールかどうかチェックしないといけないから 使わない方が良い
それならもうポインタもグローバル変数もマルチスレッドも大量のチェックが必要だから使ってはいけないってことで
現行のC/C++にはgoto <label>がある一方、break <n>は無い もしbreak <n>の追加がgoto <label>の実装より難しかったからやらなかったのだとしたら、 break <n>の飛び先がgoto <label>の飛び先より簡単にワカルから優れているという主張は根拠を失う break <n>はわかりにくいか、さもなくばgoto <label>と同等なんである
>>201 現実ありえないのは重々承知したうえで書くけど 100重ループを脱出するとき数を数えたくないだろうなって思うじゃん ほかにも3重ループとかで2ndと3rdのループから共通の脱出先ラベルにもできるわけじゃん 文法を拡張する前提ならそこまで想定すべきだと思うね 粗野な即値の数字じゃなくて意味ごとに名前をつけられるようにしてきたのが プログラミング言語の進化の歴史なのでおれは自然だと思うよ というかそういう観点からラベル付きbreakというのは他の言語にはあるわけで で今話してるのはもっと書きやすく読みやすくできないかというトピックでしょ break Nは使えるだろうけど洗練されてない感じ break [n] はラベル名を考えなくて良い利点がある 使えるなら使いたい ラベル名を考える必要があるならgotoで良い ループの先頭で名前を付けるのはgotoより見づらいから使わない
break n とか言ってる奴は何故か>>150 をスルーしてて笑うわ 他の人は「マジックナンバー」だと思わなかったからでは。
foobarやhogeを超える人気なダミー文字列を考えたほうがよほど建設的だぞ、君たち。
break 5; //C GOTO 5 : REM BASIC
マジックナンバーがイヤなら break break;
関数で置き換える 引数がめんどうならラムダで置き換える returnが多重breakの代わりになる
>>214 多重ループを単一関数に書くって前提だね >引数がめんどうならラムダで置き換える ←New! これは場合による for (i=0; i<INT_MAX; i++) { for (j=0; j<INT_MAX; j++) { (何がしかの処理) } } を for (i=0; i<INT_MAX; i++) { for (j=0; j<INT_MAX; j++) { ((何がしかの処理)を行うラムダ式fを定義) f(); } } とするのではご利益が無いが、 ((何がしかの処理)を行うラムダ式fを定義) for (i=0; i<INT_MAX; i++) { for (j=0; j<INT_MAX; j++) { f(); } } とするのではラムダ式定義時点でループ内の変数を参照できないから場合によっては詰む 結局f()は引数がぞろぞろ並ばねばならない
>>217 左様 それがラムダ式を適用して解決づべき適切な場合である(キリ ジーオーティーオーというスペルでなければ 制御構造はそのままでいいと言うクソ論法
スレとはあまり関係ないんだけど、nodiscard属性を無視するにはどうしたらいいですか?
変数で受けといてその変数をガン無視すればいいんじゃないの 未使用変数の警告出るだろうけど
>>210 お前の言う「他の人」はマジックナンバーの意味わかってないってことか? このスレ見てたらありえなくもないかと思えてきたわw あと三日くらいしたらお前より出来るようになってるから。
>>208 昔のBASICは、行番号を勝手に付けてくれていたのでgotoでもラベル名を考えなくて済んだのでとても便利だった。 >>226 なお、アセンブラでは行番号がなかったのでラベル名を考える必要があったが、 意味のあるラベル名を考え出すのは大変だったので、分かり易い場所以外は、 多くの人が、lab1: lab2: lab3: のような連番を使う傾向があった。 >>226 >昔のBASICは、行番号を勝手に auto 文だったかな… すまん俺の聞き方が悪かったのかもしれん 最近プログラミングの勉強始めて、各言語の用途とか調べたんだけど、ここでも一応聞いてみたかったの 何を作ってるって言うより、どんな開発に携わってるかっていうのを聞きたかった
検索はstd::setやstd::unorderd_setより速いけど、挿入が一桁遅い。 静的構築が速いというので、それもやってみたけど、2/3くらいにしかならなかった。
初学者的な質問です、よろしくお願いいたします。 バイナリーファイルを std::fstream f; f.open(filename, std::ios::in | std::ios::out | std::ios::binary); でオープンし、同一ファイルのオープン中に f.read(), f.seekg() でガンガン読むと同時に f.write(), f.seekp() でガンガン書き込む を試しているのですが、seekg(), tellg() と seekp() tellp() は名前は別でもあるにもかかわらず、実はファイルポインタの実体は両者で同一なのでは? という疑いが発生しました。つまり、seekg()/tellg() と seekp()/tellp() とは独立でない、と推測しています @この解釈で正しいですか? Aこういうのは、C++ iostream レファレンスのどこを見て洞察するべきなのでしょうか? 実際のお題は相変わらずエラトステネスのふるいです https://ideone.com/6Ww9nq >>231 ,233 私は今のところエラトステネスの篩にご執心、という体たらくです… エラトステネスのふるいで なんでファイルのリードが必要?
>>244 結構昔から http://www.asahi-net.or.jp/ ~KC2H-MSM/pbsb/pbsbm006.htm にとても興味を持っていたのです、二つの隣り合った素数の差を「素数のギャップ」と呼ぶことにしたとき、 『素数のギャップが取りうる値の頻度。はじめは2、4が多いが、そのうち、6の方が多くなる。』 『6がチャンピオンの座を降りるのはいつか。』 『少なくとも 10^14 以下では6がトップであり、それ以降、いつ、6以外の数がトップになるかは、知られていない。』 10^14 までの数であっても全部、篩としてメモリに載せられないので、さてどうしたものかと思案中です、最終的には年スパンでずっと計算させ続けるのに耐えられるようにしたい、と その問題だけなら 2次キャッシュに収まるくらいに分けてふるえば速い 間隔も大して大きくならないので ヒストグラムはオンメモリで済む スレッドも簡単に分割出来るので 論理コア数と同じだけスレッドを作って回す
>>246 コメントありがとうございます >間隔も大して大きくならないのでヒストグラムはオンメモリで済む 確かに 10^10 まででも最大 354 というのには驚きました、案外密に分布しているんですね >2次キャッシュに収まるくらいに分けてふるえば速い constexpr unsigned int windowSize_Default = 30 * 5000000; はでかすぎ、ですか いただいたアイディアは、どれも私には難易度が高いのですが、ぼちぼち書いていきます… AVXレジスタを使って小さな素数の倍数を消して ビット命令で大きな素数の倍数を消す 大きな素数の倍数は210ずつ処理する 昔素数の数を数えるプログラムを書いたことがあって 記憶に残ってる範囲ではこんな感じ
>>229 100 WIDTH 80,25:CONSOLE 0,25,0,1:SCREEN 1:CLS 3 110 XXX 120 XXX 130 IF XXX = XXX GOTO 110 のようなもので、最初に入れるときは自分で行番号も手で打つのが基本ではありました。 115 YYY と入れると、110と120の間に行が挿入されると言う仕組みです。 それだと9個以上は挿入できなくなるので RENUM 命令を使うと行番号を自動的に 振り直すことができました。その場合、GOTOやGOSUBの行番号も連動して変わる 仕組みです。 >>248 コメントありがとうございます! >大きな素数の倍数は210ずつ処理する 私は、2*3*5 = 30 でわりと満足していましたが、2*3*5*7=210 まで拡張されたのですか!?うーむ… >>249 mon に入って、プログラムタイトルのコメントの行番号を手打ちで全部 0 にする、とか… どうでもいい話でごめんなさい… 素数は、6n ± 1 か。 6n + 1, 6n + 5 だけ 6n + 3 は、3の倍数だから、素数じゃない
A = 6n + 1, B = 6n + 5 とすると、 AA の並びなら、差は6 AB なら、4 BA なら、2 BB なら、6 A,B になる確率がランダムとすると、6 になる確率が2倍!
>>242 たぶんこの一文。 > A joint file position is maintained for both the input sequence and the output sequence. N3337 だと 27.9.1.1 の第 3 段落にある。 あくまでも std::basic_filebuf ではそうなってるってだけなので、 ストリームバッファ全般に言えるわけではなくて、 独立した位置情報を持つようなものも作れないわけではない。 FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。 >>250 ビット命令が48個続くだけ それほど大変じゃない 今だともっと良い命令があるかも >>254 コメントありがとうございます。いまいちよくわかっていない iostream. の全体像を掴めるよう、いただいたヒントも頼りに潜ってみます >FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。 fseek() が 64bit オフセットならいいのですが あるいは win32api::SetEndOfFile() のような、オフセットを指定して trunc する方法があればいいのですが >>242 のバイナリファイルは単に uint64_t な素数を突っ込んでいるものですが、ある日末尾が中途半端にちょん切れてしまったのです… >>256 それファイルに書く必要ある? 仮想メモリ頼りにメモリでやれば? >>256 巨大なファイルにちょくちょくシークしながらアクセスするなら メモリマップトファイルを使った方が楽やで。 >>257 それはダメでした。win7, 16GB、素数の大きさが10^11 程度でスラッシングが発生して win7 では使い物になりません GIMPS cli のように、普段は意識することなく3年くらいかけて計算するようにしたいです >>258 着々と容量が増加するファイルに対して mmap は使えるのですか?win32api::CreateFileMapping では mmap を確立した後にファイルサイズを増やしてはいけない制限がありました >>260 そんな制限があるんか。 連続した巨大なメモリを予約しておいて、 適当な大きさに区切ってファイルにマッピングすればええで。 ファイルを複数に分けることになるけど、 見かけ上は巨大なメモリとして扱えるし、 容量が増加する都度に新しいファイルを作って割り当てればええ。 というやり方を思いついたので具体的に出来るんかいなと思って調べてみたら MapViewOfFileEx の最後の要素でアドレスを指定する機能がある。 VirtualAlloc で予約した範囲は MapViewOfFileEx で使えないので、 どうやって空いているメモリ空間を探せばええんやろと思ったら VirtualAlloc で予約した直後に VirtualFree をつこうたらええんやて。 https://stackoverflow.com/questions/12121843/mapviewoffileex-valid-lpbaseaddress なんという泥臭い方法や……。 てなわけで、若干の面倒くさい手順が要るけどそれっぽいことは出来る。 この手順をいい感じに抽象化するクラスを作ったら色々と使えそうやな。 期待してるで! 普通にAPIで巨大ファイル作れてるけど CreateFile / WriteFile
最初からどでかいファイルを作る余裕があるならその方が簡単ではあるわな。 どんくらいデカいのがいるんや? せいぜい数十ギガとかそんなもんやろ? ケチらんと行くっちゅうのもアリや。
CreateFile WriteFile ReadFile SetFilePointerEx SetEndOfFile
こんな感じ? .... 0101 0000 0100 0101 0001 0100 0101 0110
STLコンテナ (仮にvとする) のサイズの分だけfor文を回したいってときに for(int i=0; i<v.size(); i++) と書くことが多いんだが、v.size()はintじゃないので警告が出る。 警告を一つ残らず潰したいタチだから毎回こういうのはintにキャストしてるんだが、キャストのコストってどんなもんなんだろ。 「大したことないからOK」って立場と「そもそもv.size()が毎回呼ばれてる時点でナンセンスだから改善すべき」って立場と「その警告は無視しなさい」って立場などがあると思うが、皆はどうしてる? 逆順にしたいことなどがよくあるので、範囲for文を使えってのは今回はナシで。 特定の環境、コードでのテストはできるが、一般論として、あるいは皆さんのスタンスとしてはどうですか。
コンパイルの警告のためだけだから 実行時コストは0じゃね
手でタイプするコストうんぬん言うなら マクロで #define LEN(s) ((int)s.size())
>>267 最も正統派なのはこうかな? for(decltype(v)::size_type i=0; i<v.size(); i++) 常識的に考えてコンテナの size_type が std::size_t より大きいことはあまりない (大抵は等しい) と思うので、面倒なときは std::size_t を使う。 本当に上限が限られていてその上限が変更されることがあり得ないほどそのプログラムにとって 本質的なものだと判断すれば int でいいやってこともあるといえばあるだろうし、 同じようなパターンが何度も現れるならアダプタを作った上で範囲forというのも考えられる。 状況によるでしょ。 int i = 0; と書かずに size_t i = 0; と書くのはどうだい? v.size() が本当に size_t を返すか、という問題はあるが。 for (decltype(v.size()) i = 0; i < v.size(); i++) と書くこともできるね。 i の型が int でないと不味いのかも知れんけど。
>>267 コスト(性能)最優先か 見やすさ最優先か タイプ数最優先か 次第 キャストのコストって言うけど intとv.size()のサイズが違えば どのみち型変換する コンテナ使うような場所でこんな微妙なコストを気にしてもしょうがないし >>270 は面倒 (業務外だと)私は警告放置が多い 警告を消したい場合はsize_tにするか コンパイラの設定を変えるか 業務で集団でのコーディングの場合は 他の部分を見て空気を読む for(unsigned int i=0, len=v.size(); i<len; i++) これもよく見るか
>>269 template <typename T> inline auto len(T s) { return s.size(); } >>274 その形が一番、速度的には良い。 forの第二式は毎回評価されるが、v.size()の部分をコンパイラが自動的に最適化するのは非常に難しい場合があるから。 v.size()の値が、ループ内で変化しない「ループ定数」であると判断するのは コンパイラにとってはものすごく難しい場合がある。 ループ定数であると判断された場合にのみ、>>274 のような最適化が行われる可能性が出てくるが、判定できなければループするたびに毎回評価されてしまうのでループの実行速度が遅くなってしまう。 >>283 本人だけが開発していて、記憶力が優れていて絶対に使い方を間違いなければ特に問題ないと思うが、使い方を間違うと危険なことがある。 エラーも出ずに変な動作をしてしまうことがある。 でもそれさえ気を付けていれば特に問題ないとも言える。 >>269 マクロで書く場合、 #define LEN(_s_) ((int)((_s_).size())) と書いたほうが良い。 特に、s や _s_ を()で囲むのは必須。 sを_s_と書くのは、ミスタイプがあった場合の備え。 例えば、マクロの仮引数にsと書いているのに、マクロの定義部分をtと 書き間違えていて、かつ、マクロを使う場所に t という変数がたまたま使われて いたとすれば、エラーにならないのに間違った動作をしてしまう。 _s_と書いていれば、_s_という変数は絶対に使われないのでこの心配がない。 そのため、マクロの引数は伝統的に、_s_などのように書くことが推奨されている。 皆さんありがとうごさいます。 結構難しいですね。 >>274 > for(unsigned int i=0, len=v.size(); i<len; i++) これは for(int i=0, len=(int)v.size(); i<len; i++) としても性能上そう変わらないですよね? ループ変数はintであってほしいと思うので、これが自分には向いているように思いました。 キャスト一回って機械語4つくらいじゃあないの? そこまでシビアってのは競技プログラミングか脳手術ロボットでも作ってんの?
糞コンパイラまで考えてパフォーマンスを考えると>>288 だけど そもそもコンテナ経由でアクセスする時点でそんな事は誤差 そのループに非常に時間がかかるなら ループ全体で最適化しないと >>290 同じBIT数やBIT数が少なくなる場合の整数型から整数型へのcastは、マシン語では0命令(命令が出力されない)。 高級言語では違う型でもマシン語レベルでは変わらないため。 BIT数が多くなる場合には、x86の場合は、movzx や movsx が使われる。 >>292 実際には、最適化が上手く行かないことも多いので差が出てくることは多い。 >>293 つまり、符号無しや符号付の区別はマシン語ではないので C/C++言語で castしても高級言語レベルでの意味が変わるだけでマシン語レベルでは 何の命令も増えることはない。 素直にrange-based-for これが出てきたことの影響のでかさがわかってないやつ多すぎ 禿4にはfor_eachを使う前にもっと適した関数を探せとあるが 本当にそうか自分の頭で考えろ
普通のコンパイラなら コンパイル単位内の関数は一緒に最適化するので .size() の中で値を返してるだけなら ループの外に追い出してくれる ターゲットがPCなら気にするな それよりv[i]の方が重い
未だindexループよりrange-basedのほうが早い処理系がない件 >>298 v[i]が重いってどんなstlコンテナだよ >>267 >警告を一つ残らず潰したいタチだから ここまでは同感です >毎回こういうのはintにキャストしてるんだが、 私なら int i を unsigned int i にしますが templete<typename T>auto LEN(const T& v)->signed T{return (signed T)v;}
とりあえず大きい方に合わせとけば間違いないんだからsize_tでいいじゃん そのvの要素が将来に渡って21億個を超えない保証がどこにある?
>>300 整数のキャストに比べればはるかに重い そのレベルを気にするなら生ポ >>304 vectorだと生ポと変わらんでしょ もちろん最適化前提で >>300 range-basedはiterator c++のiteratorはindexが速くなる連続アドレスのコンテナならpointerと同じコンパイル結果になる indexアクセスがpointerより遅くないなら、それはコンパイラの最適化のお陰 >>306 生ポと変わらなきゃ良いんだけど 変わるんだよ VisualStudioやチープなコンパイラだと いずれにしろここから先は 具体的な環境とループ回数やループの中身全体で考えないと意味がない なんせ1クロックレベルのことを気にしてるようなので 実はメモリアクセスが支配的で 他の最適化は全く意味がないとか SIMD命令 / DSP命令 / スレッド分け / GPU 他のループと合わせる / ループを分ける ループアンロール 依存性の削減 / 式変形 アルゴリズムの改善 キャッシュ化 / テーブル化 いろんな最適化がある
ところで元々の質問の >>267 は整数の型が合わないのどのくらい気にする? っていうのを「一般論として」聞いてるので、これに対しての選択肢を派閥系統樹形式にしてみた ├→ きちんと合わせる派 │ ├→ その環境で合ってれば良いよ派 (移植性は気にしない派) │ ├→ コンパイラの警告は潰す派 │ │ ├→ 理解しなくてもキャストで合わせるので十分派 │ │ └→ 警告される箇所は仕様の詳細を調べる派 │ └→ size_t とか size_type とか使え派 (言語仕様原理主義派) ├→ 問題がなければ気にしない派 │ ├→ 問題に気づかない派 (鈍感派) │ ├→ 実行コストに敏感派 │ │ ├→ 最適化はあてにする派 (モダン開発環境派) │ │ └→ 最適化はあてになんないよ派 │ │ ├→ 低レイヤ派 │ │ ├→ 老害派 │ │ ├→ 諦め派 │ │ └→ ベータ開発環境追いかけ派 │ └→ 状況と程度による派 (柔軟派) └→ えっ、それって駄目だったん? 派 ├→ 初心者派 └→ 無知派 >>278 業務外だと、とは書いてあるけど一応突っ込んでおくと もしそれがコンパイラの警告レベルを下げるとか小さい型へのキャストの警告を無くすとかなら それはバッドノウハウだよ、真似しないように じゃあ俺、えっ、それって駄目だったん? 派でお願いします。
>>311 わし、こうみえて「警告される箇所は仕様の詳細を調べる派」や その上で、問題なければ「状況と程度による派 (柔軟派)」に再度ブランチする派 Boostは警告を無視する派、GoogleはMicrosoftの問題なので修正する予定はない派。 ってことは、警告だしっぱなしで構わないって事では?
目grepが難しいので、警告は消すしかないんだけど。
変数の大きさが変わると同じ値のビット表現が変わるのはしんどいので、符号が一番右端にあったほうが良かったんじゃないの。 右端ならビット表現が変わらない。
型違い面倒だからautoにしても警告出るから何でやおもたらi=0でintだったでござる派
HTMLにしろコンパイラにしろ、Microsoft案のほうが合理的と思うけどな。 規格は政治だよね。
>>302 signed Tはできねえぞ std::make_signed_t<T>にしないと > コンパイラの警告は潰す派 キャストつーか、#pragmaを使ったりもするね もち、規格票で自分が悪いのかコンパイラのお節介かはっきりさせてからだけど
基本的にはsize_tとかsize_typeとか使え派 面倒でもちゃんとやった方が後のテストや検証は楽なんだよ まあ無理だったり異様に面倒だったりする場合も現実的にはあるからそこは仕方ないけど
i は int にしたいって言ってるんだから ここの型をsize()に合わせたら キャストが他に移るだけ
>>298 vがグローバルなオブジェクトである場合や、ヒープから確保されたオブジェクトの参照型である場合、コンパイラには v.size() がループ定数であるかどうかを判定するのは難しいことが多い。 このスレでもグローバルに確保された構造体型のメンバを参照する場合、最適化され無い事が指摘されていたが、それと同じことが原因。 C/C++ではポインタや参照があるのでグローバル変数やグローバルなオブジェクトのメンバ変数が変化しないことをコンパイラが見極めるのが難しい。 for(auto i=v.size()+1; 0<len; --i) for(auto i : my_range(v.size())
reverse_iterator first(v.end()), last(v.begin()); for_each(first, last, [](auto& x) { cout << x; });
64bit/32bitまたぎできるソース汎用性を考えれば、負の数が必要ないなら size_tを使うのが最善でしょ。
size_tはunsignedなのがうざい c言語初心者が決めただろこれ
ポインタ + size_t == ポインタ ポインタ - ポインタ == ptrdiff_t おかしいね
>>326 仮に毎回アクセスしたとしてもv[i]の方が重い 毎回アドレスを計算して毎回メモリアクセスするわけで ばかでかいループをたくさん作るなら 性能を心配した方が良い 中身にもよるが、ほぼメモリアクセス時間になりかねない 帯域の無駄遣い ループをまとめるとか細切れにするとか キャッシュを有効に使う処理にしないと キャストのコストとか完全に誤差
8086時代の苦しみを知っている人なら リニアでないポインタやインデックスが どんなにウザいものかよく知っている 64bit空間なら64bitを使っとけって悪いこと言わないから
ループの中身も知らないで良く言うね int変換必須なら問題点の場所を移動させただけ
今日日4GB越えとかWindowsNT4.0サービスパックですか、と。
納品したときに コンパイルで警告出るんですが消してって言われて それ無視して良い警告ですよって言っても 理解してもらえなかった派
あと警告が出ないからと言って 正しく動くと保証されている訳でもなんでもないのに
>>342 それはお前が悪い そんなんで納品するな 客先と同じビルド環境で警告対応しないのは落ち度だね。次の仕事なくなるでしょ。
>>333 BYTE v[数値]; のような生配列の場合、ループの中のv[i]は、最適化が効いてものすごく効率の良いコードになることが多い。 この場合、vがグローバルに確保されたオブジェクトや参照型であったとしても最適化には余り悪影響はない。 vがstd::vector 型の場合で、かつ、vがグローバル・オブジェクトや、参照型の場合は、コンパイラはv[i]を上手く最適化できないかもしれない。 >>346 すまん。 後半部分は勘違いかもしれない。 >>346 VCはvectorでも生ポインタに近い最適化はしてくれてるみたいだぞ 客や同僚から使えないプログラマ認定されていることに気づけず独りよがりな考えに凝り固まる人いるよね・・・ かわいそうではあるけど、かかわりたくないタイプの人。
標準ライブラリのコンテナのイテレータを sizeof で見ればわかるが、ほとんどの場合で void* と同じ大きさ。 要するにポインタ一個分の情報しかないし、実際ポインタが入ってるし、ポインタの操作になってる。 しいて言えば操作がメンバ関数経由になる分のコストはあるといえばあるけど、 それくらいのインライン展開はするのが普通でしょ。 vector の場合だと領域が連続する保証があるのでインライン展開だけでイテレータはポインタと同じになる。 VC のコンテナだとデバッグモードではイテレータが少し大きい (のと範囲チェックとかする) ってなことらしいんだが、 処理系をインストールしてないから試してない。
>>349 おまえがきちんとした仕様を提案できないで投げっぱにしてるからそんなことになってんじゃないの? >>340 64bit空間で64bit以外のインデックスを使うべきループの中身とやらを書かないあんたが悪い 書けないんじゃないのか? intだとたったの2G要素でオーバーフローして無限ループになるのが怖い
イテレータよりポインタのほうが速いよ。 ホントだよ。 いまベンチとってるから。 偶然だけど。
>>351 「無視して良い警告」とか勝手に判断する困ったPGにきちんと仕様を提案しても無駄でしょ。解雇するわ。 unsigned だと for(unsigned i = s.size(); --i >= 0; ){...} みたいなので警告出るんだっけ
警告で指摘された問題点に対処もせずに、キャストやらで無理やり消す位なら、出たまま放置の方が100倍マシ
ヒープ作るとき、マイナスの値は空きノードのリンクリストに使ったりするので、その手の比較は多発する。
うーん、近頃はちょっとした作法レベルのところまで警告として口出しすることがあるからなぁ。 完全に規格に沿って書いてるわ! ってときにはイラッとすることもある。 個別に警告オプションを設定するのも面倒くせぇし、直してしまう方が手っ取り早かったりもするんだけど、 何がなんでも警告をゼロにしろって言われたら警告レベルを低くする対処をしちゃうかも。
仕事ではやってんなら手を抜くなぼけ pragmaとかでなんとでもなるだろ
従来cppcheckなどの静的解析ツールが出していた警告をコンパイラも出すようになってくれたのは良い動き。 親切なコンパイラに感謝して警告箇所の修正をやればいい。 修正に工数がかかることが懸念されるなら、依頼主にその旨を伝えればいい。
>>360 俺はプログラミングについては趣味者だから実務のことは知らんのだわ。 すまんな。 しかしな、必要以上の品質にするくらいなら手抜きで安くしろって言う客の方が多いと思うぞ。 必要より下になったらあかんのでそこを制御していい感じの 手抜き具合にするのが難しいわけだが、そこを上手くやるのが 手抜きしないことよりもプロに必要な資質じゃね? 手抜きしないよりも適切に手を抜く、どうやって手抜きするか知っていることが大事だ。 仕事は経済的に割に合う形でしか継続できないんだからさ。 そりゃあいつも十全な仕事が出来る時間的・経済的余裕があるならうれしいが、 現実はそうではないだろ。 >>366 何言ってんだ? 手抜きしたいからこそ、コンパイラの警告に素直に従うんだぞ。 DirectX関連使ってるとenumよりenum classを優先しますという警告出るんだけど、ライブラリ変えるわけにもいかなく、どう対応するのが正解なんだろ?
そもそも警告って規格で定められている訳でもなく、コンパイラが独自の基準で勝手に出してくる物だからね mutableは悪だってconst付いてない変数全てに警告出すコンパイラとか出てきたらどうするんだろう
>>370 議論のための議論とか、言いがかりのような仮定の話に、いちいち付き合わないことが重要。 >>371 変な作法が追加されることなんて良くあるんだぞ。 今じゃ gcc や clang で -Wall オプションを付けたら a || b && c みたいな式にすら警告が出る。 優先順位を間違えやすいとこだから括弧で明示した方が良いんだと! 演算子の優先順位くらい把握しとるわ! こんなの警告されるようになると想像したことあったか? 他の演算子でも同様の警告を出すようになることくらいはあるかもしれんぞ? 確かに >>370 は極端な例ではあるが、ようわからんところでしょうもない警告が出るようになる かもしれんという懸念は無い話ではないぞ。 >>374 趣味でしかやってない人の意見なんて無視しろ、というが私の回答です。 >>379 ゲームのチートツールとか。 汎用的な便利なツールは色々とあるけど、個別のソフトをいじるには行き届かないこともあるので。 念のため言っとくけど買い切りの RPG かフリーゲームだけ。 ネットゲームはやってないよ。 ちなみにそのツールは公開してない。 その他に作った有用そうなものは公開してるんで、身バレするから言えない。 >>380 そうなんですか。 ずいぶん詳しいのに仕事じゃないというから不思議に思ってました。 つまり、はちみつ某は、なんの思い入れもない他人のソースを読まされる身になった経験が少ないわけか。
アルゴリズム考えるときは、図を必ず書くと思うんだけど、皆さんは何を使ってますか? いまは紙と鉛筆使ってるんだけど、探すの大変だから、ソフトに変えたい。
>>382 せやな。 そんなわけで、他人のバイナリを見る機会はあるけどソースはそれほどでもって感じかも。 結果的に読まなきゃならないことはあるけど、所詮は趣味だから嫌になったらいつでも止められるし、急がなくてもいいし。 プレッシャーに晒されながらクソみたいなソースを読むってことはない。 C++なんざ仕事で嫌々書かされるだけの言語だと思ったけど 趣味で使っちゃう子もおるんやな
>>383 曖昧なところから思考を整理するなら紙と鉛筆でいいと思うけど、 それなりに書式の整ったようにするなら PlantUML とか。 GUI で自由にってことなら Dynamic Draw くらいが手頃かもしれない。 完全な趣味目的でC++を触る変態はそうそういないと思う。
>>386 禿1読んで信者になった変態もおるんやで >>386 ゲームのチートとかするために 既存のプロセスに割り込んだりする処理を書こうと思うと C か C++ くらいしかまともな選択肢なくね? C で足りるなら C で済ませることもあるけど、もうちょっと高級なことがしたくなったら C++ ってのは妥当な選択肢というか、唯一解でしょ。 まあ近頃は Rust にも興味があるけど……。 カッコつけろって人 付ける付けないの基準はコンパイラの警告? 完全に優先順位を覚えてる人から見ると カッコが多いと見にくいんだよ a == 0 || b != 0 a * b + 1 *a[i] *a++ こんなのにカッコつけてたら えっ?何か意味があるの?って考えてしまう
> えっ?何か意味があるの? いや、「あーまた面倒くさいやつ来やがった」だよ
実務経験1年で月収80万稼げるエンジニアになった理由 VIDEO 意識が低いエンジニアこそフリーランスになれ VIDEO フリーランスエンジニアの週3労働ってどんな感じ? VIDEO ぼくがスキルのない社畜ならこうやって脱する VIDEO 初めて人を雇ったらもう二度とサラリーマンをやりたくないと思った話 VIDEO プログラミングは文系でも余裕で出来ます!理由を現役プログラマーが解説 VIDEO 貧乏人こそ社会不適合者 VIDEO 元ド貧乏が教える】貧乏を抜け出すための2つの考え方 VIDEO より良いオファー貰ってるのに転職しないとか何考えてるの? VIDEO 優先順位を完全に把握しているなら機能的には意味のない括弧だと理解しているんだろうが そのうえで疑問に思った「意味」って、どんなものを想定しているんだろう。 「優先順位を完全に把握していない人が間違えないように」くらいの意味しか思いつかないが。
(a + b + c) + (d + e) 同じ型の整数5個を足すのにこんなカッコが付いてたらどう思う?
同じ印象だって話 ちなみに、 わざわざ>>397 のようなカッコを付ける時はある 協業できない人があれこれC++について論じるのは害でしかない。
まずプログラム言語っての読み書きする人間のためにあるって大前提忘れてるか自覚してないやつ多いな
>>399 マイナスが混ざっているならわからんでもないが、>>393 で言っている優先順位の話とは関係ないように思うが? 主観で見やすい表記にする その為にコンパイラの警告を無視したり切ったりする 何も問題無い
>>374 > >>371 > 変な作法が追加されることなんて良くあるんだぞ。 > 今じゃ gcc や clang で -Wall オプションを付けたら > a || b && c > みたいな式にすら警告が出る。 > 優先順位を間違えやすいとこだから括弧で明示した方が良いんだと! > 演算子の優先順位くらい把握しとるわ! 把握してても間違えやすいからだと思うね 実際にはa,b,cには比較演算子を使った式が入ることが多いだろう そうするとけっこうな長さになったりする で全体の構造が見えにくくなる そりゃ書いてる真っ最中は問題ないさ しかし後から読んだときにすぐ理解できなかったり、手を加えるときに間違えたりする warningを出すべきかは議論の余地があると思うけど、 出すべきと考える理由はわかる それはエディタの機能でかっこを表示したら良いのでは。
主観は重要だろう。 重要でないなら全部アセンブラで書けや。 客観的には最も性能の出る言語だぞ。
&,|とか&&,||は*,+の関係と同じだから括弧つける方が冗長で分かりづらくなると思うんだが
一度書いた四則演算の数式を書き換えることはほとんどないけど、bool論理演算は頻繁に書き換えるでしょ。