C++相談室 part148

■ このスレッドは過去ログ倉庫に格納されています
2020/01/31(金) 20:54:06.26ID:Nt0XFA2s
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part147
https://mevius.5ch.net/test/read.cgi/tech/1576659413/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
2020/02/10(月) 21:51:26.11ID:M5G7J8Pl
bool b;
if (b == true) // コードスメルではあるがバグではない

BOOL b;
if (b == TRUE) // 正しいか正しくないかは状況による
2020/02/10(月) 21:53:08.25ID:AZ4KAaI2
>>685
C++スレでC++以外の言語という「つまんないこと」でイキってんのおまえだろ
2020/02/10(月) 21:53:54.97ID:AZ4KAaI2
おまえみたいの「いちびり」って言うんだけど意味わかる?w
2020/02/10(月) 21:55:45.19ID:3bnN/FFY
>>682
バグにならなければ問題ないのでは?
>if (b == true == true)
とは私も書きませんが、だからといって異常だとは思わない

というか、あなたの「異常」の定義が異常なのでは?
2020/02/10(月) 21:56:36.80ID:3bnN/FFY
>>688
いちびり、とは、あなた、関西人ですなぁ
2020/02/10(月) 22:02:36.14ID:AZ4KAaI2
>>689
正常と異常の境をおまえさんはどこだと思っている?
2020/02/10(月) 22:02:53.98ID:VRCQc/iz
>>674
Windowsしか知らないの?
世界が狭い

非常に多くの環境でBOOLを使う
2020/02/10(月) 22:03:55.09ID:AZ4KAaI2
>>690
ああ、おまえほんまは関西人ちゃうなw
俺もほんまの関西人ちゃうけどなw
2020/02/10(月) 22:04:40.63ID:AZ4KAaI2
>>692
大文字のBOOLを使う「非常に多くの環境」とは?
2020/02/10(月) 22:06:02.65ID:VRCQc/iz
>531や>>682が異常とは思えないって
まじかQZ
2020/02/10(月) 22:07:56.51ID:M5G7J8Pl
>>692
その定義を出してみなよ。
標準の仕様じゃないんだからその環境ごとの特殊な定義であることは変わらんだろ。
2020/02/10(月) 22:14:01.58ID:VRCQc/iz
本当に知らないんだ
まじか
2020/02/10(月) 22:22:07.37ID:4ZzuDNO4
>>697
その返しは口喧嘩に負けた小学生みたいだから、ちゃんと相手の質問に答えなよ
2020/02/10(月) 22:23:41.11ID:1F9oSbm6
非常に多いなら具体例2、3あげて終わりでしょ
2020/02/10(月) 22:24:53.62ID:M5G7J8Pl
もう自分で何を言っているのかわからなくなっているんだろうな。
BOOLやTRUEの定義が環境によって異なる場合があると認めた時点で

if (b == TRUE)

