X



C++相談室 part134

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 5fcb-Q2eK)
垢版 |
2018/01/20(土) 09:05:42.21ID:mJKRg6iz0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part133
http://mevius.5ch.net/test/read.cgi/tech/1511509970/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0550デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/11(日) 21:19:50.46ID:0BygLdlM0
>>548
なんでそんなめんどくさくてミスしそうな方法をチョイスするんだよ
0551デフォルトの名無しさん
垢版 |
2018/03/12(月) 01:21:50.18
>>548
計算&書き換え手順をマニュアル化して、何十種類の仕向け別にバージョンアップの度に人海戦術で計算&書き換え&コードレビュー&テストするんですね、わかります
0552デフォルトの名無しさん (ワッチョイ fb93-ao9L)
垢版 |
2018/03/12(月) 05:00:24.40ID:kBVT8YZa0
min_factorialable() は、階乗を正しく計算できる最大の値を返す
constexprな関数(コンパイル時にint定数に置き換えられることを期待)、
と読み取ったんだけど、なぜにmin_なの?
0553デフォルトの名無しさん
垢版 |
2018/03/12(月) 05:41:37.75
上限を求めるときに使うのはminだから、かな

知らんけど
0555デフォルトの名無しさん (スッップ Sd8a-ted0)
垢版 |
2018/03/13(火) 09:59:46.06ID:CGjn2uNbd
一日の秒数を86400と書いてたらマジックナンバーやめろと言われたんだけど、
プログラムを少しでも書く人間にとってその数字は常識でいいよね?
60*60*24 と書いて「その60とか24は何だ?」と言われないでしょ?
それと同じレベルだと思ってるんだけど。
0557デフォルトの名無しさん (スプッッ Sd2a-ymMl)
垢版 |
2018/03/13(火) 10:13:40.69ID:bAh/W6qqd
>>555
言われないとわからない奴は言ってもわからないだろうから
お前は一生マジックナンバー使いまくりでいいぞ
0563デフォルトの名無しさん (ワッチョイ cb38-rkOG)
垢版 |
2018/03/13(火) 11:45:51.13ID:92t/zLSk0
2147483647なら俺の常識だが
0572デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/13(火) 14:53:30.50ID:qHQADaBY0
というかマジックナンバー言われるのって数字の意味とか集団の常識とかじゃなく書式の問題だよね
計算式の中に定数ポン置きしてる書き方してる奴がチームにいたらそりゃマズいよ、変数とか定数に置き換えろって俺も言う
0574デフォルトの名無しさん (スップ Sd8a-6rgV)
垢版 |
2018/03/13(火) 15:34:48.40ID:VrugGyEjd
>>572
しかしこうはしないだろ?

const int int8_bits = 8;
uint16_t word = (hi << int8_bits) | lo;

こうもしない
const int sec_per_min = 60;
int sec = m * sec_per_min + s;

数値リテラルで書くのが許容される数値というものがある
sec = day * 86400 はどうかというのが>>561
個人的には知らない人でも暗算もせずに初見で合ってるかどうかわかるか、
を基本にすべきだと思う (小さな2の冪乗は除く。2の冪乗知らん奴はシネ)
0575デフォルトの名無しさん (ワッチョイ cb38-uQtz)
垢版 |
2018/03/13(火) 15:51:51.20ID:92t/zLSk0
uint16_t word = (hi << CHAR_BIT) | lo;
これCHAR_BIT != 8な環境を意識するんなら、16って書いてあるのも問題だね

const int micro_per_sec = 1000000;
int us = sec * micro_per_sec;
こう書けって言われたら俺はお断りする
0577デフォルトの名無しさん (スップ Sd8a-6rgV)
垢版 |
2018/03/13(火) 16:11:31.80ID:VrugGyEjd
>>575
bit_per_char や shortでもintでもなく int8、uint16_t と明記したのは所与の仕様のつもり。

最近のapiはよくナノ秒返してくるから1000000000 倍
1000.0*1000*1000と分かち書きしたくなる
0578デフォルトの名無しさん (ワッチョイ 6a8a-6CfZ)
垢版 |
2018/03/13(火) 16:29:39.63ID:cL/fN0Uj0
時刻を自動的に合わせますというコマンドボタンを作って
押すだけで済むのに
0580デフォルトの名無しさん (スッップ Sd8a-klMS)
垢版 |
2018/03/13(火) 18:34:24.26ID:5mSkIm9zd
86400って書くと、ideで定義の参照も使えんし
86400で検索したときに
1日の秒数なのか、適当に決めたタイムアウトとかの秒数なのか、ただのIDなのか、連番で出てきただけの数値なのかとか、無意味な数列なのかまざってわからんくなるやろ
0587デフォルトの名無しさん (ワッチョイ e6e7-frl3)
垢版 |
2018/03/13(火) 20:30:42.63ID:My0TInc10
21世紀も5分の1が過ぎようかっていうこの時代に
何が悲しゅうてたかが時刻を扱うだけでtime_pointの他にtmやらtime_tやらをガチャガチャさせられにゃならんのだよまったく
0589デフォルトの名無しさん
垢版 |
2018/03/13(火) 22:08:40.50
86400って何のために使うんだろう

うるう日とかうるう秒とか考慮しなきゃ気持ち悪くね?
0592デフォルトの名無しさん
垢版 |
2018/03/13(火) 22:28:43.21
>>591
1日に1秒満たないかもしれないだろ
0594デフォルトの名無しさん (スップ Sd8a-bl9z)
垢版 |
2018/03/13(火) 23:06:58.39ID:+Yto8Znfd
閏秒の有無等で可変のものなら可変のものなりの書き方するでしょ
計算して変数に入れるとか

問題は不変の数値定数をどう正規化して書くか、正規化する必要はあるか。
24*60*60 派の人と 60*60*24 派の人が両方プロジェクト内にいたらなんか嫌だな
0596デフォルトの名無しさん (スップ Sd8a-bl9z)
垢版 |
2018/03/13(火) 23:17:41.96ID:+Yto8Znfd
絡むわけじゃないけど
決めたら従うのは当たり前で、それが「決める」ってことだろ。
派閥の話じゃなく混ざってたら気持ち悪いってことが言いたかったんだよ。
0598デフォルトの名無しさん (ワッチョイ be81-uQtz)
垢版 |
2018/03/13(火) 23:44:10.62ID:U9FOV+VD0
気持ち悪いと思うかどうかは感性の問題だからなあ
例えばある日地球の回転速度が変わって1分が61秒になった
プログラムを修正しろと言われて、
場所によって書き方が違っていると大変だね
と言う話なら理解出来るけど
0604デフォルトの名無しさん (ワッチョイ da7e-uQtz)
垢版 |
2018/03/14(水) 08:42:21.15ID:eC4PF2tM0
閏秒を考慮するのと1日を86400秒とするのは全く関係ないのに閏秒がどうとか言い出した奴が悪いのでは
丁寧に書くなら計算の根拠として60*60*24を見えるところに書いておけばいい
0606デフォルトの名無しさん
垢版 |
2018/03/14(水) 10:28:48.31
>>604
全く関係ないは言い過ぎ
0608デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/14(水) 11:03:01.46ID:2oR7xNCJ0
うるう秒がどうのこうのと言う、問題じゃなく86400秒をそこでしか使わないって根拠が無いんだよね
後でまたその数値が出てくるとしてその度に86400と書くのか、もしその数値を修正する事になったら全部書き直すのか、2回3回使うようになって始めて変数なり定数なりに入れるのか
それなら最初から式中に出てくる数値は変数に格納してから使えって統一した方が話が早い
0609デフォルトの名無しさん (スプッッ Sd2a-ymMl)
垢版 |
2018/03/14(水) 11:14:21.74ID:G0IAn/x5d
今時マジックナンバーとか昭和からタイムスリップしてきたのかよ
0610デフォルトの名無しさん (ワッチョイ 6a34-e70/)
垢版 |
2018/03/14(水) 11:43:33.36ID:xovkfTzX0
プログラムにおけるマジックナンバー(英: magic number、魔法の数字)とは、何らかの識別子もしくは定数として用いられる、プログラムのソースコード中に書かれた具体的な数値である。
そのプログラムを書いた時点では製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバーの意図を忘れたときに閲覧すると「この数字の意味はわからないが、とにかくプログラムは正しく動く。
まるで魔法の数字だ」という皮肉を含む。
by Wikipedia
0617デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/14(水) 14:16:09.81ID:2oR7xNCJ0
>>616
まぁ可読性高くて損する事は無いし、なるべく要素は分解して書いた方がいいんじゃないの
何かどうしても86400じゃなきゃ困る理由とかあるなら話は別だろうけど、無いだろ?
0622デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/14(水) 16:27:34.05ID:9D6+Eo6Z0
俺がわかるからみんなわかるだろうというコードはすげー困るな
例えその場の全員がわかったとしても今後わからない奴が出てきた時の事を考えて
できうるかぎりわかりやすいコードを書くべきだな
0623デフォルトの名無しさん (ワッチョイ cb74-uQtz)
垢版 |
2018/03/14(水) 17:02:40.84ID:L/3+Hz1H0
そのためのコストにもよる
空想論じみた「わかりやすさ」にまで付き合ってらんないこともある
特に最低限のプロとしてのスキルを欠く者を想定することはしない

ちょっと飛躍するがプログラム言語だってそうなっている
マシンの性能を使いやすさに振るということを無限にはやらない
どのくらいのアホまで付き合ってやるのか性能とのトレードオフで
色んなバランスで棲み分けになっている
0625デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/14(水) 17:11:14.36ID:9D6+Eo6Z0
86400を60*60*24と書くことにはなんのコストも支払ってないから書けばいいな
いちいち話を飛躍させる奴はなんなんだ
0629デフォルトの名無しさん (ワッチョイ fb7f-uQtz)
垢版 |
2018/03/14(水) 17:51:03.64ID:9D6+Eo6Z0
当然その程度のリファクタリングはするべきだしそもそもマジックナンバーをどうにかするべきだし
お前の残業代とかいう飛躍した話はどうでもいい
0634デフォルトの名無しさん (ワッチョイ 260e-hn8E)
垢版 |
2018/03/14(水) 18:48:33.76ID:2oR7xNCJ0
まぁコスト次第で可読性を犠牲にするケースもあるだろうけど
この場合はメモリ食う訳でも処理遅くなる訳でもソースの構造が変わる訳でもない
86400でも十分分かりやすいかも知れんが60*60*24なら更に分かりやすくなる

どっちが良いかなんて議論の余地無いよね
0636デフォルトの名無しさん (ドコグロ MM22-3fsH)
垢版 |
2018/03/14(水) 18:54:56.26ID:uMO7yRavM
>>626
> 16を2*2*2*2っていちいち書く人はいないでしょ
> まぁ1<<4って書けと言われるかもしれんが
状況次第だろ
場合分けの条件が4個あって各々2状態をとるとかなら2*2*2*2って書くかもしれない
下から4ビット目のマスクが欲しいなら1<<4って書くこともある
0641デフォルトの名無しさん (ワッチョイ c193-y/L7)
垢版 |
2018/03/15(木) 06:36:14.64ID:F+InEeO+0
議論の本筋(1日の秒数として即値で86400と書くことの是非)とはさらに離れるけど、
ビットシフトを使う定数は常にカッコで囲んでくれ。

res = a + 1<<4 + b;
res = a +(1<<4)+ b;
0642デフォルトの名無しさん
垢版 |
2018/03/15(木) 07:15:43.22
>>641
3つ以上の項があると静的解析ツールで怒られるから
res = (a +(1<<4))+ b;
と書く
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況