- 1 名前:デフォルトの名無しさん mailto:sage [2020/01/31(金) 20:54:06.26 ID:Nt0XFA2s.net]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part147 https://mevius.5ch.net/test/read.cgi/tech/1576659413/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1556142878/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語)
- 464 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 12:56:37 ID:zzucbZgG.net]
- >>442,450
対話デバッグでaに応じて実行をブレークしたかった人が残したデバッグの痕跡だろうね。 ソースを他人に公開する際にはブレークポイントの情報はなくなるから、他人には意味不明だけど。
- 465 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 12:58:48 ID:zzucbZgG.net]
- >>451
狂気じゃなくて修正の積み重ね。少しづつ修正していると大ポカに気づけない。 だからこそ親切なコンパイラの警告に従う謙虚さが大切になる。
- 466 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 13:32:28.54 ID:gtTyaGQ0.net]
- >>452
そっち? a != true じゃなくて?
- 467 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 14:33:50 ID:pjdiRHlo.net]
- BOOL b に対して、正しくはこう :
if ( b ) // 良い if ( b != 0 ) // 良い if ( b == TRUE ) // 駄目
- 468 名前:デフォルトの名無しさん [2020/02/08(土) 14:48:48 ID:v1IBJgnW.net]
- >>383
graphviz / python
- 469 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 14:51:43 ID:P2cF6ghb.net]
- graphvizは主要なLinuxの標準リポジトリに入ってるから助かる
- 470 名前:デフォルトの名無しさん [2020/02/08(土) 14:52:17 ID:v1IBJgnW.net]
- >>403
浮動小数点数なら桁落ちとか気にしてんのかなーとか勘繰る
- 471 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 15:10:32 ID:pjdiRHlo.net]
- >>403
整数の場合だと、括弧を付けてある部分に何らかのまとまった意味があるのかも知れない。 数学や物理学では、計算を減らすために式変形していくが、最終的な式は元々の意味が分からなくなってしまうことがある。 その場合には括弧で囲ったくらいで意味が分かり易くなることは少ない。 しかし、そのケースの場合は、括弧で括ると何か意味が分かり易くなると考えた間ロウ製がある。
- 472 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 15:11:02 ID:pjdiRHlo.net]
- >>459
間ロウ製 ---> 可能性
- 473 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 15:12:02 ID:JKzazDKJ.net]
- >>455
>if ( b == TRUE ) // 駄目 -1をTRUE扱いしたくないのであればこれが唯一正しい
- 474 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 15:45:10 ID:yr4lhGWD.net]
- MSDNの書き間違いかもしれないが、Win32 APIの一部にも「成功時はTRUEを返す」という
仕様の関数があるんだよな。
- 475 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 15:54:04 ID:pjdiRHlo.net]
- >>461
そもそも、-1 は TRUE 扱いすると言うのが C/C++ の伝統や文化。 -1 と TRUE を分けて扱うのは、特殊な独自仕様。 >>462 Win32 API の一部どころか、ハンドル値を返す以外のほとんど全ての関数が、 成功すれば TRUE を返す。
- 476 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 16:07:20 ID:yr4lhGWD.net]
- おいおい、#define TRUE 1のTRUEと真(true)の区別がぐちゃぐちゃだぞ。
BOOLを返すWin32 APIの多くは「成功時はFALSE(0)以外の値を返す」という仕様になっている。
- 477 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 16:16:01 ID:24Q9Tmjg.net]
- 宗派論争だな
- 478 名前:デフォルトの名無しさん [2020/02/08(土) 16:19:44 ID:RKzyJDHj.net]
- C++にはtrueがあるので積極的に使っていこうと思います。
- 479 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 16:36:41.39 ID: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 名前:デフォルトの名無しさん [2020/02/08(土) 16:45:19 ID:RKzyJDHj.net]
- キャッシュかキャッシュでないかで速度が変わる。
これは驚き。
- 481 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 16:50:34 ID:LleYumKd.net]
- バカ==TRUE
- 482 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 17:21:59 ID:+a4Pmd4C.net]
- ○ if(b) if(!b)
○ if(b == FALSE) if(b != FALSE) × if(b == TRUE) if(b != TRUE) WinAPI使いには常識だと思ってたんだが
- 483 名前:デフォルトの名無しさん [2020/02/08(土) 17:32:20 ID:RKzyJDHj.net]
- そういうのをみんなで共有しましょうって事で、たらこさんが2chを作ったんですよ。
- 484 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 17:40:43.90 ID:yr4lhGWD.net]
- >>470
常識というか思い込み。 大半のFALSE/FALSE以外を返す関数なら上で良いが、>>462のようにTRUEを返すなら当然 TRUEと比較しなきゃ正しくない。
- 485 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 17:57:14.84 ID:+a4Pmd4C.net]
- 本当にそんなのあるの?
戻り値BOOLでFALSE(0)とTRUE(1)以外の値をTRUEと違う意味を表現するために意図的に返す奴があるってこと? 具体例どうぞ
- 486 名前: mailto:sage [2020/02/08(土) 18:25:19.22 ID:JRIqyhqH.net]
- >>446
>C/C++ では、b が「非0」、つまり「0 以外」だとすべて真(true) と考えるのが伝統。 >if ( b == TRUE ) と書くのは間違い。 それは b の型が int だったら、そのとおりだけれども、>>438 をみるかぎり bool b なんでしょう? はっ!これが老害というやつですか…
- 487 名前:はちみつ餃子 mailto:sage [2020/02/08(土) 18:26:30.54 ID:2SU4KPt5.net]
- >>473
GetMessage という基本的な API からして変則的だから……
- 488 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 18:31:14 ID:yr4lhGWD.net]
- >>462に書いたMSDNのは単にドキュメントの間違いという可能性もあるけどね。
それとは別に、TRUE/FALSe以外に-1を返すAPIがあるのは有名だろう。 いずれにしても仕様をちゃんと確認してそれに従った扱いをすべきで、思い込みは禁物ってこと。
- 489 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/08(土) 18:33:32 ID:2SU4KPt5.net]
- >>475
GetMessage の返却値の場合は一応は TRUE の特殊な場合として -1 の状況もある って感じだから TRUE とは別の場合を意味する第三の状況というわけではないな。
- 490 名前:デフォルトの名無しさん [2020/02/08(土) 18:34:27 ID:RKzyJDHj.net]
- 判定マクロないの。
- 491 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/08(土) 18:44:49 ID:2SU4KPt5.net]
- >>466
bool も式にまざるといつのまにか int に暗黙に型変換されちゃったりして、 やっぱりこう、あまりしっかり区別されてる気がしねぇなあと思うことも多いよ。 Windows API で使われている BOOL よりはかなりマシではあるけど。
- 492 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 18:46:46 ID:JKzazDKJ.net]
- GetMessage()が-1を返したときはエラーなんじゃわ;
- 493 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 18:51:51 ID:+a4Pmd4C.net]
- 「WM_QUITでない」という条件における真(0以外)の中の特殊な場合(エラー)に-1ってことなのね
理屈はわからんでもないけど変なの 本当はそんなのの戻り値に「BOOL」なんていうtypedefを使うのがそもそもおかしいんだけどWinAPIだから仕方ないな
- 494 名前:デフォルトの名無しさん [2020/02/08(土) 18:52:06 ID:RKzyJDHj.net]
- >>480
行末の;イイね。
- 495 名前:デフォルトの名無しさん [2020/02/08(土) 18:52:56 ID:RKzyJDHj.net]
- 30年前のAPIだしね。
- 496 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/08(土) 18:55:20 ID:2SU4KPt5.net]
- 今なら適当なフレームワークをかぶせて使うもんだと思う。
素でメッセージの処理とか面倒くさすぎるし。
- 497 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 19:15:43.34 ID:mZtPBS5R.net]
- klocworkがboolメンバ変数にportingがどうのって言ってくるのがうざい
- 498 名前:デフォルトの名無しさん [2020/02/08(土) 20:18:51.44 ID:RKzyJDHj.net]
- >>485
これ何億円するの?
- 499 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 21:17:13.95 ID:24Q9Tmjg.net]
- >>474
やっぱQZってとんでもなくバカだな >>439からの流れ読めよ。BOOLについて会話されてるぜ
- 500 名前:デフォルトの名無しさん [2020/02/08(土) 21:25:19.61 ID:RKzyJDHj.net]
- 正の型の値と負の型の値を比較する場合、ビット幅の大きいほうの型に変換されてから比較される
- 501 名前:ですかね? []
- [ここ壊れてます]
- 502 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 21:30:32.47 ID:uvgcwZ2m.net]
- 汎整数拡張でググれ
- 503 名前:デフォルトの名無しさん [2020/02/08(土) 21:35:32.85 ID:RKzyJDHj.net]
- >>489
ググってみたんだけど。 https://kumikomiya.com/implicit-conversion/ これを見ると変換は起きないって事なのかな?
- 504 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 23:34:23.41 ID:jnRyPLnj.net]
- >>472
いや。TRUE は、必ず if 式で真と判定されるので、if (b == TRUE) としなくても if (b) で絶対十分であることは補償されている。 むしろ、if (b == TRUE) と書くのはバグの原因になるので駄目だと言われている。
- 505 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 23:51:17.72 ID:jnRyPLnj.net]
- なんというか、TRUE は、処理系ごとに変化する値ではなく、C/C++ においては、標準的には必ず 1 に #define されている。
一応分かり易さのために TRUE と書いているだけで、TRUEが2になったりする事は考える必要はない。 ただし、逆に、高速化のために 1 ではなく、非0の値を返してたまたまの値、 例えば、12 とかを返してくる関数が有りえる。 その場合、うっかり間違って if ( b == TRUE ) などと書いてしまっていたら 大変なことになるので、意味的に TRUE を返す場合には、 if ( b ) または、if ( b != 0 ) と書く方が安全だと考えられている。
- 506 名前:デフォルトの名無しさん mailto:sage [2020/02/08(土) 23:53:58.53 ID:jnRyPLnj.net]
- 非常に古い時代に、TRUE を -1 と定義していた処理系もあったかもしれないが、
現在の C/C++ では、1 に定義するのが基本とされている。 b == TRUE という判定の仕方は、C/C++ の言語仕様から考えれば推奨されない。
- 507 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/09(日) 00:57:27 ID:OoesT11A.net]
- >>492-493
言語仕様にある true を避けているのだから、 その環境においては標準と異なる事情があるのだと察するべきじゃないの。 まあそういうことがあったらもっと別の名前を付けるべきだとは思うけど。 C/C++ はその性質上、様々なシステムの仲立ちをする機会があるし、 いろんな事情に左右される。 TRUE を 1 と定義する機会が多いのは確かだろうし、 そのときの習慣が確立されてもいるのもわかってるけど、 それが当たり前かっつーとそうとも言えんのじゃないかな。
- 508 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 01:17:16 ID:J5M0tDgl.net]
- 趣味人だとかいってるがハチミツ餃子はたまに良い事いうから困る
- 509 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 01:23:08 ID:e66sowWB.net]
- >>494
TRUE が 1 以外に定義されていても、TRUE の値は、if 文では真と解釈されることだけは保障されているので、if (b) は問題ない。 逆に BOOL b の場合、b が非0であるが、TRUE のマクロ値とは異なった値になっている場合がないとは保障はされない。 なので、if ( b == TRUE ) だと、TRUE ではないが b に真とみなせる値が入っている場合にすり抜けてしまう恐れがあり、重大バグの原因となる。
- 510 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 01:23:18 ID:bHnzUNQO.net]
- >>494
避けるもクソもそもそも昔なかったし
- 511 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 01:33:30.02 ID:Jw8Rx7z0.net]
- あったぞ
MSが実装サボっただけで
- 512 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 01:58:53.21 ID:bHnzUNQO.net]
- 当時のc言語には仕様に無くない?
- 513 名前:はちみつ餃子 mailto:sage [2020/02/09(日) 02:19:40.02 ID:OoesT11A.net]
- >>495
ハチミツじゃなくてはちみつな。 >>496 それが真偽値だというのが思い込みで、 実際には様々な可能性が有り得るってことだよ。 普通はこうだからこうみたいな話じゃなくて、 少なくとも言語仕様に無いのはわかってるんだから、 その環境でどうなってるかくらい確認したれやという話。 >>497 私は >>493 からあくまで現代の話だと読み取ったのでそのつもりで返答してるけど、 C/C++ のコードは長期的に使われやすいので現代という範囲の認識に齟齬はあるかもしれん。
- 514 名前:デフォルトの名無しさん [2020/02/09(日) 02:27:09 ID:cYNa4VVg.net]
- 過去と未来の狭間にあるってことかな。
- 515 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 04:25:17 ID:ids8kf+0.net]
- WindowsAPIはC++限定じゃなくCを主軸に捉えてるだろ
クラスとか一切無いしマクロだらけだし そもそもboolが無かったってのはそういうことやろ
- 516 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 07:14:29 ID:6++kPC7v.net]
- >>462
> MSDNの書き間違いかもしれないが、Win32 APIの一部にも「成功時はTRUEを返す」という > 仕様の関数があるんだよな。 具体的にどれ?
- 517 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 07:15:18 ID:6++kPC7v.net]
- >>502
Cと言うよりPascalだし
- 518 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 07:19:31.89 ID:PT76WH2y.net]
- >>434
自己紹介乙
- 519 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 07:24:44.99 ID:PT76WH2y.net]
- >>493
TRUEが-1というと昔のBASICにそういうのあったね だがその時代すでにCも存在していた
- 520 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 08:43:40 ID:J3Qn0niW.net]
- >>496
何回ループしてるんだよ。 真(truthy)であることが要求されているなら if (b) だし、TRUEであることが要求されるなら if (b == TRUE) だ。それを取り違えることがバグだ。
- 521 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 08:54:48 ID:aEgJYC9i.net]
- >>503
これとか、 https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/nf-dbghelp-makesuredirectorypathexists
- 522 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 08:59:21 ID:aEgJYC9i.net]
- まあ失敗時はFALSE、とも書いてあるから、こう書くのが正解!
bRet32 = MakeSureDirectoryPathExists("C:\\tmp"); if (bRet == TRUE) { // 成功すた ... } else if (bRet == FALSE) {{ // 失敗すた ... } else { assert(0); }
- 523 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 09:03:53 ID:aEgJYC9i.net]
- あと>>461は、>>455の三択で選ぶならif (b == TRUE)だが
正しくは↓こう書くべき bRet = GetMessage(...); if (b == -1) { // エラー1が発生すた、 .... } else if (bRet == FALSE) { // エラー2が発生すた、 .... } else if (bRet = TRUE) { // 成功すた、 ... } else { assert(0); } つまり出題者>>455の知識と想像力の欠如が諸悪の根源
- 524 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 09:06:48 ID:aEgJYC9i.net]
- 訂正orz
誤: bRet 正: bRet32 >>509訂正、 誤: {{ 正: { >>510訂正 誤: bRet = TRUE 正: bRet32 == TRUE
- 525 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 09:28:45 ID:PT76WH2y.net]
- C89にboolがないことに拒否反応を起こす頭の固い奴に迎合して作られたboolでないBOOL
- 526 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 09:35:18 ID:aEgJYC9i.net]
- 先にWindowsがシステムコールとしての素朴な要請からbool型の実装型を定義して、
その後コンパイラメーカーがbool型の実装を別の方式にし出すよりは よっぽどマシやったろうが! 個人的にはBOOLは好きだがな TRUE/FALSEを表すのに4バイトも使うところが いかにもリッチなOSっぽく、使っていてリッチな気分になれる
- 527 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 09:41:35 ID:6++kPC7v.net]
- >>508
ありがと 全部は見てないけどDbgHelp関連の奴はその書き方してるみたいね https://docs.microsoft.com/en-us/windows/win32/debug/dbghelp-functions
- 528 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 09:47:29.30 ID:Ej5ffr5G.net]
- >>510
> } else if (bRet == FALSE) { > // エラー2が発生すた、 > .... エラーじゃないぞ 人の知識とか想像力とか言う前に自分の知識を見直せよw
- 529 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 09:55:00.47 ID:aEgJYC9i.net]
- といっても成功していないのだからエラー扱いで差し支えないなのでは…
- 530 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 10:28:32 ID:Ej5ffr5G.net]
- >>516
なんでそんなに自信満々なんだよw マジでドキュメント見てこい https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessage
- 531 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 10:45:20 ID:Jw8Rx7z0.net]
- >>510
GetMessageのマニュアルをちゃんと読めクソ雑魚 エラーの時は-1、WM_QUITの時はFALSE(0)を返すが、それ以外の時は「nonzeroを返す」としか言ってない nonzeroというのはたくさんの値の集合であって、その判定をある特定の値と==で行うことはTRUEが1だろうと他の値だろうと完全な間違いだ つまりお前のその糞プログラムは完全にバグっているし、お前がバカにしてる>>455らが言った通りの間違いをそのま
- 532 名前:まやらかしてる []
- [ここ壊れてます]
- 533 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 10:54:04 ID:Jw8Rx7z0.net]
- クソ雑魚>>510はマニュアルを読まない可能性があるので、マニュアルの使用例貼っておきますね
GetMessageがFALSE(0)返したときの何がエラーだって?笑わせんなカス TRUE以外ならassertで落としていいなんてどこに書いてある?勝手な妄想すんなゴミ BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } }
- 534 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 11:39:41 ID:aEgJYC9i.net]
- >>519
>TRUE以外ならassertで落としていいなんてどこに書いてある? それはこちらが聞きたい; 何を見てそう思ったのか?
- 535 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 11:53:18.89 ID:PT76WH2y.net]
- >>519
変数いらねーから for(;;) switch(GetMessage(&msg, hWnd, 0, 0)) { default: TranslateMessage(&msg); DispatchMessage(&msg); break; case 0: return int(msg.wParam); case -1: throw std::system_error(std::error_code(int(GetLastError()), std::system_category()), "GetMessage"); }
- 536 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 12:02:53.96 ID:Cr/e9GtE.net]
- while(GetMessage( &msg, hWnd, 0, 0 ) >0)
{ TranslateMessage(&msg); DispatchMessage(&msg); }
- 537 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 12:05:04.77 ID:aEgJYC9i.net]
- とオモタがわかった
GetMessage()は WM_QUIT以外を受け取ったとき非0を返す、としか書かれていないから bRet32 == TRUEでは正しい判定にならないのねん 使ったのがスゲー昔なので忘れていたが、そのときは多分>>519式に書いたから安心してホスイ
- 538 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 12:06:02.94 ID:aEgJYC9i.net]
- >>522
気持ちはワカル
- 539 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 15:07:49.90 ID:Z95s67CZ.net]
- しょうもない事で攻撃的になるやつなんなの
いつも吹いてしまうw
- 540 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 15:13:04.53 ID:G+Zw2pJ3.net]
- (笑)
- 541 名前:はちみつ餃子 mailto:sage [2020/02/09(日) 15:27:19.45 ID:OoesT11A.net]
- >>506
BASIC というか、古の言語にはビット演算と論理演算の区別がないものが結構あった。 全てのビットが立った状態 (-1) を真ということにしておけば ビット演算用の AND, OR, NOT がそのまま論理演算のそれとして使える。 昔はこれが気の利いた方法だったんだろう。
- 542 名前:デフォルトの名無しさん [2020/02/09(日) 16:19:35.32 ID:wTv3WydA.net]
- #define FALSE 0 ← 正しい
#define TRUE 1 ← 間違い くず! 0点!! 出入り禁止!!! #define TRUE (!0) ← 正しい if(b) ← 正しい if(b != FALSE) ← 正しい if(b == TRUE) ← 間違い くず! 0点!! 出入り禁止!!!
- 543 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:16:55 ID:J3Qn0niW.net]
- >if(b != FALSE) ← 正しい
これこそ糞コード
- 544 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:20:45 ID:GpaXptWq.net]
- 意味的にboolなら
if (a) if (!a) で判断すべきだと思う
- 545 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:24:22 ID:GpaXptWq.net]
- if (a == TRUE)
if (a == TRUE == TRUE) if (a == TRUE == TRUE == TRUE)
- 546 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:32:39 ID:DvSFPggO.net]
- とぅっとぅるぅ〜♪
- 547 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:40:32 ID:J3Qn0niW.net]
- もともと>>438と>>439を混同すんなという話なんだが、混同してる奴が次から次へと湧いて出てくるw
- 548 名前:デフォルトの名無しさん [2020/02/09(日) 17:46:22.21 ID:cYNa4VVg.net]
- ちゃうねん。
- 549 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:46:32.42 ID:ugWNThcV.net]
- >>528
#define TRUE (!0) ← 正しい C/C++ では、!0 は、必ず1 になることが仕様化されているので、仕様に準拠している 処理系ではこれは必ず、 #define TRUE 1 と書くのと同じになるので、敢えて (!0) と書く意味は無い。
- 550 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:48:20.60 ID:GpaXptWq.net]
- boolだろうがBOOLだろうがYESNOだろうが
意味がboolであればboolと同じ扱い
- 551 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:48:58.88 ID:6++kPC7v.net]
- >>529
糞コードだが > if(b == TRUE) ← 間違い くず! 0点!! 出入り禁止!!! より1億倍マシ
- 552 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:50:49.32 ID:GpaXptWq.net]
- >>528
1がイヤなら0もイヤだろう #define FALSE (0!=0) としないと
- 553 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 17:55:11.50 ID:J3Qn0niW.net]
- >>
- 554 名前:537
マシとか言う以前にそもそも動作が違うんだが。 bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう? []- [ここ壊れてます]
- 555 名前:デフォルトの名無しさん [2020/02/09(日) 17:59:01.69 ID:cYNa4VVg.net]
- >>539
!(b != TRUE)。
- 556 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:02:21.32 ID:GpaXptWq.net]
- 普通はTRUEかFALSEしか入ってないんだよ
それ以外が入ってる可能性があるなら 普通TRUEがどうかの判断だけじゃダメじゃないか?
- 557 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:05:49.02 ID:GpaXptWq.net]
- switch (b){
case FALSE: ... case TRUE: ... case ??? ... default ... } これで
- 558 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:07:19.16 ID:ugWNThcV.net]
- >>539
それは難しくいえば数学の集合論の話になる。 {0} と {非0} の二つの集合が有り、 if の条件式では、前者が偽、後者が真と評価される。 TRUEはどんな処理系であれ、必ず後者の集合の要素(元)になっていることだけは 保障されている。 なので、if ( b != 0 ) や、if (b) は正しいが、 if (b == TRUE) は絶対駄目、ということになる。
- 559 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:09:46.56 ID:GpaXptWq.net]
- >>543
BOOLなのに 1と2を区別したい事があるんだってさ
- 560 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:10:45.32 ID:ugWNThcV.net]
- if ( b == TRUE ) は、この条件式自体の動作は問題ないが、
b が TRUE ではないが、真である何らかの値を持っていたときに破綻してしまう。 BOOL b と書いた場合、本人が書いたプログラムでは b は、必ず TRUE か FALSE の二値に限って書くことになろうが、往々にして、 APIなどでは、「真」の意味で「非0」の値を返してくること関数が含まれて しまっている。 だから、勘違いや混乱が起き易い。 そのため、if ( b == TRUE ) というのは、絶対にやめておいたほうが良い書き方 となる。
- 561 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:16:58.01 ID:GpaXptWq.net]
- TRUE/FALSE以外を想定するなら
時と場合による TRUE/FALSEしか想定しないなら if (b) / if (!b) と書くべき
- 562 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:19:53.44 ID:TF4jiljH.net]
- 昔VB6からWinAPI呼ぶときの注意点として本で読んだ気がする
それboolじゃないよね?とは思った
- 563 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:20:59.38 ID:J3Qn0niW.net]
- >>545
じゃあ聞いてみよう。 bがTRUEと一致するかどうか判断する必要がある場合はどう書く?
- 564 名前:デフォルトの名無しさん mailto:sage [2020/02/09(日) 18:29:21.05 ID:J3Qn0niW.net]
- >>546
排中律が成り立たないからFALSEでないことはTRUEを意味しない。 成功した場合にTRUE、失敗した場合にFALSEを返すという関数がある場合、成功したかどうかは FALSEでないことではなくTRUEと一致するかどうかで判断しなければならない。
|

|