これが正しいと言えるかどうかはその定義次第だということになるのに。
2020/02/10(月) 22:29:19.34ID:TAH0RZ5f
俺の狭い経験だと
BOOLはintで、TRUEは1、FALSEは0
しか見たことないけど、他の定義の環境ってあるのかな?
2020/02/10(月) 22:33:34.58ID:PZnoEIEf
−1というか全ビットonは何かで見た
2020/02/10(月) 22:50:32.94ID:Qny4UpdU
windef.hのFALSEが-1とかに変更されたら、既存のソースは崩壊だろうな
2020/02/10(月) 23:14:46.53ID:zaYnGTVS
!FALSE
2020/02/10(月) 23:38:01.28ID:yW0oU9fF
typedef unsigned BOOL:1;
ならまだ救いがあった
なんでint型にしてんだろうな
2020/02/11(火) 00:40:44.45ID:wwgXq7Q5
>>705
それは BitField みたいだけど、構造体メンバ以外で使えるようになったんだっけ?
2020/02/11(火) 01:18:20.91ID:wwgXq7Q5
>>703
FALSEは絶対的に0のまま。
2020/02/11(火) 01:20:55.07ID:wwgXq7Q5
もしかしたら、Rubyが、0をtrueと解釈してしまうことから変なことを思ってる
人がいるのかもしれないが、C/C++においては、言語仕様的に条件式で偽と
解釈されるのは、古くから、唯一、整数の 0 しかないなかったので、言語仕様が
修正されない限り TRUE が 0 以外の値にマクロ定義されることは絶対に無い。
2020/02/11(火) 02:07:59.10ID:iFdutQCH
あれ?
もしかして私・・また同じ日を繰り返してる・・??
2020/02/11(火) 02:12:10.45ID:lTJc7ZeR
まだやってんのかお前ら
ゲハ厨みたいなスレだな
2020/02/11(火) 02:43:47.12ID:wwgXq7Q5
>>708
スマン:
誤:修正されない限り TRUE が 0 以外の値にマクロ定義されることは絶対に無い。
正:修正されない限り FALSE が 0 以外の値にマクロ定義されることは絶対に無い。
2020/02/11(火) 02:58:41.73ID:f/mZFEPY
>>681
if(b)で十分なのにif(b==true)と書くのはif((a==b)==true)と書くのと同じで冗長なんだよ
これがすぐに理解できないなら論理を簡潔にする能力が欠如してるのでプログラミングの才能はないね
2020/02/11(火) 03:04:36.42ID:wwgXq7Q5
>>712
しかも、b は、少なくとも見かけ上は int 型ではなく、BOOL 型だし。
それに他の言語の場合、if の条件式に入れられるのは唯一 bool 型の
場合があり、一番 if の条件式に入れ易い型。
2020/02/11(火) 03:08:16.20ID:wwgXq7Q5
>>713
他の言語の場合、例えば x, y が整数型の場合、
x == y
とした結果の型が bool 型。
そして、if の条件式に入れられるのは bool 型のみだったりする。
だから、もともと b が bool 型なのに、敢えて b == true と判定して
また bool 型に「直して」しまうのはとても奇妙な感じになる。
その文化との兼ね合いから、C/C++ でも、b が BOOL 型の場合は、
if (b) とするのが美しく見える。
2020/02/11(火) 03:33:01.69ID:AiNLffgv
MISRA-C でも、if( 変数 )で、変数が実質的にブール型の場合は、これでOK

int a = ( 5 < 10 );
printf( "%d", a ); /* 1 */

if( 5 < 10 ) と、if( a ) は同じ意味。
a は、実質的にブール型
2020/02/11(火) 06:36:51.44ID:DrkniQZr
bool型が存在しない時代に何故bool型になるのか
2020/02/11(火) 08:01:59.71ID:Sh/x76Zj
>>695
異常を「コンパイラがコンパイルできない」と定義していますから
2020/02/11(火) 08:02:50.77ID:Sh/x76Zj
>>712
コンパイルが通るんだったら異常ではないのでは?
2020/02/11(火) 08:03:52.59ID:Sh/x76Zj
>>712
>論理を簡潔にする能力が欠如してる
簡潔すぎてわかりにくいのも困りますね、プログラミングはまず他人への分かりやすさを優先するべきでは?
2020/02/11(火) 08:29:09.76ID:lXsf9fbV
簡潔過ぎて分かりにくいって何?

if (b) で分かりにくいなら
変数名が適切でないとかそもそも分かりにくい作りとか
他に問題があるんじゃないの?
2020/02/11(火) 08:33:12.52ID:lXsf9fbV
もしかして
if (a ==b)
よりも
if ( (a == b) == true )
の方が見やすいとかいっちゃう?
2020/02/11(火) 08:56:04.07ID:tUwi24Vl
そりゃ
if (a == 42)
よりも
if (a == 42 == true)
のほうが見やすいし
if (a == 42 == true != false)
のほうがさらに見やすいのが異常者
2020/02/11(火) 08:58:48.06ID:lXsf9fbV
カッコも付けないと見にくいよな

if (((a == 42) == true) != false)
2020/02/11(火) 09:09:46.71ID:Kcy+Q8b9
どれだけ冗長に書けるか選手権?
2020/02/11(火) 09:15:23.55ID:oAfdlMqH
QZは変なこだわりに固執するやつだから、一般的な感覚とか常識とかについて議論しようとしてもそもそも議論が噛み合わないし、スレを無駄に汚すだけ
2020/02/11(火) 09:21:24.68ID:tUwi24Vl
if (true == true == true == b == true)
if (true == b == true == b == true)
int *p = &*&*(int *)&*&*&*&*&*(int *)&a;
2020/02/11(火) 09:34:27.73ID:Gt4Evnq6
ようちえんじがかんじをつかわないでってぐずってるのとおなじだね
2020/02/11(火) 10:19:17.04ID:G5APdl5q
異常とは、普通じゃないことだよ
少数派のこと
if (b == true == true) は明らかに異常
if (b == true) はたまに見るけど、まぁ異常かな
2020/02/11(火) 10:34:12.60ID:lXsf9fbV
つまりQZは異常
2020/02/11(火) 10:35:43.55ID:Kcy+Q8b9
boolやBOOLでない変数abcをif(a==b==c)と書きたい事はある。
2020/02/11(火) 10:56:56.94ID:0rT9FQIK
QZってコイツ片山だっけ?
2020/02/11(火) 11:01:53.65ID:u3DUqgh+
if(b==true)
はifのなかには比較入れないとダメだと思っているんじゃね

