C++相談室 part148at TECH
C++相談室 part148 - 暇つぶし2ch112:デフォルトの名無しさん
20/02/01 21:57:47 7G0Z2VlM.net
見てください皆さん、ID:BhmlSyWc ← ひどいですよ
まず何言ってるか分からない
このレベルはきついな

113:デフォルトの名無しさん
20/02/01 22:02:32 tav2AwxI.net
>>106
どの辺からgotoが危ない操作だと思うの?

114:デフォルトの名無しさん
20/02/01 22:06:43 vKrtBnhX.net
まあ1万行ある関数の中で、5千行目ぐらいにgotoがあって、ラベルが関数の先頭付近にあるとか、それに近いのは見たことあるが、あれはどう考えてもgotoの悪い例だからな
包丁で味噌汁食ってるようなもん

115:デフォルトの名無しさん
20/02/01 22:06:57 BhmlSyWc.net
>>110
きつくて気の毒だな
不勉強なやつは自業自得なので同情はしない

116:デフォルトの名無しさん
20/02/01 22:08:59 BhmlSyWc.net
>>112
1万行か・・・これ↓より重症だなw
URLリンク(www.pro.or.jp)

117:デフォルトの名無しさん
20/02/01 22:11:31 tav2AwxI.net
不定値や無限ループの危険はgotoに限ったことじゃないし
ループを抜けるgotoには関係ない話

goto特有の危険な場面
何を心配してるんだろう
酸っぱいブドウ?

118:デフォルトの名無しさん
20/02/01 22:16:09.36 TULylXcw.net
だめだこりゃ

119:デフォルトの名無しさん
20/02/01 22:19:01.58 7G0Z2VlM.net
gotoはどこへ飛ぶか分からないから読みにくいんだよ
前に飛ぶのか、後ろに飛ぶのか、それすら分からない
飛び先を分かりやすく改良したのがreturn、break、continue
それぞれ飛び先が決まっているから追うのが楽
その英知が分からんっていうならreturn、break、continueを使わずに
全部gotoでやれば?って話

120:デフォルトの名無しさん
20/02/01 22:22:45.11 tav2AwxI.net
関数なんてもっとどこに飛ぶかわからんぞ

121:デフォルトの名無しさん
20/02/01 22:25:22 tav2AwxI.net
どこに飛ぶかわかる名前にするってのが普通の発想
意味でも構造でも文章でも好きな名前を付けられる

関数も変数も名前空間も全てそう

122:デフォルトの名無しさん
20/02/01 22:25:32 TULylXcw.net
gotoは中にも飛べるの知らないんじゃないこの人

123:デフォルトの名無しさん
20/02/01 22:25:55 BhmlSyWc.net
>>117
飛び先じゃなく飛ぶこと自体の問題なんだがw

124:デフォルトの名無しさん
20/02/01 22:26:20 7G0Z2VlM.net
つまりはそういう話で、追いやすいように飛び先を制限したいよねーってのが根底に有って
(当然そういうのが念頭にあってreturn,break,continueは生まれたわけで、前例に倣いたい所)
それでブロックに名前を付けるだのbreak 2だのって書き込んでいる人がいるわけで
gotoでいいんじゃね?っていうなら、return,break,continueもgotoでいいんじゃね?
むしろforやwhileもgotoでいいんじゃね?gotoを正しく使えばいいんだろ?ってなる

125:デフォルトの名無しさん
20/02/01 22:26:36 TULylXcw.net
構造化プログラミング知らずにgotoいきって使うのはさすがにやばい

126:デフォルトの名無しさん
20/02/01 22:28:23 BhmlSyWc.net
>>122
どうなっていれば「追いやすい」のかを
まず明らかにしようぜ

俺ルールでもいいし
広く認知されているルールでもいいし

127:デフォルトの名無しさん
20/02/01 22:31:09 7G0Z2VlM.net
巻数はどこに飛ぶか分からないが、必ず元に戻ってくる(のが基本)
行きっぱなしというか、ただのジャンプのgotoやらbreakやらとは違うのだよ
関数のコールは入口と出口が一つになってて非常に構造化されてる好例
こういうところ分からないってのはセンスないよ

128:デフォルトの名無しさん
20/02/01 22:32:56 7G0Z2VlM.net
巻数→関数

129:デフォルトの名無しさん
20/02/01 22:35:10.84 tav2AwxI.net
使い所でgotoが使えないのはセンス無い
使い所でgptoを使わないのはコードが見にくい
使い所でgotoを使わないのは危険なコード
goto否定派にレベルを合わせた主張をするとこんな感じ

130:デフォルトの名無しさん
20/02/01 22:42:27.15 TULylXcw.net
やっぱりこいつダメだな
知性がない

131:デフォルトの名無しさん
20/02/01 22:44:49.19 tav2AwxI.net
使い所でgotoを使わないのは知性が無い

132:デフォルトの名無しさん
20/02/01 22:45:34.37 7G0Z2VlM.net
本心では誰もgotoは否定していないんじゃないかな
今は多段breakの機能が無いんだからgotoを使えばいいだろう
しかし、もしgotoを使わないで済む多段breakの新機能があったのなら
それを使ったほうがいいだろうし
じゃーその新機能はどんなものが考えられるか?って遊びだろ?
ブロックに名前付けるだとかbreak nだとかは

133:デフォルトの名無しさん
20/02/01 22:50:41.91 wBNP08tW.net
多段breakは考えた奴は脳味噌が糞すぐる…
ループの深さを変えたとたんにバグるじゃん?
ループの深さは金輪際変えないとか
ループの深さを変えるとき必ずループ全体を机上確認するとかだったら
gotoでも逝けるじゃん??

134:デフォルトの名無しさん
20/02/01 22:53:08.37 vKrtBnhX.net
ああ、そうだな
break 2だとfor文が3重になったときにバグるな
個人的には面白いと思ったが

135:デフォルトの名無しさん
20/02/01 22:53:40.31 tav2AwxI.net
使い所は2次元構造の2重ループとかだよ

136:デフォルトの名無しさん
20/02/01 22:55:40.65 rsRLlL5x.net
画像処理とかで2重ループ良く書くけど、最近2段階breakしたくなった記憶がないな
実は要らないんじゃね

137:デフォルトの名無しさん
20/02/01 22:56:47 tav2AwxI.net
じゃあbreakもいらないんじゃない?

138:デフォルトの名無しさん
20/02/01 22:59:11 7G0Z2VlM.net
まーC++がプリプロセッサを殺すために進化しているのと同様
Cはgotoを殺すために進化したともいえるわけで
たとえば、関数、for、return、などなど、制御構造にかかわるほとんどの物が
gotoを殺すために有るといってもよい
だから、もっとgotoを殺すにはどうすればよいか、考えるのは自然な発想かと

C++でもテンプレートなどで出来ないことはプリプロセッサでしなければならないし
ただ、同じことがテンプレートとかで出来るならそのほうが良いだろうし
もっとプリプロセッサを殺すためにはどういう機能を追加すればよいか考えるのは自然な事だろう

同じ同じ

139:◆QZaw55cn4c
20/02/01 23:01:32 EspH/Y2K.net
goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね
C/C++ の goto とかはどう頑張っても関数の中でだけしか跳べないのだから、BASIC の GOTO ほどにはスパゲッティ状態を招けないのではと考えます
無論、その関数が異様にデカければ別ですが、そんなデカい関数を書くほうが問題であって goto が問題なのではないかと

140:デフォルトの名無しさん
20/02/01 23:11:38.33 tav2AwxI.net
ループを抜ける為にだけ使われる変数を使ったループ抜け
世の中にはたくさんこういうコードがある
たくさんのコードを見る機会がある人なら
たくさん見たことがあるはず
gotoネガティブキャンペーンのせいだよ

141:デフォルトの名無しさん
20/02/01 23:11:46.92 JWECbGc7.net
>>136
gotoが使わないで済むように進化してくのは期待している。
ただ現状として、多重ループを抜ける場合みたいにgotoを使うのがシンプルで分かりやすいならば、毛嫌いしたり盲目的に原則振りかざすよりgoto使えばいいだけのことだと思うよ。

142:デフォルトの名無しさん
20/02/01 23:32:29 TULylXcw.net
>>138
お前ほんとに病気だな
多重ループ脱出でgotoが簡潔なのはみなわかってる
でもgotoは自由度が高すぎて構造を壊す可能性があるわけ
だから改善するとしたら何があるかという話をしてるだけであって
別にgoto禁止とかの話はしてない
好きなだけ使ってろよ
あと構造化プログラミングぐらい知っとけ

143:デフォルトの名無しさん
20/02/01 23:45:45.20 tav2AwxI.net
>>140
色々と違う

144:デフォルトの名無しさん
20/02/01 23:46:54.20 vKrtBnhX.net
for () {
break label;
} label;
for () {
for () {
break label1
} label2;
} label1;
こういう風にfor文のお尻にラベルを付けられるようにすれば局所化したgoto風のbreakが使えるのでは

145:デフォルトの名無しさん
20/02/01 23:48:30.11 tav2AwxI.net
for () {
goto label;
} label:;
for () {
for () {
goto label1;
} label2:;
} label1:;

146:デフォルトの名無しさん
20/02/01 23:49:00.26 tav2AwxI.net
今でも出来る