そう言う言語もあるし
2020/02/11(火) 11:09:22.66ID:IotAbjtu
「rust が c++ を超えた!! 神!!」みたいな記事をよく見ますけど、今後c++がrustから学んでもっと良くなることって期待して良いですよね?
rustに勉強のコストを割くか迷っています
2020/02/11(火) 11:12:06.04ID:HeZx7HUk
>>731
片山はQZほど馬鹿ではない
まず国籍が違う
2020/02/11(火) 11:29:50.94ID:Ci+AyeA2
なぜ

if (a == true)

と書くやつがでてくるのか
それは条件式に食わせるためには比較演算子で値から「真偽値」に変える必要があると
思っていてそれがboolと同値と理解していないからだろ
だからそういうやつは

if (a == 42 == true)

とは書かない
この例はむしろboolを理解してるやつからしか出てこない発想
やつらはいったん「真偽値」になればあとは論理演算子でつなげると理解している
ある意味、条件式を作るときのイディオムに馬鹿正直に従っているわけで別に
異常だと騒ぐほどひどくはない

別の見方をすればboolを特別視しないで書いてるわけで、
冗長にはなるが共通のフォーマットで書ききるってことはほかでもあることだ
そう思えばやっぱりひどくはない
実際おれは特別読みにくいとは感じないし、この無駄は最適化で消える
何かの機会にこれ冗長だよねと教えてやるぐらいで十分
2020/02/11(火) 11:37:00.49ID:kh2SGwFh
ほんといつまでやってんの
2020/02/11(火) 11:38:29.11ID:KQZ3+5BK
冗長な書き方をする人の真意なんて測りようもないし理由が一つに決められるわけもないだろう。
想像するだけ無駄。
2020/02/11(火) 12:17:11.73ID:GpQNLMm4
>>715
そう書くべきだしそれが普通ってことはわかってんだって。
自分で書く分にはそう書くよ。
でも、他者が書いたコードを読むときや利用するときは
> 変数が実質的にブール型の場合は
っていう前提を確信できない場合がある。

整数型で真偽値の代用にすることがある C/C++ では
型で判断できないことがあるから罠だよねって話をしてるんだよ。
真っ当なデザインではない場合があるから思い込まずにちゃんと確認しようねってこと。
2020/02/11(火) 15:09:17.27ID:lXsf9fbV
>>735
同値
意味しらないのね
2020/02/11(火) 15:15:33.26ID:Gt4Evnq6
> この例はむしろboolを理解してるやつからしか出てこない発想

そりゃそうだ
ifの制御式は比較でなければならないと言い張るやつへの皮肉なわけで
2020/02/11(火) 15:19:47.85ID:QCVkc9h/
operator =(BOOL value){
if(value==0){
return FALSE;
else if(value==1||value==2||...){
}
742デフォルトの名無しさん
垢版 |
2020/02/11(火) 15:21:35.11ID:IKSpGnXe
>>596
あったあった

今はわざわざそれ使う理由忘れた
2020/02/11(火) 15:25:53.55ID:Uk2CrnAG
Cだとそれで必ず0か1になるからTRUEと比較しても大丈夫!っていうクソみたいなバッドノウハウ
2020/02/11(火) 15:28:40.66ID:QCVkc9h/
operator ==(BOOL value){
 if(this->value == 0){
  if(this->value == value){
   return TRUE;
  }
 }
 else{
  if(value==1||value==2||...){
   return TRUE;
  }
 }
}
2020/02/11(火) 15:38:44.74ID:KQZ3+5BK
>>743
そもそもTRUEと比較する必要はないしWindowsから出てきたイディオムでもないと思うが。
どちらかというとtruthyな値からtrueを得るイディオムとして使われているような。
よく見かけるのはJavaScriptとか。
2020/02/11(火) 15:45:19.74ID:Gt4Evnq6
リターン式から返却値の型を推定させる場合にはautoが必要だ
2020/02/11(火) 17:36:36.42ID:Sh/x76Zj
>>725
あなたのいう「一般的」というものが、実はそれほど一般的ではなかった、という可能性はありませんかね?
というか、まずあなたのいう「一般的」をあなたの言葉で定義するべきでしょう

あなたに定義できますか?
2020/02/11(火) 18:04:17.83ID:G5APdl5q
単語の意味は辞書引けよ
APIの仕様はヘルプ読め、と同様だな
なんで個人が定義するんだよ
2020/02/11(火) 18:24:26.11ID:GpQNLMm4
http://get.secret.jp/pt/file/1581413018.png
2020/02/11(火) 18:40:23.65ID:GpQNLMm4
true と比較したけりゃすればいいじゃないの。
そのプロジェクト内で一貫したポリシーがあるのならそれでいいよ。
751デフォルトの名無しさん
垢版 |
2020/02/11(火) 18:49:13.60ID:TuMeiRsT
ちゃうねん。
752デフォルトの名無しさん
垢版 |
2020/02/11(火) 18:52:49.99ID:TuMeiRsT
ストリーム遅いな。
2020/02/11(火) 20:44:57.22ID:f/mZFEPY
コード規約「if(bool)はif(bool==true)と書かなければならない」
やだよ、そんな規約ww
規約決めるまでに紛糾してプロジェクト始められねぇよw
2020/02/11(火) 20:57:43.57ID:Z6POtQL5
どっちでもええやん
755デフォルトの名無しさん
垢版 |
2020/02/11(火) 22:08:40.56ID:Pk2ehCPz
explicit operator boolだとラムダとかの戻り値強制したいときそうなっちゃわない?

value() && true か value() || false
static_cast<bool>(value())は好きじゃない
2020/02/11(火) 22:19:09.87ID:Uk2CrnAG
素直に戻り値boolに指定しろよ
2020/02/11(火) 22:21:59.64ID:ggTX+OPA
意味的にboolの型であればboolにキャスト
そうじゃないなら意味通りにboolに変換
2020/02/11(火) 22:23:23.42ID:Sh/x76Zj
>>258
mmap を確かめています、なんだかすごく時間がかかってしまいました…
ideone はファイルを作らせてくれないみたいですね… https://ideone.com/zXFtEY

fd と fd に紐付いた mmap をつくっておいて、
@fd 側にデータを追加すれば mmap でも見えるのですが、
Ammap 側からデータを追加しても fd は増量しないようですね

今は cygwin で見てますが、ちゃんと linux をいれて確かめるつもりです…
2020/02/11(火) 22:24:35.42ID:ggTX+OPA
オンメモリで出来ることは素直にオンメモリでやれば
760デフォルトの名無しさん
垢版 |
2020/02/11(火) 23:36:09.88ID:TuMeiRsT
くじで決めてはどうか。
2020/02/11(火) 23:39:16.71ID:RnNFx+rl
モンテカルロ法やな
762デフォルトの名無しさん
垢版 |
2020/02/11(火) 23:56:08.12ID:TuMeiRsT
I/Oの遅さの陰に隠れてたけど。
ストリームよりSSDのほうが速いよって時代になって困る。
763デフォルトの名無しさん
垢版 |
2020/02/12(水) 01:53:51.39ID:CB9IiDBv
YouTuberは「最強の職業」である理由。
https://www.youtube.com/watch?v=XjV3Nb0-hgA
【事例付き】YouTuberは最強の副業である件について。
https://www.youtube.com/watch?v=wB8hNuNVoIw&;t=267s
【初心者向け】YouTubeの始め方・稼ぎ方を徹底解説!
https://www.youtube.com/watch?v=YEw-a8qlADM
「YouTubeなんていつか稼げなくなる」という主張を論破する。
https://www.youtube.com/watch?v=VatNILApW4U
収益化から丸1年!YouTubeでいくら稼いだか公開。
https://www.youtube.com/watch?v=-zQxuQqZ5eA&;t=103s
その動画で月商○○万!? YouTubeで稼ぐ裏技的アプローチ。
https://www.youtube.com/watch?v=7I4APU_6i9o&;t=433s
【貧者の工夫で戦え】ガラケーだっていい。YouTube始めるのにパソコンはいらない!
https://www.youtube.com/watch?v=jYdWfjjzD7Y
【第一回】SNS、YouTube、ブログで稼ぐ方法を、丁寧に解説します!
https://www.youtube.com/watch?v=erNiLOncDnY
2020/02/12(水) 06:38:05.77ID:m8mhjAm7
>>763
グロ
2020/02/12(水) 10:03:09.83ID:DWihvkH4
https://qph.fs.quoracdn.net/main-qimg-2c09000282ddcbb32359dc242831a052
766デフォルトの名無しさん
垢版 |
2020/02/12(水) 16:01:35.18ID:a1w2Xqz0
>>743
ああなるほど
if(TRUE == !!b) のことか

if(!!b) は javascript の方だろ
2020/02/12(水) 16:24:33.81ID:KQxiYwOn
! は見づらいから私は not と書くことにしてる。
2020/02/12(水) 17:16:20.22ID:DU9qWhLl
一応、alternative tokensに規定はあるが
使う奴の心は #define BEGIN { なんてやるやつと同質だね
2020/02/12(水) 17:20:59.01ID:DU9qWhLl
Cにも_Boolがなきゃヤダジタしてたやつとか
マジそういう言語へ行ったきり帰ってくるなって感じ

で結局BOOL < 0みたいなオカシイことが起き出す原因を作りやがる
2020/02/12(水) 17:47:16.08ID:KQxiYwOn
C と C++ で解釈が違うのに結果として動作は同じみたいなのがたまにあってすげーなって思う。
2020/02/12(水) 18:09:20.78ID:goJJte/u
たとえば?
2020/02/12(水) 19:09:04.21ID:KQxiYwOn
>>770-771
if 文の条件式を見てて思い出した。
C だと条件式の評価結果を 0 と比較するというルール
C++ だとブールに変換するというルール。

まあ整数をブールに変換する規則は結局のところ 0 と等しいかどうかなんで
ちょっと回りくどくなってるだけなんだけど、
そういう違いがあっても互換性が維持されるというのがどこかで検証されてるんだろうと思うと、
手間かかってんなぁという感想が浮かんだ。

他にも列挙定数の型が C と C++ では違うとか……。
私が把握してるのはそんくらいだけど、
探せばもっとあるんじゃないかな。
2020/02/12(水) 20:25:01.80ID:ytylQgpT
>>766
>if(TRUE == !!b) のことか

さすがにこんな意味のない書き方が人の目につくほど蔓延りはしないだろう。おそらく>>743の妄想。

!!b は、bool型(と、しばしばオーバーロード)を備えた言語で非bool型の値bをbool型に変換するテクニックだろ。
2020/02/12(水) 20:38:11.07ID:rfok9Tr/
b!=0 で良い
2020/02/12(水) 21:12:18.94ID:h1wCYtKx
そういうゴミみたいな自己満テクニック()が積もり積もって誰も触れないスパゲティモンスターになっちまうんだよ
b!=0でも(bool)bでもいいからやるべきことを直接表現しろ
2020/02/12(水) 21:26:37.63ID:rfok9Tr/
(bool)b
はCへの移植の可能性があるならやっちゃダメ
2020/02/12(水) 21:31:03.80ID:DU9qWhLl
>>776
何で?
ISO/IEC 9899:2011 (E)
7.18 Boolean type and values <stdbool.h>
1 The header <stdbool.h> defines four macros.
2 The macro
bool
expands to _Bool.
2020/02/12(水) 21:34:37.96ID:rfok9Tr/
typedef char bool;
の可能性があるから
2020/02/12(水) 21:35:17.48ID:ytylQgpT
Cに移植する可能性があるならC++の機能を使っちゃダメなのは当たり前だよなぁ
C++スレで言うことではないと思うが
2020/02/12(水) 21:36:55.01ID:rfok9Tr/
>>779
問題点はそこじゃない
移植時にコンパイラが問題点を見つけられないのが問題
2020/02/12(水) 21:38:26.52ID:rfok9Tr/
コンパイラが問題点を見つけられない例は他に山ほどあるが
だからといってわざわざ増やさなくても良い
2020/02/12(水) 21:39:05.32ID:ytylQgpT
いや、問題があるなら移植する人が見つけろよ
2020/02/12(水) 21:40:47.83ID:rfok9Tr/
移植は完璧な人がする
なんて妄想は捨てた方が良い
2020/02/12(水) 21:42:13.60ID:rfok9Tr/
Cに移植する可能性が無いならどうでも良い
ちなみにキャストで警告が出る環境もある
2020/02/12(水) 21:42:36.95ID:ytylQgpT
だからそれは移植する側の問題だろ。勝手にやれよ
■ このスレッドは過去ログ倉庫に格納されています