147:デフォルトの名無しさん
20/02/01 23:49:30.89 wBNP08tW.net
Pythonはループにラベルをつける手が使えた
と思った(幻覚でなければ

148:デフォルトの名無しさん
20/02/01 23:52:18.24 pUJoLXPw.net
またgotoの話になってんのかよ。。
だからいっそ禁止にと思ったが、それよりもさらにクソな構文の提案が出てたり。。
想定を超えた馬鹿どもばっかりじゃねーか。

149:デフォルトの名無しさん
20/02/01 23:54:48.66 tav2AwxI.net
無理に会話に入って来なくて良いよ

150:デフォルトの名無しさん
20/02/01 23:59:22.03 7G0Z2VlM.net
ただ、凝りに凝った複雑怪奇なテンプレートより
シンプルに作ったマクロの方が読みやすいって事例も当然あるだろうよ
てか、わりと、最近、残念ながらその傾向が・・・で、C++が嫌われる理由にも・・・
だからgotoを殺すのも上手くやらないとむしろ酷くなる
そこが腕の振るいどころで面白い部分でもあるし、言語作ってる連中もそんなことで頭いっぱい
変なゲーム性が有って、逆にそれがまたダメな部分でもあって
あと、妹大好き

151:デフォルトの名無しさん
20/02/02 00:17:33.29 rWwvB4I9.net
多段breakの使用頻度がそれほど多くないことを加味すれば
break n;方式が妥当だろうね
これだと2重ループを3重ループに書き換えたときにバグる、とか
意味不明なことを言ってる奴もいるが
それは1重ループをbreakで抜けてたのを2重ループに書き換えたらバグった
と言ってるのと同じであって、当たり前の話だし、今でも同じことだ
break n;が一番シンプルで妥当だと思うね

152:デフォルトの名無しさん
20/02/02 00:32:21 7b/FZYuN.net
breakの後にマジックナンバーを書くのが気に入らない
定数には意味のわかる名前を付けたい

153:デフォルトの名無しさん
20/02/02 00:33:00 rWwvB4I9.net
ただし、break n;のnの部分が変数でもOKとかなってたらかなりウザいが
そこはnは定数と定めたいね、でもC++の場合は定数と言っても・・・
複雑にしようと思えばいくらでも複雑にできるわなー
普通に使う分には問題ないかと
明日からbreak n;が入っても、たぶん誰も困らないし、混乱も起きないだろう
割のいい賭けだし、俺はアリだと思うね

154:デフォルトの名無しさん
20/02/02 00:33:32 7b/FZYuN.net
breakとbreak nが同じとか意味不明な主張をなさる御仁がいらっしゃるが
じゃあcontinueがcontinue nになったらどんな地獄が発生するか
考えてみたら良い

155:デフォルトの名無しさん
20/02/02 00:48:04.23 rWwvB4I9.net
別にcontinue n;
全然ありでしょ
これと同等の事を、何か別の方法でやるよりスマート
for(;;){
 bool do_continue = false;
 for(;;){
  if(...){ do_continue = true; break;}
 }
 if( do_continue ){ continue; }
}

for(;;){
 for(;;){
  if(...){ continue 2; }
 }
}

156:デフォルトの名無しさん
20/02/02 01:00:22.64 7b/FZYuN.net
do {
 do {
  ...
  if (cond) {
   continue 2;
  }
 } while (副作用の有る式1);
} while (副作用の有る式2);
とから?

157:デフォルトの名無しさん
20/02/02 01:03:23.27 0Gqmr542.net
break nなんてやるくらいならbreak label で抜けるループを明示的に指定したいな

ループにラベルをつけるとして、先頭では見づらくて邪魔だな

ループの末尾にラベルを付ければ見やすいけど、それだとlabelついたループを抜けると言うよりlabelの指す位置へのジャンプだな

なんだgotoでいいじゃん
個人的には breakto label という記法でループ出口に書いたラベルに飛べるとするのが分かりやすいと思うけど、こんなことに新しい予約語を導入するくらいならgotoで十分だと思う。

158:デフォルトの名無しさん
20/02/02 01:06:28.34 7b/FZYuN.net
break nが良いとか言ってる椰子は
ついでに行番号も復活してほしいと思っているに違いナス

159:デフォルトの名無しさん
20/02/02 01:15:40.31 rWwvB4I9.net
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(...);
これ以外の解釈ってのは難しい

160:デフォルトの名無しさん
20/02/02 02:23:51 93obPCeA.net
gotoの話題って今でもこんなに盛り上がるのか

161:デフォルトの名無しさん
20/02/02 02:49:52.74 LC7cWz9a.net
老害が多いから

162:デフォルトの名無しさん
20/02/02 03:26:54 EDNK6zQt.net
そういう機能要望みたいなのここでやる意味ある?
C++Slackでやった方がよくない?

163:デフォルトの名無しさん
20/02/02 03:45:22 mzCY/+E0.net
英語は敷居が高いよ。

164:デフォルトの名無しさん
20/02/02 05:06:46.10 DTIMfhpJ.net
         ,,-―--、
        |:::::::::::::;;;ノ 
        |::::::::::( 」 <もう構造化は破綻してるんだからおとなしく goto しとけよな!
        ノノノ ヽ_l  
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬    |

165:デフォルトの名無しさん
20/02/02 06:40:45 mzCY/+E0.net
じゃあswitchも要らないって事じゃないか。

166:◆QZaw55cn4c
20/02/02 06:51:18 9jRHEnns.net
>>149
break n なんて間抜けの極みだと思いますね
java にはラベル付き break が存在して、ほとんど goto です URLリンク(www.sejuku.net)

167:デフォルトの名無しさん
20/02/02 07:37:33 SWo7Ruqh


168:.net



169:デフォルトの名無しさん
20/02/02 07:44:05 pBPOCWQ5.net
結論が先にあって理由が後付けだから支離滅裂、一貫性の欠片もない事を書く
もはや宗教

170:デフォルトの名無しさん
20/02/02 07:46:45 SWo7Ruqh.net
ほんと、宗教だね
洗脳されてるやつは強固に思考停止していて
何を言おうが馬の耳に念仏だ

171:デフォルトの名無しさん
20/02/02 08:06:14 SWo7Ruqh.net
>>159
根底がわかってねえやつが多いからだよ
古典的な基本がわかってねえやつは若造と爺のどっちに多いだろうね
頓珍漢なことを書いて袋叩きにされたからって逆恨みする精神性なやつはどっちに多いだろうね

172:デフォルトの名無しさん
20/02/02 08:18:25 9aZda2U6.net
break labelでいいんじゃね
gotoと同じだが、labelがbreak的な位置にない場合コンパイルエラーになれば良い

173:デフォルトの名無しさん
20/02/02 08:27:24 DTIMfhpJ.net
label貼るくらいならgoto使う

174:デフォルトの名無しさん
20/02/02 09:22:07 mzCY/+E0.net
gotoは便利なswitchだからね。
便利すぎるわこれ。
これからも積極的に使っていこうと思います。

175:デフォルトの名無しさん
20/02/02 09:40:59.69 7b/FZYuN.net
さすがにgotoでジャンプテーブル化の最適化までやる処理系は
まれだと思う

176:デフォルトの名無しさん
20/02/02 09:43:27.45 mzCY/+E0.net
アドレス直接指定なのに、テーブル必要ないんじゃないの。
テーブル必要ない分、switchより有利なんじゃないかと思いました。

177:デフォルトの名無しさん
20/02/02 09:51:12.60 7b/FZYuN.net
(条件分岐無しの素のgotoだけでどうやってswitchの便利な代替品にするつもりなのやら…

178:デフォルトの名無しさん
20/02/02 09:53:50.90 mzCY/+E0.net
頑張ってひねり出した!!
けどウンコにしか見えない。
納得できるものを頼む。

179:デフォルトの名無しさん
20/02/02 09:55:31.36 0Gqmr542.net
>>175
お前が何をいってるのか、何を考えてるのか理解できないのに、お前を納得させられる奴なんていないぞw

180:デフォルトの名無しさん
20/02/02 10:10:20.38 o79zkFFu.net
お尻にラベルつけて break ラベル; がいいとか言ってる奴は構造化の意味がわかってなさ過ぎ
ラベルは飛び先じゃなくてループに付けて break ラベル; でそのループから抜けるんだよ
なので break ラベル が使える言語はたいていループの頭にラベルをつけるようになってる
あと break レベル数 とか言ってる老害は早く滅びろ

181:デフォルトの名無しさん
20/02/02 10:28:45.43 DTIMfhpJ.net
名前使うならこんな感じか
void main(){
auto scope1 {
for(;;){
 for(){
  break scope1;
 }
}
}

182:デフォルトの名無しさん
20/02/02 10:29:18.43 mzCY/+E0.net
>>176
俺自身何を言っているのかよくわからないのだが。

183:デフォルトの名無しさん
20/02/02 10:31:44.19 DTIMfhpJ.net
もしくは、forの直後
void main(){
for(;;)scope1{
 for(;;){
  break scope1;
 }
}
}

184:デフォルトの名無しさん
20/02/02 10:58:10 MNdu0823.net
void main()の時点で読む気失せた

185:デフォルトの名無しさん
20/02/02 11:16:46.30 DTIMfhpJ.net
んだこんにゃろ

186:デフォルトの名無しさん
20/02/02 11:22:39.21 D8WvcGqJ.net
ループの先頭にラベルを書くくらいなら
gotoの方が分かりやすい

187:デフォルトの名無しさん
20/02/02 11:25:45 mzCY/+E0.net
あの、スレとは全然関係ないんだけど。
Boostでデバッグとリリース判別するマクロってありますか?
イテレータを1億回ほど回すのでデバッグだけテストを迂回したいんですが。

188:デフォルトの名無しさん
20/02/02 11:30:31.96 9aZda2U6.net
なぜboost?

189:デフォルトの名無しさん
20/02/02 11:34:47.86 mzCY/+E0.net
NDEBUGを知らなかったからです。
おまえらおせーよ。

190:デフォルトの名無しさん
20/02/02 11:39:04.55 SWo7Ruqh.net
NDEBUGってISO/IEC9899やん
おまえさんがboostっていうから
レスポンス鈍かったんだよ

191:デフォルトの名無しさん
20/02/02 11:48:10 mzCY/+E0.net
だよね。
そうだと思いました。

192:デフォルトの名無しさん
20/02/02 11:49:31 mzCY/+E0.net
今度からはよく考えて質問しようと思います。

193:デフォルトの名無しさん
20/02/02 14:38:02 rWwvB4I9.net
今の一重ループを抜けるときの普通のbreakにはラベルを付けないのに
多重ループを抜けるためのbreakにはラベルが無いと読みにくくなるっていう
発想というか対称性というか整合性というか必然性が全く見えないんだが
今ラベル無しの一重breakで誰も発狂することもなく普通に使えているのに
多重breakになった瞬間にラベルが無きゃダメってなるのはなんか弱い
同じことを二回書いたけども
ラベル無しでも別に普通に読めるでしょ、今まで読めてるんだから
大体ラベル付けるんならgotoと手間自体は変わりないしな

194:デフォルトの名無しさん
20/02/02 14:40:18 mzCY/+E0.net
今多発今多動ラ大
読み解けなかった。

195:デフォルトの名無しさん
20/02/02 14:41:51 gkoi3ncl.net
>>190
同意

196:デフォルトの名無しさん
20/02/02 14:43:14 mzCY/+E0.net
え、わかるんだ。
すげー。

197:デフォルトの名無しさん
20/02/02 14:47:27 gXxB23XL.net
下方向にだけ飛べるgoto相当機能があればgotoは要らなくなるんじゃない?

198:デフォルトの名無しさん
20/02/02 14:53:57 7b/FZYuN.net
>>190は、Cにgoto <label>とbreakがあるのになぜCはbreak nを設けるところまで踏み込まなかったのか、とか
break <n>で即値<n>に行き当たったコード閲覧者が行き先を知るために何をせねばならないかとか、
考えた方が良いので
は…

199:デフォルトの名無しさん
20/02/02 14:55:47 0Gqmr542.net
>>190
break nを勧めている人?
対象が1段なのと複数段とでは大きなギャップがあるでしょ。単純に対称性があると言えるものではないと思う。
ラベルつけるならgotoと手間が変わらないというのは同意。ただ、重要なのは手間が減ることではなく、複数段のループの外に出ることが明示されることだから、gotoと意味が混同されず同じ程度の手間でできる記法があるならそれは嬉しい。

200:デフォルトの名無しさん
20/02/02 14:56:57 EDNK6zQt.net
現実のC++について話せ
ここで新機能の導入について議論しても無駄だ
フォーラムでやれ

201:デフォルトの名無しさん
20/02/02 14:57:45 gkoi3ncl.net
手間が減ることは重要だよ
ラベル名を考える手間をかけて良いならgotoで良い

202:デフォルトの名無しさん
20/02/02 15:01:24.88 rWwvB4I9.net
大体だよ、多重ループはbreakで抜けれないので、仕方なくgoto使うときの
そのgotoを使う都合で必要になった、そのラベルをだよ
じゃーブロックにラベルをつけましょう、ってなんでそーなんだよ
元々のbreakにはラベルなんかねーのに
breakにラベルが無くて混乱したやつ居るか?
ご飯が無いからパンを食べてた状況なのに
すり替わってパンありきになって、パンが無きゃ話にならないとか言い出す始末
別にパン(ラベル)なんかなくても、ご飯があるならご飯食べろよ
ラヘルラベルって、そのラベルがどこ由来か考えてみろよ、gotoだろ?
もう一度言うが、もともとのbreakにはラベルなんかないし、それでみんな普通に過ごせてるし、混乱も起きてない
ただ、gotoで抜けるためには文法上/機能上ラベルが必要だったねってだけで、そこに着目しても仕方がない
本質的には無くても別に困らない

203:デフォルトの名無しさん
20/02/02 15:05:16.61 jVWLSRwc.net
ソースコードチェック目的でプログラム読むとき、gotoが出てきたら
そのgotoの使用方法が問題ないものなのか、いちいちチェックしないといけない。
breakならループ抜けるという意図が明白なので、チェックしなくてよい。

204:デフォルトの名無しさん
20/02/02 15:11:47.92 rWwvB4I9.net
そんなに名前が無いと発狂するんならもうgoto使えば?って思うし
なんなら関数化して正式に名前付ければって思うし
そこまでしたくないってときにbreak nが便利なわけだ
やりたいことは「多重ループから抜けたい」であって
「名前を付けたい」ではない!!

205:デフォルトの名無しさん
20/02/02 15:11:53.90 gkoi3ncl.net
関数コールも問題のないコールかどうかチェックしないといけないから
使わない方が良い

206:デフォルトの名無しさん
20/02/02 15:14:22.99 EDNK6zQt.net
それならもうポインタもグローバル変数もマルチスレッドも大量のチェックが必要だから使ってはいけないってことで

207:
20/02/02 15:14:36.78 Rn0kkYyt.net
>>199
私と認識が似ていますね
>>137
>goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね



208: >>164 java にはラベル付き break が存在して、ほとんど goto です https://www.sejuku.net/blog/20100



209:デフォルトの名無しさん
20/02/02 15:15:16.61 7b/FZYuN.net
現行のC/C++にはgoto <label>がある一方、break <n>は無い
もしbreak <n>の追加がgoto <label>の実装より難しかったからやらなかったのだとしたら、
break <n>の飛び先がgoto <label>の飛び先より簡単にワカルから優れているという主張は根拠を失う
break <n>はわかりにくいか、さもなくばgoto <label>と同等なんである

210:デフォルトの名無しさん
20/02/02 15:16:38.00 mzCY/+E0.net
constがスレッドセーフなのも困った。

211:デフォルトの名無しさん
20/02/02 15:24:46.36 jpTipLln.net
>>201
現実ありえないのは重々承知したうえで書くけど
100重ループを脱出するとき数を数えたくないだろうなって思うじゃん
ほかにも3重ループとかで2ndと3rdのループから共通の脱出先ラベルにもできるわけじゃん
文法を拡張する前提ならそこまで想定すべきだと思うね
粗野な即値の数字じゃなくて意味ごとに名前をつけられるようにしてきたのが
プログラミング言語の進化の歴史なのでおれは自然だと思うよ
というかそういう観点からラベル付きbreakというのは他の言語にはあるわけで
で今話してるのはもっと書きやすく読みやすくできないかというトピックでしょ
break Nは使えるだろうけど洗練されてない感じ

212:デフォルトの名無しさん
20/02/02 15:27:11.67 gkoi3ncl.net
break [n] はラベル名を考えなくて良い利点がある
使えるなら使いたい
ラベル名を考える必要があるならgotoで良い
ループの先頭で名前を付けるのはgotoより見づらいから使わない

213:デフォルトの名無しさん
20/02/02 16:01:27 o79zkFFu.net
break n とか言ってる奴は何故か>>150をスルーしてて笑うわ

214:デフォルトの名無しさん
20/02/02 16:07:52 nz0OxFB3.net
他の人は「マジックナンバー」だと思わなかったからでは。

215:デフォルトの名無しさん
20/02/02 16:20:03 gXxB23XL.net
foobarやhogeを超える人気なダミー文字列を考えたほうがよほど建設的だぞ、君たち。

216:デフォルトの名無しさん
20/02/02 16:35:55 SWo7Ruqh.net
break 5; //C
GOTO 5 : REM BASIC

217:デフォルトの名無しさん
20/02/02 16:37:04 gkoi3ncl.net
マジックナンバーがイヤなら
break break;

218:デフォルトの名無しさん
20/02/02 16:50:03 DTIMfhpJ.net
関数で置き換える
引数がめんどうならラムダで置き換える
returnが多重breakの代わりになる

219:デフォルトの名無しさん
20/02/02 16:58:55 SWo7Ruqh.net
>>214
多重ループを単一関数に書くって前提だね

220:デフォルトの名無しさん
20/02/02 17:03:09 7b/FZYuN.net
>引数がめんどうならラムダで置き換える ←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()は引数がぞろぞろ並ばねばならない

221:デフォルトの名無しさん
20/02/02 17:05:11 +9zyTEwm.net
>>216
>>75

222:デフォルトの名無しさん
20/02/02 17:06:58 7b/FZYuN.net
>>217
左様
それがラムダ式を適用して解決づべき適切な場合である(キリ

223:デフォルトの名無しさん
20/02/02 17:15:36 SWo7Ruqh.net
ジーオーティーオーというスペルでなければ
制御構造はそのままでいいと言うクソ論法

224:デフォルトの名無しさん
20/02/02 17:52:12 mzCY/+E0.net
スレとはあまり関係ないんだけど、nodiscard属性を無視するにはどうしたらいいですか?

225:デフォルトの名無しさん
20/02/02 17:59:47 MNdu0823.net
変数で受けといてその変数をガン無視すればいいんじゃないの
未使用変数の警告出るだろうけど

226:デフォルトの名無しさん
20/02/02 18:00:14 mzCY/+E0.net
やってみます。
アリガト。

227:デフォルトの名無しさん
20/02/02 18:11:02 o79zkFFu.net
>>210
お前の言う「他の人」はマジックナンバーの意味わかってないってことか?
このスレ見てたらありえなくもないかと思えてきたわw

228:デフォルトの名無しさん
20/02/02 18:13:54 mzCY/+E0.net
あと三日くらいしたらお前より出来るようになってるから。

229:デフォルトの名無しさん
20/02/02 18:24:38 jpTipLln.net
>>220
(void)func();

230:デフォルトの名無しさん
20/02/02 18:28:22 x1m+isRG.net
>>208
昔のBASICは、行番号を勝手に付けてくれていたのでgotoでもラベル名を考えなくて済んだのでとても便利だった。

231:デフォルトの名無しさん
20/02/02 18:30:04 x1m+isRG.net
>>226
なお、アセンブラでは行番号がなかったのでラベル名を考える必要があったが、
意味のあるラベル名を考え出すのは大変だったので、分かり易い場所以外は、
多くの人が、lab1: lab2: lab3: のような連番を使う傾向があった。

232:デフォルトの名無しさん
20/02/02 18:30:14 mzCY/+E0.net
>>225
メモっときます。
ありがと。

233:◆QZaw55cn4c
20/02/02 18:31:42 Rn0kkYyt.net
>>226
>昔のBASICは、行番号を勝手に
auto 文だったかな…

234:デフォルトの名無しさん
20/02/02 19:36:27.12 7b/FZYuN.net
VB6には行番号は無かった

235:デフォルトの名無しさん
20/02/02 20:26:55 GV9CDSqK.net
みんなってc++で何を作ってるの?
ゲーム?

236:デフォルトの名無しさん
20/02/02 21:07:54.17 YP+sfqkD.net
何も作ってないやつがほとんどだろ

237:デフォルトの名無しさん
20/02/02 21:15:29.52 GV9CDSqK.net
すまん俺の聞き方が悪かったのかもしれん
最近プログラミングの勉強始めて、各言語の用途とか調べたんだけど、ここでも一応聞いてみたかったの
何を作ってるって言うより、どんな開発に携わってるかっていうのを聞きたかった

238:デフォルトの名無しさん
20/02/02 21:21:43.96 DTIMfhpJ.net
テキストエディター
3Dモデラー
メーラー

239:デフォルトの名無しさん
20/02/02 21:25:09.08 vTjBAXNr.net
競技プログラミング

240:デフォルトの名無しさん
20/02/02 21:39:16 GV9CDSqK.net
アプリ開発にも使われるのかー
あざした

241:デフォルトの名無しさん
20/02/02 22:06:04 mzCY/+E0.net
いまダブルアレイやってる。

242:デフォルトの名無しさん
20/02/02 22:08:30 mzCY/+E0.net
検索はstd::setやstd::unorderd_setより速いけど、挿入が一桁遅い。
静的構築が速いというので、それもやってみたけど、2/3くらいにしかならなかった。

243:デフォルトの名無しさん
20/02/02 22:10:09 mzCY/+E0.net
検索はstd::setの10倍くらい早いな。

244:デフォルトの名無しさん
20/02/02 22:15:25 0Gqmr542.net
>>239
相談ができたらまた来い

245:デフォルトの名無しさん
20/02/02 22:54:22 mzCY/+E0.net
>>240
よろしくお願いします。

246:◆QZaw55cn4c
20/02/02 23:01:19 Rn0kkYyt.net
初学者的な質問です、よろしくお願いいたします。
バイナリーファイルを
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() とは独立でない、と推測しています

?この解釈で正しいですか?
?こういうのは、C++ iostream レファレンスのどこを見て洞察するべきなのでしょうか?

実際のお題は相変わらずエラトステネスのふるいです URLリンク(ideone.com)

247:
20/02/02 23:18:14.73 Rn0kkYyt.net
>>231,233
私は今のところエラトステネスの篩にご執心、という体たらくです…

248:デフォルトの名無しさん
20/02/03 00:01:01 8riGTZSm.net
エラトステネスのふるいで
なんでファイルのリードが必要?

249:◆QZaw55cn4c
20/02/03 00:22:49 X2PbBOAI.net
>>244
結構昔から
URLリンク(www.asahi-net.or.jp)
にとても興味を持っていたのです、二つの隣り合った素数の差を「素数のギャップ」と呼ぶことにしたとき、

『素数のギャップが取りうる値の頻度。はじめは2、4が多いが、そのうち、6の方が多くなる。』
『6がチャンピオンの座を降りるのはいつか。』
『少なくとも 10^14 以下では6がトップであり、それ以降、いつ、6以外の数がトップになるかは、知られていない。』

10^14 までの数であっても全部、篩としてメモリに載せられないので、さてどうしたものかと思案中です、最終的には年スパンでずっと計算させ続けるのに耐えられるようにしたい、と

250:デフォルトの名無しさん
20/02/03 00:38:27 e9E2NTEb.net
その問題だけなら
2次キャッシュに収まるくらいに分けてふるえば速い
間隔も大して大きくならないので
ヒストグラムはオンメモリで済む

スレッドも簡単に分割出来るので
論理コア数と同じだけスレッドを作って回す

251:◆QZaw55cn4c
20/02/03 00:44:34 X2PbBOAI.net
>>246
コメントありがとうございます

>間隔も大して大きくならないのでヒストグラムはオンメモリで済む
確かに 10^10 まででも最大 354 というのには驚きました、案外密に分布しているんですね

>2次キャッシュに収まるくらいに分けてふるえば速い
constexpr unsigned int windowSize_Default = 30 * 5000000; はでかすぎ、ですか

いただいたアイディアは、どれも私には難易度が高いのですが、ぼちぼち書いていきます…

252:デフォルトの名無しさん
20/02/03 00:44:55 e9E2NTEb.net
AVXレジスタを使って小さな素数の倍数を消して
ビット命令で大きな素数の倍数を消す
大きな素数の倍数は210ずつ処理する

昔素数の数を数えるプログラムを書いたことがあって
記憶に残ってる範囲ではこんな感じ

253:デフォルトの名無しさん
20/02/03 00:55:53 jdU9ROmC.net
>>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の行番号も連動して変わる
仕組みです。

254:◆QZaw55cn4c
20/02/03 00:55:55 X2PbBOAI.net
>>248
コメントありがとうございます!

>大きな素数の倍数は210ずつ処理する
私は、2*3*5 = 30 でわりと満足していましたが、2*3*5*7=210 まで拡張されたのですか!?うーむ…

255:◆QZaw55cn4c
20/02/03 00:57:46 X2PbBOAI.net
>>249
mon に入って、プログラムタイトルのコメントの行番号を手打ちで全部 0 にする、とか…
どうでもいい話でごめんなさい…

256:デフォルトの名無しさん
20/02/03 01:52:57 YoBHNt10.net
素数は、6n ± 1 か。
6n + 1, 6n + 5 だけ

6n + 3 は、3の倍数だから、素数じゃない

257:252
20/02/03 01:58:12 YoBHNt10.net
A = 6n + 1, B = 6n + 5 とすると、

AA の並びなら、差は6
AB なら、4

BA なら、2
BB なら、6

A,B になる確率がランダムとすると、6 になる確率が2倍!

258:はちみつ餃子 ◆8X2XSCHEME
20/02/03 11:14:43 HBzF0G80.net
>>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 のラッピングとして実装することを想定したんじゃないかなぁ。

259:デフォルトの名無しさん
20/02/03 12:59:28 jOrmfTQL.net
>>250
ビット命令が48個続くだけ
それほど大変じゃない

今だともっと


260:良い命令があるかも



261:◆QZaw55cn4c
20/02/03 20:59:04 X2PbBOAI.net
>>254
コメントありがとうございます。いまいちよくわかっていない iostream. の全体像を掴めるよう、いただいたヒントも頼りに潜ってみます

>FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。

fseek() が 64bit オフセットならいいのですが
あるいは win32api::SetEndOfFile() のような、オフセットを指定して trunc する方法があればいいのですが
>>242 のバイナリファイルは単に uint64_t な素数を突っ込んでいるものですが、ある日末尾が中途半端にちょん切れてしまったのです…

262:デフォルトの名無しさん
20/02/03 21:17:59 Exvuz9nd.net
>>256
それファイルに書く必要ある?
仮想メモリ頼りにメモリでやれば?

263:はちみつ餃子 ◆8X2XSCHEME
20/02/03 21:26:54 HBzF0G80.net
>>256
巨大なファイルにちょくちょくシークしながらアクセスするなら
メモリマップトファイルを使った方が楽やで。

264:はちみつ餃子
20/02/03 22:20:22.51 HBzF0G80.net
>>256
ググってみたら iostream まわりの継承関係を表した図がすぐ見つかったわ。
URLリンク(www.ntu.edu.sg)
だけど継承関係の他にストリームがバッファとロケールを所有しているという関係もあるのが分かり難いかも。
cpprefjp の rdbuf の項目を見たらストリームのバッファを入れ替える例が載ってる。
URLリンク(cpprefjp.github.io)
本当に「入出力」を司っているのはバッファであって、
ストリームはそれに書式化の機能をかぶせている感じ。

265:◆QZaw55cn4c
20/02/05 22:01:06 uTOW/8lH.net
>>257
それはダメでした。win7, 16GB、素数の大きさが10^11 程度でスラッシングが発生して win7 では使い物になりません
GIMPS cli のように、普段は意識することなく3年くらいかけて計算するようにしたいです

>>258
着々と容量が増加するファイルに対して mmap は使えるのですか?win32api::CreateFileMapping では mmap を確立した後にファイルサイズを増やしてはいけない制限がありました

266:デフォルトの名無しさん
20/02/05 22:31:00 zWcxLf4u.net
最初から最大ファイルサイズにしとくとか

267:はちみつ餃子 ◆8X2XSCHEME
20/02/05 22:32:01 85RuEno5.net
>>260
そんな制限があるんか。

連続した巨大なメモリを予約しておいて、
適当な大きさに区切ってファイルにマッピングすればええで。
ファイルを複数に分けることになるけど、
見かけ上は巨大なメモリとして扱えるし、
容量が増加する都度に新しいファイルを作って割り当てればええ。

というやり方を思いついたので具体的に出来るんかいなと思って調べてみたら
MapViewOfFileEx の最後の要素でアドレスを指定する機能がある。
VirtualAlloc で予約した範囲は MapViewOfFileEx で使えないので、
どうやって空いているメモリ空間を探せばええんやろと思ったら
VirtualAlloc で予約した直後に VirtualFree をつこうたらええんやて。
URLリンク(stackoverflow.com)
なんという泥臭い方法や……。

てなわけで、若干の面倒くさい手順が要るけどそれっぽいことは出来る。
この手順をいい感じに抽象化するクラスを作ったら色々と使えそうやな。
期待してるで!

268:デフォルトの名無しさん
20/02/05 22:35:23 bIRSo9XQ.net
普通にAPIで巨大ファイル作れてるけど
CreateFile / WriteFile

269:はちみつ餃子 ◆8X2XSCHEME
20/02/05 22:50:53 85RuEno5.net
最初からどでかいファイルを作る余裕があるならその方が簡単で


270:はあるわな。 どんくらいデカいのがいるんや? せいぜい数十ギガとかそんなもんやろ? ケチらんと行くっちゅうのもアリや。



271:デフォルトの名無しさん
20/02/05 23:33:50.77 bIRSo9XQ.net
CreateFile
WriteFile
ReadFile
SetFilePointerEx
SetEndOfFile

272:デフォルトの名無しさん
20/02/06 13:03:55.59 sNihMBVC.net
こんな感じ?
.... 0101 0000 0100 0101 0001 0100 0101 0110

273:デフォルトの名無しさん
20/02/06 16:50:43 zCd4f5nI.net
STLコンテナ (仮にvとする) のサイズの分だけfor文を回したいってときに
for(int i=0; i<v.size(); i++)
と書くことが多いんだが、v.size()はintじゃないので警告が出る。

警告を一つ残らず潰したいタチだから毎回こういうのはintにキャストしてるんだが、キャストのコストってどんなもんなんだろ。
「大したことないからOK」って立場と「そもそもv.size()が毎回呼ばれてる時点でナンセンスだから改善すべき」って立場と「その警告は無視しなさい」って立場などがあると思うが、皆はどうしてる?
逆順にしたいことなどがよくあるので、範囲for文を使えってのは今回はナシで。

特定の環境、コードでのテストはできるが、一般論として、あるいは皆さんのスタンスとしてはどうですか。

274:デフォルトの名無しさん
20/02/06 17:11:56 v+RXRHu+.net
コンパイルの警告のためだけだから
実行時コストは0じゃね

275:デフォルトの名無しさん
20/02/06 17:13:00 v+RXRHu+.net
手でタイプするコストうんぬん言うなら
マクロで #define LEN(s) ((int)s.size())

276:はちみつ餃子 ◆8X2XSCHEME
20/02/06 17:18:31 jSrTrJa0.net
>>267
最も正統派なのはこうかな?
for(decltype(v)::size_type i=0; i<v.size(); i++)
常識的に考えてコンテナの size_type が std::size_t より大きいことはあまりない (大抵は等しい) と思うので、面倒なときは std::size_t を使う。

本当に上限が限られていてその上限が変更されることがあり得ないほどそのプログラムにとって
本質的なものだと判断すれば int でいいやってこともあるといえばあるだろうし、
同じようなパターンが何度も現れるならアダプタを作った上で範囲forというのも考えられる。

状況によるでしょ。

277:デフォルトの名無しさん
20/02/06 17:24:46 2fVM4odH.net
int i = 0; と書かずに size_t i = 0; と書くのはどうだい?
v.size() が本当に size_t を返すか、という問題はあるが。

for (decltype(v.size()) i = 0; i < v.size(); i++)
と書くこともできるね。

i の型が int でないと不味いのかも知れんけど。

278:デフォルトの名無しさん
20/02/06 17:39:05 /W9iMVJD.net
>>267
コスト(性能)最優先か
見やすさ最優先か
タイプ数最優先か
次第

キャストのコストって言うけど
intとv.size()のサイズが違えば
どのみち型変換する

コンテナ使うような場所でこんな微妙なコストを気にしてもしょうがないし
>>270は面倒

(業務外だと)私は警告放置が多い
警告を消したい場合はsize_tにするか
コンパイラの設定を変えるか

業務で集団でのコーディングの場合は
他の部分を見て空気を読む

279:デフォルトの名無しさん
20/02/06 17:43:47 /W9iMVJD.net
>>269は色々な理由で無い

280:デフォルトの名無しさん
20/02/06 17:44:41 v+RXRHu+.net
for(unsigned int i=0, len=v.size(); i<len; i++)
これもよく見るか

281:デフォルトの名無しさん
20/02/06 17:46:58 5ihPHl5F.net
auto i=0uにしてるな

282:デフォルトの名無しさん
20/02/06 17:48:08 VEO7DUBt.net
>>269
template <typename T> inline auto len(T s) { return s.size(); }

283:デフォルトの名無しさん
20/02/06 17:48:51 VEO7DUBt.net
あ、右辺値参照わすれたw わりーわりー

284:デフォルトの名無しさん
20/02/06 17:49:18 /W9iMVJD.net
警告を消す為だけなら設定を変えるのが良い

285:デフォルトの名無しさん
20/02/06 17:50:35 /W9iMVJD.net
>>276



286:何の解決にもなってない



287:はちみつ餃子 ◆8X2XSCHEME
20/02/06 17:54:27 jSrTrJa0.net
>>279
良くはないがマクロよりはマシ

288:デフォルトの名無しさん
20/02/06 18:09:13 3IyMYliq.net
>>274
その形が一番、速度的には良い。
forの第二式は毎回評価されるが、v.size()の部分をコンパイラが自動的に最適化するのは非常に難しい場合があるから。

289:デフォルトの名無しさん
20/02/06 18:11:29 3IyMYliq.net
v.size()の値が、ループ内で変化しない「ループ定数」であると判断するのは
コンパイラにとってはものすごく難しい場合がある。
ループ定数であると判断された場合にのみ、>>274のような最適化が行われる可能性が出てくるが、判定できなければループするたびに毎回評価されてしまうのでループの実行速度が遅くなってしまう。

290:デフォルトの名無しさん
20/02/06 18:30:55 F7wYIGq0.net
マクロってそんなに危険なんですか。

291:デフォルトの名無しさん
20/02/06 18:33:27 3IyMYliq.net
>>283
本人だけが開発していて、記憶力が優れていて絶対に使い方を間違いなければ特に問題ないと思うが、使い方を間違うと危険なことがある。
エラーも出ずに変な動作をしてしまうことがある。
でもそれさえ気を付けていれば特に問題ないとも言える。

292:デフォルトの名無しさん
20/02/06 18:37:31 3IyMYliq.net
>>269
マクロで書く場合、
#define LEN(_s_) ((int)((_s_).size()))
と書いたほうが良い。
特に、s や _s_ を()で囲むのは必須。
sを_s_と書くのは、ミスタイプがあった場合の備え。
例えば、マクロの仮引数にsと書いているのに、マクロの定義部分をtと
書き間違えていて、かつ、マクロを使う場所に t という変数がたまたま使われて
いたとすれば、エラーにならないのに間違った動作をしてしまう。
_s_と書いていれば、_s_という変数は絶対に使われないのでこの心配がない。
そのため、マクロの引数は伝統的に、_s_などのように書くことが推奨されている。

293:デフォルトの名無しさん
20/02/06 18:50:57 v+RXRHu+.net
バッドノウハウ紹介乙

>>285
>>276

294:デフォルトの名無しさん
20/02/06 19:30:05 /W9iMVJD.net
>>280
適してるかどうかはともかく
>>269は解決にはなってる
>>276は解決になってない

295:デフォルトの名無しさん
20/02/06 19:38:40 zCd4f5nI.net
皆さんありがとうごさいます。
結構難しいですね。

>>274
> for(unsigned int i=0, len=v.size(); i<len; i++)
これは
for(int i=0, len=(int)v.size(); i<len; i++)
としても性能上そう変わらないですよね?
ループ変数はintであってほしいと思うので、これが自分には向いているように思いました。

296:デフォルトの名無しさん
20/02/06 19:42:58 bk3hpXlE.net
>>275に一票

297:デフォルトの名無しさん
20/02/06 20:10:32 9e+8kNR/.net
キャスト一回って機械語4つくらいじゃあないの?
そこまでシビアってのは競技プログラミングか脳手術ロボットでも作ってんの?

298:デフォルトの名無しさん
20/02/06 20:24:03 /W9iMVJD.net
4個もいらん

299:デフォルトの名無しさん
20/02/06 20:29:38 /W9iMVJD.net
糞コンパイラまで考えてパフォーマンスを考えると>>288だけど
そもそもコンテナ経由でアクセスする時点でそんな事は誤差

そのループに非常に時間がかかるなら
ループ全体で最適化しないと

300:デフォルトの名無しさん
20/02/06 20:40:31 3IyMYliq.net
>>290
同じBIT数やBIT数が少なくなる場合の整数型から整数型へのcastは、マシン語では0命令(命令が出力されない)。
高級言語では違う型でもマシン語レベルでは変わらないため。
BIT数が多くなる場合には、x86の場合は、movzx や movsx が使われる。

301:デフォルトの名無しさん
20/02/06 20:41:12 3IyMYliq.net
>>292
実際には、最適化が上手く行かないことも多いので差が出てくることは多い。

302:デフォルトの名無しさん
20/02/06 20:42:39 3IyMYliq.net
>>293
つまり、符号無しや符号付の区別はマシン語ではないので C/C++言語で
castしても高級言語レベルでの意味が変わるだけでマシン語レベルでは
何の命令も増えることはない。

303:デフォルトの名無しさん
20/02/06 20:49:08.28 VEO7DUBt.net
素直にrange-based-for
これが出てきたことの影響のでかさがわかってないやつ多すぎ
禿4にはfor_eachを使う前にもっと適した関数を探せとあるが
本当にそうか自分の頭で考えろ

304:デフォルトの名無しさん
20/02/06 20:56:38 /W9iMVJD.net
コストを気にしてる人に対してトンチンカン

305:デフォルトの名無しさん
20/02/06 21:03:18 /W9iMVJD.net
普通のコンパイラなら
コンパイル単位内の関数は一緒に最適化するので
.size() の中で値を返してるだけなら
ループの外に追い出してくれる
ターゲットがPCなら気にするな

それよりv[i]の方が重い

306:デフォルトの名無しさん
20/02/06 21:03:40 VEO7DUBt.net
何もわかってねえやつ

307:デフォルトの名無しさん
20/02/06 21:17:40 X3a4Tx/S.net
未だindexループよりrange-basedのほうが早い処理系がない件

>>298
v[i]が重いってどんなstlコンテナだよ

308:◆QZaw55cn4c
20/02/06 22:12:04 6P0xXhLK.net
>>267
>警告を一つ残らず潰したいタチだから
ここまでは同感です

>毎回こういうのはintにキャストしてるんだが、
私なら int i を unsigned int i にしますが

309:デフォルトの名無しさん
20/02/06 22:16:59 cE8ku0Th.net
templete<typename T>auto LEN(const T& v)->signed T{return (signed T)v;}

310:デフォルトの名無しさん
20/02/06 22:22:15 j/UITOXa.net
とりあえず大きい方に合わせとけば間違いないんだからsize_tでいいじゃん
そのvの要素が将来に渡って21億個を超えない保証がどこにある?

311:デフォルトの名無しさん
20/02/06 22:45:07.03 /W9iMVJD.net
>>300
整数のキャストに比べればはるかに重い
そのレベルを気にするなら生ポ

312:デフォルトの名無しさん
20/02/06 22:53:37 sigCaOr9.net
x86なら32bit命令使った方がバイナリ小さい

313:デフォルトの名無しさん
20/02/06 22:57:14 sigCaOr9.net
>>304
vectorだと生ポと変わらんでしょ
もちろん最適化前提で

314:デフォルトの名無しさん
20/02/06 23:03:20 YUB/hFRs.net
>>300
range-basedはiterator
c++のiteratorはindexが速くなる連続アドレスのコンテナならpointerと同じコンパイル結果になる

indexアクセスがpointerより遅くないなら、それはコンパイラの最適化のお陰

315:デフォルトの名無しさん
20/02/06 23:13:46 /W9iMVJD.net
>>306
生ポと変わらなきゃ良いんだけど
変わるんだよ
VisualStudioやチープなコンパイラだと

いずれにしろここから先は
具体的な環境とループ回数やループの中身全体で考えないと意味がない
なんせ1クロックレベルのことを気にしてるようなので

実はメモリアクセスが支配的で
他の最適化は全く意味がないとか

316:デフォルトの名無しさん
20/02/06 23:20:09.64 /W9iMVJD.net
SIMD命令 / DSP命令 / スレッド分け / GPU
他のループと合わせる / ループを分ける
ループアンロール
依存性の削減 / 式変形
アルゴリズムの改善
キャッシュ化 / テーブル化
いろんな最適化がある

317:デフォルトの名無しさん
20/02/06 23:45:25.65 f00f0WlE.net
vectorの[]は定数時間

318:はちみつ餃子 ◆8X2XSCHEME
20/02/07 01:10:19 BIRgOLIs.net
ところで元々の質問の >>267 は整数の型が合わないのどのくらい気にする?
っていうのを「一般論として」聞いてるので、これに対しての選択肢を派閥系統樹形式にしてみた

├→ きちんと合わせる派
│  ├→ その環境で合ってれば良いよ派 (移植性は気にしない派)
│  ├→ コンパイラの警告は潰す派
│  │  ├→ 理解しなくてもキャストで合わせるので十分派
│  │  └→ 警告される箇所は仕様の詳細を調べる派
│  └→ size_t とか size_type とか使え派 (言語仕様原理主義派)
├→ 問題がなければ気にしない派
│  ├→ 問題に気づかない派 (鈍感派)
│  ├→ 実行コストに敏感派
│  │  ├→ 最適化はあてにする派 (モダン開発環境派)
│  │  └→ 最適化はあてになんないよ派
│  │     ├→ 低レイヤ派
│  │     ├→ 老害派
│  │     ├→ 諦め派
│  │     └→ ベータ開発環境追いかけ派
│  └→ 状況と程度による派 (柔軟派)
└→ えっ、それって駄目だったん? 派
    ├→ 初心者派
    └→ 無知派

319:デフォルトの名無しさん
20/02/07 02:51:26 dGY


320:48don.net



321:デフォルトの名無しさん
20/02/07 03:23:36 yxrGSGnH.net
じゃあ俺、えっ、それって駄目だったん? 派でお願いします。

322:デフォルトの名無しさん
20/02/07 03:50:27 yxrGSGnH.net
テストの品質がすべてを決めるような気がしてきた。

323:デフォルトの名無しさん
20/02/07 03:57:04 plErZoHk.net
>>311
わし、こうみえて「警告される箇所は仕様の詳細を調べる派」や
その上で、問題なければ「状況と程度による派 (柔軟派)」に再度ブランチする派

324:デフォルトの名無しさん
20/02/07 04:00:36 yxrGSGnH.net
Boostは警告を無視する派、GoogleはMicrosoftの問題なので修正する予定はない派。
ってことは、警告だしっぱなしで構わないって事では?

325:デフォルトの名無しさん
20/02/07 04:01:58 yxrGSGnH.net
目grepが難しいので、警告は消すしかないんだけど。

326:デフォルトの名無しさん
20/02/07 04:04:17.66 yxrGSGnH.net
変数の大きさが変わると同じ値のビット表現が変わるのはしんどいので、符号が一番右端にあったほうが良かったんじゃないの。
右端ならビット表現が変わらない。

327:デフォルトの名無しさん
20/02/07 05:13:16 zrCiCWWN.net
型違い面倒だからautoにしても警告出るから何でやおもたらi=0でintだったでござる派

328:デフォルトの名無しさん
20/02/07 06:00:43 yxrGSGnH.net
HTMLにしろコンパイラにしろ、Microsoft案のほうが合理的と思うけどな。
規格は政治だよね。

329:デフォルトの名無しさん
20/02/07 06:42:07 52vnIbYM.net
>>302
signed Tはできねえぞ
std::make_signed_t<T>にしないと

330:デフォルトの名無しさん
20/02/07 06:57:58 52vnIbYM.net
> コンパイラの警告は潰す派

キャストつーか、#pragmaを使ったりもするね
もち、規格票で自分が悪いのかコンパイラのお節介かはっきりさせてからだけど

331:デフォルトの名無しさん
20/02/07 07:21:23 9DO99WJ1.net
基本的にはsize_tとかsize_typeとか使え派
面倒でもちゃんとやった方が後のテストや検証は楽なんだよ
まあ無理だったり異様に面倒だったりする場合も現実的にはあるからそこは仕方ないけど

332:デフォルトの名無しさん
20/02/07 07:52:22 +bDqT2Wz.net
i は int にしたいって言ってるんだから

ここの型をsize()に合わせたら
キャストが他に移るだけ

333:デフォルトの名無しさん
20/02/07 08:31:14.28 z6HtA7Ca.net
>>288
いえいえ

334:デフォルトの名無しさん
20/02/07 10:49:20 /rNOv2pQ.net
>>298
vがグローバルなオブジェクトである場合や、ヒープから確保されたオブジェクトの参照型である場合、コンパイラには v.size() がループ定数であるかどうかを判定するのは難しいことが多い。
このスレでもグローバルに確保された構造体型のメンバを参照する場合、最適化され無い事が指摘されていたが、それと同じことが原因。
C/C++ではポインタや参照があるのでグローバル変数やグローバルなオブジェクトのメンバ変数が変化しないことをコンパイラが見極めるのが難しい。

335:デフォルトの名無しさん
20/02/07 10:52:27 VWyX2qgb.net
for(auto i=v.size()+1; 0<len; --i)

for(auto i : my_range(v.size())

336:デフォルトの名無しさん
20/02/07 11:01:57 52vnIbYM.net
reverse_iterator first(v.end()), last(v.begin());
for_each(first, last, [](auto& x) { cout << x; });

337:デフォルトの名無しさん
20/02/07 11:41:09.54 jtk/IwGo.net
64bit/32bitまたぎできるソース汎用性を考えれば、負の数が必要ないなら size_tを使うのが最善でしょ。

338:デフォルトの名無しさん
20/02/07 12:00:59.89 VWyX2qgb.net
size_tはunsignedなのがうざい
c言語初心者が決めただろこれ

339:デフォルトの名無しさん
20/02/07 12:07:12.14 VWyX2qgb.net
あ、上にかいたやつ+1は間違いや

340:デフォルトの名無しさん
20/02/07 12:12:42.12 52vnIbYM.net
ポインタ


341:+ size_t == ポインタ ポインタ - ポインタ == ptrdiff_t おかしいね



342:デフォルトの名無しさん
20/02/07 12:33:14.78 8FC0VQS8.net
>>326
仮に毎回アクセスしたとしてもv[i]の方が重い
毎回アドレスを計算して毎回メモリアクセスするわけで

343:デフォルトの名無しさん
20/02/07 12:48:40.15 Nrn3Ov0h.net
indexにintはlp64環境だと怖すぎる

344:デフォルトの名無しさん
20/02/07 12:51:13 cytAyAiU.net
そんなバカでかいインデックス作る方が怖い

345:デフォルトの名無しさん
20/02/07 13:01:32 jtk/IwGo.net
ファイルポインタは4GB越えが当たり前だし。

346:デフォルトの名無しさん
20/02/07 13:18:28 8FC0VQS8.net
ばかでかいループをたくさん作るなら
性能を心配した方が良い

中身にもよるが、ほぼメモリアクセス時間になりかねない
帯域の無駄遣い
ループをまとめるとか細切れにするとか
キャッシュを有効に使う処理にしないと

キャストのコストとか完全に誤差

347:デフォルトの名無しさん
20/02/07 13:30:18 QoBXk/kf.net
メモリポインタも4GB超えは当たり前だしな

348:デフォルトの名無しさん
20/02/07 13:33:10 52vnIbYM.net
8086時代の苦しみを知っている人なら
リニアでないポインタやインデックスが
どんなにウザいものかよく知っている

64bit空間なら64bitを使っとけって悪いこと言わないから

349:デフォルトの名無しさん
20/02/07 13:45:59 8FC0VQS8.net
ループの中身も知らないで良く言うね
int変換必須なら問題点の場所を移動させただけ

350:デフォルトの名無しさん
20/02/07 13:58:09.08 jtk/IwGo.net
今日日4GB越えとかWindowsNT4.0サービスパックですか、と。

351:デフォルトの名無しさん
20/02/07 14:12:43.62 PWhN+bN7.net
納品したときに
コンパイルで警告出るんですが消してって言われて
それ無視して良い警告ですよって言っても
理解してもらえなかった派

352:デフォルトの名無しさん
20/02/07 14:19:34.17 PWhN+bN7.net
あと警告が出ないからと言って
正しく動くと保証されている訳でもなんでもないのに

353:デフォルトの名無しさん
20/02/07 14:32:07.46 VWyX2qgb.net
>>342
それはお前が悪い
そんなんで納品するな

354:デフォルトの名無しさん
20/02/07 14:34:22.92 jtk/IwGo.net
客先と同じビルド環境で警告対応しないのは落ち度だね。次の仕事なくなるでしょ。

355:デフォルトの名無しさん
20/02/07 14:40:57.67 /rNOv2pQ.net
>>333
BYTE v[数値];
のような生配列の場合、ループの中のv[i]は、最適化が効いてものすごく効率の良いコードになることが多い。
この場合、vがグローバルに確保されたオブジェクトや参照型であったとしても最適化には余り悪影響はない。
vがstd::vector 型の場合で、かつ、vがグローバル・オブジェクトや、参照型の場合は、コンパイラはv[i]を上手く最適化できないかもしれない。

356:デフォルトの名無しさん
20/02/07 14:42:08.26 /rNOv2pQ.net
>>346
すまん。
後半部分は勘違いかもしれない。

357:デフォルトの名無しさん
20/02/07 14:47:50.81 5UxOF8qK.net
>>346
VCはvectorでも生ポインタに近い最適化はしてくれてるみたいだぞ

358:デフォルトの名無しさん
20/02/07 15:03:24 jtk/IwGo.net
客や同僚から使えないプログラマ認定されていることに気づけず独りよがりな考えに凝り固まる人いるよね・・・
かわいそうではあるけど、かかわりたくないタイプの人。

359:はちみつ餃子 ◆8X2XSCHEME
20/02/07 15:15:12 BIRgOLIs.net
標準ライブラリのコンテナのイテレータを sizeof で見ればわかるが、ほとんどの場合で void* と同じ大きさ。
要するにポインタ一個分の情報しかないし、実際ポインタが入ってるし、ポインタの操作になってる。
しいて言えば操作がメンバ関数経由になる分のコストはあるといえばあるけど、
それくらいのインライン展開はするのが普通でしょ。
vector の場合だと領域が連続する保証があるのでインライン展開だけでイテレータはポインタと同じになる。

VC のコンテナだとデバッグモードではイテレータが少し大きい (のと範囲チェックとかする) ってなことらしいんだが、
処理系をインストールしてないから試してない。

360:デフォルトの名無しさん
20/02/07 15:20:21 E/TdO4KU.net
>>349



361:まえがきちんとした仕様を提案できないで投げっぱにしてるからそんなことになってんじゃないの?



362:デフォルトの名無しさん
20/02/07 17:16:18 52vnIbYM.net
>>340
64bit空間で64bit以外のインデックスを使うべきループの中身とやらを書かないあんたが悪い
書けないんじゃないのか?

363:デフォルトの名無しさん
20/02/07 17:31:01 Nrn3Ov0h.net
intだとたったの2G要素でオーバーフローして無限ループになるのが怖い

364:デフォルトの名無しさん
20/02/07 17:31:33 yxrGSGnH.net
イテレータよりポインタのほうが速いよ。
ホントだよ。
いまベンチとってるから。
偶然だけど。

365:デフォルトの名無しさん
20/02/07 17:34:39.39 jtk/IwGo.net
>>351
「無視して良い警告」とか勝手に判断する困ったPGにきちんと仕様を提案しても無駄でしょ。解雇するわ。

366:デフォルトの名無しさん
20/02/07 17:37:50.00 PWhN+bN7.net
unsigned だと
for(unsigned i = s.size(); --i >= 0; ){...}
みたいなので警告出るんだっけ

367:デフォルトの名無しさん
20/02/07 17:41:09.31 Nrn3Ov0h.net
警告で指摘された問題点に対処もせずに、キャストやらで無理やり消す位なら、出たまま放置の方が100倍マシ

368:デフォルトの名無しさん
20/02/07 17:43:22.94 yxrGSGnH.net
ヒープ作るとき、マイナスの値は空きノードのリンクリストに使ったりするので、その手の比較は多発する。

369:はちみつ餃子
20/02/07 17:43:55.24 BIRgOLIs.net
うーん、近頃はちょっとした作法レベルのところまで警告として口出しすることがあるからなぁ。
完全に規格に沿って書いてるわ! ってときにはイラッとすることもある。
個別に警告オプションを設定するのも面倒くせぇし、直してしまう方が手っ取り早かったりもするんだけど、
何がなんでも警告をゼロにしろって言われたら警告レベルを低くする対処をしちゃうかも。

370:デフォルトの名無しさん
20/02/07 17:52:14.97 VWyX2qgb.net
仕事ではやってんなら手を抜くなぼけ
pragmaとかでなんとでもなるだろ

371:デフォルトの名無しさん
20/02/07 17:55:05.15 yxrGSGnH.net
タモリさんは遊びで手を抜くなって言ってた。

372:デフォルトの名無しさん
20/02/07 17:57:41.44 jtk/IwGo.net
従来cppcheckなどの静的解析ツールが出していた警告をコンパイラも出すようになってくれたのは良い動き。
親切なコンパイラに感謝して警告箇所の修正をやればいい。
修正に工数がかかることが懸念されるなら、依頼主にその旨を伝えればいい。

373:デフォルトの名無しさん
20/02/07 18:05:13.97 kNxPhPNR.net
>>360
すごい偉そうにしてるけど大丈夫?>>327
;0<len; って···

374:デフォルトの名無しさん
20/02/07 18:14:59.44 CaNLgYal.net
雑魚ほどイキがるのはプログラマも同じ

375:デフォルトの名無しさん
20/02/07 18:23:59.39 yxrGSGnH.net
カバレッジ測定のツールって安いの無いのかな。

376:はちみつ餃子
20/02/07 18:36:35.61 BIRgOLIs.net
>>360
俺はプログラミングについては趣味者だから実務のことは知らんのだわ。
すまんな。
しかしな、必要以上の品質にするくらいなら手抜きで安くしろって言う客の方が多いと思うぞ。
必要より下になったらあかんのでそこを制御していい感じの
手抜き具合にするのが難しいわけだが、そこを上手くやるのが
手抜きしないことよりもプロに必要な資質じゃね?
手抜きしないよりも適切に手を抜く、どうやって手抜きするか知っていることが大事だ。
仕事は経済的に割に合う形でしか継続できないんだからさ。
そりゃあいつも十全な仕事が出来る時間的・経済的余裕があるならうれしいが、
現実はそうではないだろ。

377:デフォルトの名無しさん
20/02/07 18:40:56.99 jtk/IwGo.net
>>366
何言ってんだ?
手抜きしたいからこそ、コンパイラの警告に素直に従うんだぞ。

378:はちみつ餃子
20/02/07 18:45:33.43 BIRgOLIs.net
>>367
それもそうだな。

379:デフォルトの名無しさん
20/02/07 18:51:12.38 ZYtSuiu/.net
DirectX関連使ってるとenumよりenum classを優先しますという警告出るんだけど、ライブラリ変えるわけにもいかなく、どう対応するのが正解なんだろ?

380:デフォルトの名無しさん
20/02/07 18:58:20.00 HVBpNa40.net
そもそも警告って規格で定められている訳でもなく、コンパイラが独自の基準で勝手に出してくる物だからね
mutableは悪だってconst付いてない変数全てに警告出すコンパイラとか出てきたらどうするんだろう

381:デフォルトの名無しさん
20/02/07 19:03:54.90 jtk/IwGo.net
>>370
議論のための議論とか、言いがかりのような仮定の話に、いちいち付き合わないことが重要。

382:デフォルトの名無しさん
20/02/07 19:04:25.00 /AlUflk/.net
>>365
とりあえずgprofでいいんじゃね?

383:デフォルトの名無しさん
20/02/07 19:08:56.34 yxrGSGnH.net
>>372
見てみます。

384:はちみつ餃子
20/02/07 19:25:21.94 BIRgOLIs.net
>>371
変な作法が追加されることなんて良くあるんだぞ。
今じゃ gcc や clang で -Wall オプションを付けたら
a || b && c
みたいな式にすら警告が出る。
優先順位を間違えやすいとこだから括弧で明示した方が良いんだと!
演算子の優先順位くらい把握しとるわ!
こんなの警告されるようになると想像したことあったか?
他の演算子でも同様の警告を出すようになることくらいはあるかもしれんぞ?
確かに >>370 は極端な例ではあるが、ようわからんところでしょうもない警告が出るようになる
かもしれんという懸念は無い話ではないぞ。

385:デフォルトの名無しさん
20/02/07 19:30:53.52 9DO99WJ1.net
いやそれはカッコ付けろよ

386:デフォルトの名無しさん
20/02/07 19:33:08.02 jtk/IwGo.net
>>374
趣味でしかやってない人の意見なんて無視しろ、というが私の回答です。

387:デフォルトの名無しさん
20/02/07 19:39:25.14 1PiYJQ+8.net
>>374
それは括弧つけろよ

388:はちみつ餃子
20/02/07 19:46:55.57 BIRgOLIs.net
>>375-377
そっかー (´・ω・`)

389:デフォルトの名無しさん
20/02/07 19:55:08.75 yxrGSGnH.net
はちみつ先生は何を作ってるんですか?

390:はちみつ餃子
20/02/07 20:28:02.80 BIRgOLIs.net
>>379
ゲームのチートツールとか。
汎用的な便利なツールは色々とあるけど、個別のソフトをいじるには行き届かないこともあるので。
念のため言っとくけど買い切りの RPG かフリーゲームだけ。 ネットゲームはやってないよ。
ちなみにそのツールは公開してない。
その他に作った有用そうなものは公開してるんで、身バレするから言えない。

391:デフォルトの名無しさん
20/02/07 20:52:16.35 yxrGSGnH.net
>>380
そうなんですか。
ずいぶん詳しいのに仕事じゃないというから不思議に思ってました。

392:デフォルトの名無しさん
20/02/07 20:56:00.11 jtk/IwGo.net
つまり、はちみつ某は、なんの思い入れもない他人のソースを読まされる身になった経験が少ないわけか。

393:デフォルトの名無しさん
20/02/07 21:02:52.46 yxrGSGnH.net
アルゴリズム考えるときは、図を必ず書くと思うんだけど、皆さんは何を使ってますか?
いまは紙と鉛筆使ってるんだけど、探すの大変だから、ソフトに変えたい。

394:はちみつ餃子
20/02/07 21:05:36.03 BIRgOLIs.net
>>382
せやな。
そんなわけで、他人のバイナリを見る機会はあるけどソースはそれほどでもって感じかも。
結果的に読まなきゃならないことはあるけど、所詮は趣味だから嫌になったらいつでも止められるし、急がなくてもいいし。
プレッシャーに晒されながらクソみたいなソースを読むってことはない。

395:デフォルトの名無しさん
20/02/07 21:05:49.82 E/TdO4KU.net
たまに書く方がいい
字を忘れる

396:デフォルトの名無しさん
20/02/07 21:09:26 y0pPi+zA.net
C++なんざ仕事で嫌々書かされるだけの言語だと思ったけど
趣味で使っちゃう子もおるんやな

397:はちみつ餃子 ◆8X2XSCHEME
20/02/07 21:12:24 BIRgOLIs.net
>>383
曖昧なところから思考を整理するなら紙と鉛筆でいいと思うけど、
それなりに書式の整ったようにするなら PlantUML とか。
GUI で自由にってことなら Dyna


398:mic Draw くらいが手頃かもしれない。



399:デフォルトの名無しさん
20/02/07 21:15:03 jtk/IwGo.net
完全な趣味目的でC++を触る変態はそうそういないと思う。

400:デフォルトの名無しさん
20/02/07 21:16:30 52vnIbYM.net
>>386
禿1読んで信者になった変態もおるんやで

401:はちみつ餃子 ◆8X2XSCHEME
20/02/07 21:16:36 BIRgOLIs.net
>>386
ゲームのチートとかするために
既存のプロセスに割り込んだりする処理を書こうと思うと C か C++ くらいしかまともな選択肢なくね?
C で足りるなら C で済ませることもあるけど、もうちょっと高級なことがしたくなったら C++
ってのは妥当な選択肢というか、唯一解でしょ。

まあ近頃は Rust にも興味があるけど……。

402:デフォルトの名無しさん
20/02/07 21:37:46 yxrGSGnH.net
>>387
見てみます。

403:デフォルトの名無しさん
20/02/07 22:05:07.56 8FC0VQS8.net
>>375
>>377
男ならカッコつけろ

404:デフォルトの名無しさん
20/02/07 22:14:56.42 8FC0VQS8.net
カッコつけろって人
付ける付けないの基準はコンパイラの警告?
完全に優先順位を覚えてる人から見ると
カッコが多いと見にくいんだよ
a == 0 || b != 0
a * b + 1
*a[i]
*a++
こんなのにカッコつけてたら
えっ?何か意味があるの?って考えてしまう

405:デフォルトの名無しさん
20/02/07 22:26:24.78 52vnIbYM.net
> えっ?何か意味があるの?
いや、「あーまた面倒くさいやつ来やがった」だよ

406:デフォルトの名無しさん
20/02/07 22:52:28.44 GxNDg+Fe.net
実務経験1年で月収80万稼げるエンジニアになった理由
URLリンク(www.youtube.com)
意識が低いエンジニアこそフリーランスになれ
URLリンク(www.youtube.com)
フリーランスエンジニアの週3労働ってどんな感じ?
URLリンク(www.youtube.com)
ぼくがスキルのない社畜ならこうやって脱する
URLリンク(www.youtube.com)
初めて人を雇ったらもう二度とサラリーマンをやりたくないと思った話
URLリンク(www.youtube.com)
プログラミングは文系でも余裕で出来ます!理由を現役プログラマーが解説
URLリンク(www.youtube.com)
貧乏人こそ社会不適合者
URLリンク(www.youtube.com)
元ド貧乏が教える】貧乏を抜け出すための2つの考え方
URLリンク(www.youtube.com)
より良いオファー貰ってるのに転職しないとか何考えてるの?
URLリンク(www.youtube.com)

407:デフォルトの名無しさん
20/02/07 22:55:11.74 NUR9HIfz.net
優先順位を完全に把握しているなら機能的には意味のない括弧だと理解しているんだろうが
そのうえで疑問に思った「意味」って、どんなものを想定しているんだろう。
「優先順位を完全に把握していない人が間違えないように」くらいの意味しか思いつかないが。

408:デフォルトの名無しさん
20/02/07 22:59:52.10 8FC0VQS8.net
(a + b + c) + (d + e)
同じ型の整数5個を足すのにこんなカッコが付いてたらどう思う?

409:デフォルトの名無しさん
20/02/07 23:17:13.31 NUR9HIfz.net
>>393と言ってる趣旨が違ってないか?
実際に>>397みたいなコードを見たことがあるの?

410:デフォルトの名無しさん
20/02/07 23:24:04.71 8FC0VQS8.net
同じ印象だって話
ちなみに、
わざわざ>>397のようなカッコを付ける時はある

411:デフォルトの名無しさん
20/02/07 23:24:42.60 jtk/IwGo.net
協業できない人があれこれC++について論じるのは害でしかない。

412:デフォルトの名無しさん
20/02/07 23:31:57.60 Uosz/SQM.net
まずプログラム言語っての読み書きする人間のためにあるって大前提忘れてるか自覚してないやつ多いな

413:デフォルトの名無しさん
20/02/07 23:34:58 NUR9HIfz.net
>>399
マイナスが混ざっているならわからんでもないが、>>393で言っている優先順位の話とは関係ないように思うが?

414:デフォルトの名無しさん
20/02/07 23:36:27 Fqx20dQ+.net
>>397のようなコードを見てどう思う?

415:デフォルトの名無しさん
20/02/07 23:39:04 jtk/IwGo.net
見やすいかどうかは


416:主観なので、他人や未来の自分が読んで誤解しないようにすることが肝でしょ。 まさか、「数値リテラルの桁区切り文字」にまでかみついたりしないよね? https://cpprefjp.github.io/lang/cpp14/digit_separators.html



417:デフォルトの名無しさん
20/02/07 23:41:49 yMJLmx4v.net
主観で見やすい表記にする
その為にコンパイラの警告を無視したり切ったりする

何も問題無い

418:い
20/02/08 00:06:08.38 Wxs8WSK9.net
>>374
> >>371
> 変な作法が追加されることなんて良くあるんだぞ。
> 今じゃ gcc や clang で -Wall オプションを付けたら
> a || b && c
> みたいな式にすら警告が出る。
> 優先順位を間違えやすいとこだから括弧で明示した方が良いんだと!
> 演算子の優先順位くらい把握しとるわ!
把握してても間違えやすいからだと思うね
実際にはa,b,cには比較演算子を使った式が入ることが多いだろう
そうするとけっこうな長さになったりする
で全体の構造が見えにくくなる
そりゃ書いてる真っ最中は問題ないさ
しかし後から読んだときにすぐ理解できなかったり、手を加えるときに間違えたりする
warningを出すべきかは議論の余地があると思うけど、
出すべきと考える理由はわかる

419:デフォルトの名無しさん
20/02/08 00:38:17.76 RKzyJDHj.net
それはエディタの機能でかっこを表示したら良いのでは。

420:デフォルトの名無しさん
20/02/08 00:57:11 GuOhFnKw.net
主観は重要だろう。
重要でないなら全部アセンブラで書けや。
客観的には最も性能の出る言語だぞ。

421:デフォルトの名無しさん
20/02/08 01:23:28 Mdfh1mSi.net
&,|とか&&,||は*,+の関係と同じだから括弧つける方が冗長で分かりづらくなると思うんだが

422:デフォルトの名無しさん
20/02/08 01:29:21 zzucbZgG.net
一度書いた四則演算の数式を書き換えることはほとんどないけど、bool論理演算は頻繁に書き換えるでしょ。

423:デフォルトの名無しさん
20/02/08 01:30:14 zzucbZgG.net
素人多いね、このスレ。

424:デフォルトの名無しさん
20/02/08 01:45:08 RKzyJDHj.net
>>411
プロの意見だとどうなりますか?

425:デフォルトの名無しさん
20/02/08 01:52:50 JKzazDKJ.net
数式を遅延評価するオブジェクトを作れば
演算子のオーバーロードで演算子の優先順位を変えられるも同然

426:デフォルトの名無しさん
20/02/08 01:53:57 JKzazDKJ.net
テクニックの限りを尽くしてbetter C++を実現したら良い

427:デフォルトの名無しさん
20/02/08 01:54:26 zzucbZgG.net
プロなら抽象的な質問には回答しないでしょ。時間泥棒にあう。
「もっと具体的に書いてくれ」と逆質問する義理がないならなおのこと。

428:デフォルトの名無しさん
20/02/08 02:00:57 RKzyJDHj.net
自分の職業の板には一切いかないから、ここも職業プログラマはいないと思う。
ここに書き込む意味が無いと思うんだよな。

429:デフォルトの名無しさん
20/02/08 02:02:06 uvgcwZ2m.net
>>395
グロ

430:デフォルトの名無しさん
20/02/08 02:06:09 Mdfh1mSi.net
職業プログラマって?
仕事でソフト作るし、客先に納入したりもするけどプログラマではないな

431:デフォルトの名無しさん
20/02/08 02:08:10.84 RKzyJDHj.net
たとえば、外科医が匿名の掲示板で効果的な治療法について話し合ったりしないでしょ。
治療法について話し合ってる人は患者だ。
だから、ここにもプログラマはいないはず。

432:デフォルトの名無しさん
20/02/08 02:28:45.19 zzucbZgG.net
プロの対義語はアマ。素人の対義語は玄人。
今時点のこのスレの回答者が素人同然の低いレベルであることは、否定できない。
例えば一週間後は違うかもしれない。もっともまともな回答者がこのスレに常駐するようになるかもしれない。

433:デフォルトの名無しさん
20/02/08 06:55:22.73 ARbKbNEu.net
>>374
-Wallとは別に「お節介は一切禁止」というオプション欲しいね

434:デフォルトの名無しさん
20/02/08 07:15:13.17 N5LmiSOJ.net
特定の警告だけ無効に出来るのが普通だよ

435:デフォルトの名無しさん
20/02/08 07:33:56.27 gtTyaGQ0.net
警告は全ておせっかい

436:デフォルトの名無しさん
20/02/08 07:53:55.28 +X9VZvVK.net
>>374はわかるけど
>>393, >>397で警告出すコンパイラとか見たこと無い

437:デフォルトの名無しさん
20/02/08 08:04:33 gtTyaGQ0.net
私も見たことは無い
でも他の演算子でも同じこと

1u << n+1

こんなのは良く使う
いちいちカッコを付けた方が分かりにくい

438:デフォルトの名無しさん
20/02/08 08:11:34 gtTyaGQ0.net
カッコを付けろって結局警告が出るから付けろってことで
見やすさとか無視した意見が多い

if ((a==(b + 1))||(a==(b + 2)))

こんな感じに書くヤツがいるんだよ実際

439:デフォルトの名無しさん
20/02/08 08:14:44 ARbKbNEu.net
警告の出方がコンパイラによって違うわけで
特定のコンパイラの警告に対応するということなら
#pragma使うのと同じだね

440:デフォルトの名無しさん
20/02/08 08:26:00 GuOhFnKw.net
>>426
それはつけた方がいいだろ。
見づらいのはスペースの使い方に問題がある。

441:デフォルトの名無しさん
20/02/08 08:42:00 gtTyaGQ0.net
えっ?
まじで言ってる?

if (a == b+1 || a == b+2)

これだと一瞬で理読める
俺が特殊?

442:デフォルトの名無しさん
20/02/08 09:05:35 LleYumKd.net
>>428
演算子の優先順位くらい勉強しておけよ
手間かけさせんな

443:デフォルトの名無しさん
20/02/08 09:08:26 LleYumKd.net
>>408
やはりアホだったかコイツw

444:デフォルトの名無しさん
20/02/08 09:10:24 ktYbgjbO.net
>>366
手抜きがどうこうと最もらしいこと言ってるけど
>>359で言ってるのは「警告に対処するのが面倒くさい」ってことだろ?
仕事で手を抜くべき場所とそうでない場所、みたいな次元の話じゃない

あと警告レベルは最大にしたりすると標準ライブラリにすら警告出るけど、標準より下げるのは良くない
そういうこと平気でやってると必ず後で本格的に面倒くさい原因不明のバグが頻発する

445:デフォルトの名無しさん
20/02/08 09:29:30 JKzazDKJ.net
256倍バグを出しても256倍早く潰したら
問題無くね?

446:デフォルトの名無しさん
20/02/08 09:30:03 GuOhFnKw.net
if( a == (b+1) || a == (b+2) )
これくらい書いてもバチ当たらんだろ。
しょうもないことでドヤってる馬鹿が開発では一番有害。

447:デフォルトの名無しさん
20/02/08 09:32:02.56 pUDxcHmc.net
>>433
256倍もバグ出すような奴と仕事したくない

448:デフォルトの名無しさん
20/02/08 09:39:01 JKzazDKJ.net
>>435
先方も256倍遅い奴と仕事したくないと思うてはるで

449:デフォルトの名無しさん
20/02/08 10:08:44 Di3wk8ih.net
>>433
全部潰せるならね

450:デフォルトの名無しさん
20/02/08 10:24:14 YOfaZC8k.net
じゃあ次は

bool b;
// 略
if (b == true)

の話でもする?w
俺はこれが一番のキチガイ記法だと思ってる

451:デフォルトの名無しさん
20/02/08 10:29:50 yr4lhGWD.net
勢いあまってこれも否定しちゃう

BOOL b;

if (b == TRUE)

452:デフォルトの名無しさん
20/02/08 10:33:51 JKzazDKJ.net
>>439
b==-1が成立することが有るのはウィンドーズのバグ

453:デフォルトの名無しさん
20/02/08 10:39:25 yaVA2/v3.net
if (a = b+1 || a == b+2)
こう書いたとき気づきづらい
手間をかけるのはそれ自体だけでなくいろいろ見る機会になる

454:デフォルトの名無しさん
20/02/08 11:00:58 Di3wk8ih.net
>>438
if(a != true){
return true;
} else {
return false;
}
みたいなコード見たときは流石に絶句したわw

455:デフォルトの名無しさん
20/02/08 11:05:13 Di3wk8ih.net
>>441
それはまた別な話
ところで>>374
if(a = b){
みたいなコードに対する警告も不要と言うんだろうか?

456:デフォルトの名無しさん
20/02/08 11:09:08 LleYumKd.net
>>441
学習が足りてないだけ
括弧なんて要らん
理解できるレベルまで進化しろ原始人

457:デフォルトの名無しさん
20/02/08 11:17:32 yr4lhGWD.net
>>440
で、 if (b) と書いちゃっても自分のバグじゃなくてWindowsのバグと主張する

458:デフォルトの名無しさん
20/02/08 11:39:54.89 pjdiRHlo.net
>>445
C/C++ では、b が「非0」、つまり「0 以外」だとすべて真(true) と考えるのが伝統。
なお、余計に混乱を招くだけかもしれないが、
数学的には、b == true とは、単なる数として完全一致であることを調べる演算子ではなく、集合的に、b ∈ {非0} であるかどうかを調べる演算子だとみなすことも出来る。
ところが、C/C++ では、== 演算子は単なる数としての一致を調べる演算子で、
かつ、TRUE は通常 1 にマクロ定義されているので、
b == true が、b が完全に 1 に一致しているかどうかを調べる演算子になっている。
なので、if (b) と書く方が正しく、if ( b == TRUE ) と書くのは間違い。

459:デフォルトの名無しさん
20/02/08 11:53:39.76 yr4lhGWD.net
>C/C++ では、b が「非0」、つまり「0 以外」だとすべて真(true) と考えるのが伝統。
名前が紛らわしいがBOOLは真偽二値じゃないんだからそれは関係ない。
TRUEかどうか判定する必要があるなら if (b) は明らかに間違い。

460:デフォルトの名無しさん
20/02/08 12:11:53 JKzazDKJ.net
回避して使うかどうかとは無関係にバグはバグじゃわ;

461:デフォルトの名無しさん
20/02/08 12:27:48 yr4lhGWD.net
>>439はジョークのつもりだったが、実際に勢い余った人が2人も現れるとはw

462:デフォルトの名無しさん
20/02/08 12:47:51 YOfaZC8k.net
>>442
なにその想像を超えたキチガイ

>>449
アンタの親切心が何人かの明日を救ったねw

463:デフォルトの名無しさん
20/02/08 12:53:53 JKzazDKJ.net
プログラミングはアートやからな
狂気もまた創造の源泉、

464:デフォルトの名無しさん
20/02/08 12:56:37 zzucbZgG.net
>>442,450
対話デバッグでaに応じて実行をブレークしたかった人が残したデバッグの痕跡だろうね。
ソースを他人に公開する際にはブレークポイントの情報はなくなるから、他人には意味不明だけど。

465:デフォルトの名無しさん
20/02/08 12:58:48 zzucbZgG.net
>>451
狂気じゃなくて修正の積み重ね。少しづつ修正していると大ポカに気づけない。
だからこそ親切なコンパイラの警告に従う謙虚さが大切になる。

466:デフォルトの名無しさん
20/02/08 13:32:28.54 gtTyaGQ0.net
>>452
そっち?
a != true
じゃなくて?

467:デフォルトの名無しさん
20/02/08 14:33:50 pjdiRHlo.net
BOOL b に対して、正しくはこう :
if ( b )     // 良い
if ( b != 0 )   // 良い
if ( b == TRUE ) // 駄目

468:デフォルトの名無しさん
20/02/08 14:48:48 v1IBJgnW.net
>>383
graphviz / python

469:デフォルトの名無しさん
20/02/08 14:51:43 P2cF6ghb.net
graphvizは主要なLinuxの標準リポジトリに入ってるから助かる

470:デフォルトの名無しさん
20/02/08 14:52:17 v1IBJgnW.net
>>403
浮動小数点数なら桁落ちとか気にしてんのかなーとか勘繰る

471:デフォルトの名無しさん
20/02/08 15:10:32 pjdiRHlo.net
>>403
整数の場合だと、括弧を付けてある部分に何らかのまとまった意味があるのかも知れない。

数学や物理学では、計算を減らすために式変形していくが、最終的な式は元々の意味が分からなくなってしまうことがある。

その場合には括弧で囲ったくらいで意味が分かり易くなることは少ない。

しかし、そのケースの場合は、括弧で括ると何か意味が分かり易くなると考えた間ロウ製がある。

472:デフォルトの名無しさん
20/02/08 15:11:02 pjdiRHlo.net
>>459
間ロウ製 ---> 可能性

473:デフォルトの名無しさん
20/02/08 15:12:02 JKzazDKJ.net
>>455
>if ( b == TRUE ) // 駄目
-1をTRUE扱いしたくないのであればこれが唯一正しい

474:デフォルトの名無しさん
20/02/08 15:45:10 yr4lhGWD.net
MSDNの書き間違いかもしれないが、Win32 APIの一部にも「成功時はTRUEを返す」という
仕様の関数があるんだよな。

475:デフォルトの名無しさん
20/02/08 15:54:04 pjdiRHlo.net
>>461
そもそも、-1 は TRUE 扱いすると言うのが C/C++ の伝統や文化。
-1 と TRUE を分けて扱うのは、特殊な独自仕様。

>>462
Win32 API の一部どころか、ハンドル値を返す以外のほとんど全ての関数が、
成功すれば TRUE を返す。

476:デフォルトの名無しさん
20/02/08 16:07:20 yr4lhGWD.net
おいおい、#define TRUE 1のTRUEと真(true)の区別がぐちゃぐちゃだぞ。

BOOLを返すWin32 APIの多くは「成功時はFALSE(0)以外の値を返す」という仕様になっている。

477:デフォルトの名無しさん
20/02/08 16:16:01 24Q9Tmjg.net
宗派論争だな

478:デフォルトの名無しさん
20/02/08 16:19:44 RKzyJDHj.net
C++にはtrueがあるので積極的に使っていこうと思います。

479:デフォルトの名無しさん
20/02/08 16:36:41.39 pjdiRHlo.net
>>464
なるほど確かに Win32 の BOOL LineTo(HDC hdc, int nXEnd, int nYEnd)の 戻り値は、
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
のように、成功時には 1 や TRUE ではなく、「非0」を返すと書いてある。

480:デフォルトの名無しさん
20/02/08 16:45:19 RKzyJDHj.net
キャッシュかキャッシュでないかで速度が変わる。
これは驚き。

481:デフォルトの名無しさん
20/02/08 16:50:34 LleYumKd.net
バカ==TRUE

482:デフォルトの名無しさん
20/02/08 17:21:59 +a4Pmd4C.net
○ if(b) if(!b)
○ if(b == FALSE) if(b != FALSE)
× if(b == TRUE) if(b != TRUE)

WinAPI使いには常識だと思ってたんだが

483:デフォルトの名無しさん
20/02/08 17:32:20 RKzyJDHj.net
そういうのをみんなで共有しましょうって事で、たらこさんが2chを作ったんですよ。

484:デフォルトの名無しさん
20/02/08 17:40:43.90 yr4lhGWD.net
>>470
常識というか思い込み。
大半のFALSE/FALSE以外を返す関数なら上で良いが、>>462のようにTRUEを返すなら当然
TRUEと比較しなきゃ正しくない。

485:デフォルトの名無しさん
20/02/08 17:57:14.84 +a4Pmd4C.net
本当にそんなのあるの?
戻り値BOOLでFALSE(0)とTRUE(1)以外の値をTRUEと違う意味を表現するために意図的に返す奴があるってこと?
具体例どうぞ

486:
20/02/08 18:25:19.22 JRIqyhqH.net
>>446
>C/C++ では、b が「非0」、つまり「0 以外」だとすべて真(true) と考えるのが伝統。
>if ( b == TRUE ) と書くのは間違い。
それは b の型が int だったら、そのとおりだけれども、>>438 をみるかぎり bool b なんでしょう?
はっ!これが老害というやつですか…

487:はちみつ餃子
20/02/08 18:26:30.54 2SU4KPt5.net
>>473
GetMessage という基本的な API からして変則的だから……

488:デフォルトの名無しさん
20/02/08 18:31:14 yr4lhGWD.net
>>462に書いたMSDNのは単にドキュメントの間違いという可能性もあるけどね。
それとは別に、TRUE/FALSe以外に-1を返すAPIがあるのは有名だろう。
いずれにしても仕様をちゃんと確認してそれに従った扱いをすべきで、思い込みは禁物ってこと。

489:はちみつ餃子 ◆8X2XSCHEME
20/02/08 18:33:32 2SU4KPt5.net
>>475
GetMessage の返却値の場合は一応は TRUE の特殊な場合として -1 の状況もある
って感じだから TRUE とは別の場合を意味する第三の状況というわけではないな。

490:デフォルトの名無しさん
20/02/08 18:34:27 RKzyJDHj.net
判定マクロないの。

491:はちみつ餃子 ◆8X2XSCHEME
20/02/08 18:44:49 2SU4KPt5.net
>>466
bool も式にまざるといつのまにか int に暗黙に型変換されちゃったりして、
やっぱりこう、あまりしっかり区別されてる気がしねぇなあと思うことも多いよ。
Windows API で使われている BOOL よりはかなりマシではあるけど。

492:デフォルトの名無しさん
20/02/08 18:46:46 JKzazDKJ.net
GetMessage()が-1を返したときはエラーなんじゃわ;

493:デフォルトの名無しさん
20/02/08 18:51:51 +a4Pmd4C.net
「WM_QUITでない」という条件における真(0以外)の中の特殊な場合(エラー)に-1ってことなのね
理屈はわからんでもないけど変なの
本当はそんなのの戻り値に「BOOL」なんていうtypedefを使うのがそもそもおかしいんだけどWinAPIだから仕方ないな

494:デフォルトの名無しさん
20/02/08 18:52:06 RKzyJDHj.net
>>480
行末の;イイね。

495:デフォルトの名無しさん
20/02/08 18:52:56 RKzyJDHj.net
30年前のAPIだしね。

496:はちみつ餃子 ◆8X2XSCHEME
20/02/08 18:55:20 2SU4KPt5.net
今なら適当なフレームワークをかぶせて使うもんだと思う。
素でメッセージの処理とか面倒くさすぎるし。

497:デフォルトの名無しさん
20/02/08 19:15:43.34 mZtPBS5R.net
klocworkがboolメンバ変数にportingがどうのって言ってくるのがうざい

498:デフォルトの名無しさん
20/02/08 20:18:51.44 RKzyJDHj.net
>>485
これ何億円するの?

499:デフォルトの名無しさん
20/02/08 21:17:13.95 24Q9Tmjg.net
>>474
やっぱQZってとんでもなくバカだな
>>439からの流れ読めよ。BOOLについて会話されてるぜ


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch