C++相談室 part148at TECH
C++相談室 part148 - 暇つぶし2ch499:デフォルトの名無しさん
20/02/08 21:17:13.95 24Q9Tmjg.net
>>474
やっぱQZってとんでもなくバカだな
>>439からの流れ読めよ。BOOLについて会話されてるぜ

500:デフォルトの名無しさん
20/02/08 21:25:19.61 RKzyJDHj.net
正の型の値と負の型の値を比較する場合、ビット幅の大きいほうの型に変換されてから比較される�


501:ナすかね?



502:デフォルトの名無しさん
20/02/08 21:30:32.47 uvgcwZ2m.net
汎整数拡張でググれ

503:デフォルトの名無しさん
20/02/08 21:35:32.85 RKzyJDHj.net
>>489
ググってみたんだけど。
URLリンク(kumikomiya.com)
これを見ると変換は起きないって事なのかな?

504:デフォルトの名無しさん
20/02/08 23:34:23.41 jnRyPLnj.net
>>472
いや。TRUE は、必ず if 式で真と判定されるので、if (b == TRUE) としなくても
if (b) で絶対十分であることは補償されている。
むしろ、if (b == TRUE) と書くのはバグの原因になるので駄目だと言われている。

505:デフォルトの名無しさん
20/02/08 23:51:17.72 jnRyPLnj.net
なんというか、TRUE は、処理系ごとに変化する値ではなく、C/C++ においては、標準的には必ず 1 に #define されている。
一応分かり易さのために TRUE と書いているだけで、TRUEが2になったりする事は考える必要はない。
ただし、逆に、高速化のために 1 ではなく、非0の値を返してたまたまの値、
例えば、12 とかを返してくる関数が有りえる。
その場合、うっかり間違って if ( b == TRUE ) などと書いてしまっていたら
大変なことになるので、意味的に TRUE を返す場合には、
if ( b ) または、if ( b != 0 ) と書く方が安全だと考えられている。

506:デフォルトの名無しさん
20/02/08 23:53:58.53 jnRyPLnj.net
非常に古い時代に、TRUE を -1 と定義していた処理系もあったかもしれないが、
現在の C/C++ では、1 に定義するのが基本とされている。
b == TRUE という判定の仕方は、C/C++ の言語仕様から考えれば推奨されない。

507:はちみつ餃子 ◆8X2XSCHEME
20/02/09 00:57:27 OoesT11A.net
>>492-493
言語仕様にある true を避けているのだから、
その環境においては標準と異なる事情があるのだと察するべきじゃないの。
まあそういうことがあったらもっと別の名前を付けるべきだとは思うけど。

C/C++ はその性質上、様々なシステムの仲立ちをする機会があるし、
いろんな事情に左右される。
TRUE を 1 と定義する機会が多いのは確かだろうし、
そのときの習慣が確立されてもいるのもわかってるけど、
それが当たり前かっつーとそうとも言えんのじゃないかな。

508:デフォルトの名無しさん
20/02/09 01:17:16 J5M0tDgl.net
趣味人だとかいってるがハチミツ餃子はたまに良い事いうから困る

509:デフォルトの名無しさん
20/02/09 01:23:08 e66sowWB.net
>>494
TRUE が 1 以外に定義されていても、TRUE の値は、if 文では真と解釈されることだけは保障されているので、if (b) は問題ない。
逆に BOOL b の場合、b が非0であるが、TRUE のマクロ値とは異なった値になっている場合がないとは保障はされない。
なので、if ( b == TRUE ) だと、TRUE ではないが b に真とみなせる値が入っている場合にすり抜けてしまう恐れがあり、重大バグの原因となる。

510:デフォルトの名無しさん
20/02/09 01:23:18 bHnzUNQO.net
>>494
避けるもクソもそもそも昔なかったし

511:デフォルトの名無しさん
20/02/09 01:33:30.02 Jw8Rx7z0.net
あったぞ
MSが実装サボっただけで

512:デフォルトの名無しさん
20/02/09 01:58:53.21 bHnzUNQO.net
当時のc言語には仕様に無くない?

513:はちみつ餃子
20/02/09 02:19:40.02 OoesT11A.net
>>495
ハチミツじゃなくてはちみつな。
>>496
それが真偽値だというのが思い込みで、
実際には様々な可能性が有り得るってことだよ。
普通はこうだからこうみたいな話じゃなくて、
少なくとも言語仕様に無いのはわかってるんだから、
その環境でどうなってるかくらい確認したれやという話。
>>497
私は >>493 からあくまで現代の話だと読み取ったのでそのつもりで返答してるけど、
C/C++ のコードは長期的に使われやすいので現代という範囲の認識に齟齬はあるかもしれん。

514:デフォルトの名無しさん
20/02/09 02:27:09 cYNa4VVg.net
過去と未来の狭間にあるってことかな。

515:デフォルトの名無しさん
20/02/09 04:25:17 ids8kf+0.net
WindowsAPIはC++限定じゃなくCを主軸に捉えてるだろ
クラスとか一切無いしマクロだらけだし
そもそもboolが無かったってのはそういうことやろ

516:デフォルトの名無しさん
20/02/09 07:14:29 6++kPC7v.net
>>462
> MSDNの書き間違いかもしれないが、Win32 APIの一部にも「成功時はTRUEを返す」という
> 仕様の関数があるんだよな。
具体的にどれ?

517:デフォルトの名無しさん
20/02/09 07:15:18 6++kPC7v.net
>>502
Cと言うよりPascalだし

518:デフォルトの名無しさん
20/02/09 07:19:31.89 PT76WH2y.net
>>434
自己紹介乙

519:デフォルトの名無しさん
20/02/09 07:24:44.99 PT76WH2y.net
>>493
TRUEが-1というと昔のBASICにそういうのあったね
だがその時代すでにCも存在していた

520:デフォルトの名無しさん
20/02/09 08:43:40 J3Qn0niW.net
>>496
何回ループしてるんだよ。
真(truthy)であることが要求されているなら if (b) だし、TRUEであることが要求されるなら
if (b == TRUE) だ。それを取り違えることがバグだ。

521:デフォルトの名無しさん
20/02/09 08:54:48 aEgJYC9i.net
>>503
これとか、
URLリンク(docs.microsoft.com)

522:デフォルトの名無しさん
20/02/09 08:59:21 aEgJYC9i.net
まあ失敗時はFALSE、とも書いてあるから、こう書くのが正解!
bRet32 = MakeSureDirectoryPathExists("C:\\tmp");
if (bRet == TRUE) {
 // 成功すた
 ...
} else if (bRet == FALSE) {{
 // 失敗すた
 ...
} else {
 assert(0);
}

523:デフォルトの名無しさん
20/02/09 09:03:53 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:デフォルトの名無しさん
20/02/09 09:06:48 aEgJYC9i.net
訂正orz
 誤: bRet
 正: bRet32

>>509訂正、
 誤: {{
 正: {

>>510訂正
 誤: bRet = TRUE
 正: bRet32 == TRUE

525:デフォルトの名無しさん
20/02/09 09:28:45 PT76WH2y.net
C89にboolがないことに拒否反応を起こす頭の固い奴に迎合して作られたboolでないBOOL

526:デフォルトの名無しさん
20/02/09 09:35:18 aEgJYC9i.net
先にWindowsがシステムコールとしての素朴な要請からbool型の実装型を定義して、
その後コンパイラメーカーがbool型の実装を別の方式にし出すよりは
よっぽどマシやったろうが!

個人的にはBOOLは好きだがな
TRUE/FALSEを表すのに4バイトも使うところが
いかにもリッチなOSっぽく、使っていてリッチな気分になれる

527:デフォルトの名無しさん
20/02/09 09:41:35 6++kPC7v.net
>>508
ありがと
全部は見てないけどDbgHelp関連の奴はその書き方してるみたいね
URLリンク(docs.microsoft.com)

528:デフォルトの名無しさん
20/02/09 09:47:29.30 Ej5ffr5G.net
>>510
> } else if (bRet == FALSE) {
>  // エラー2が発生すた、
>  ....
エラーじゃないぞ
人の知識とか想像力とか言う前に自分の知識を見直せよw

529:デフォルトの名無しさん
20/02/09 09:55:00.47 aEgJYC9i.net
といっても成功していないのだからエラー扱いで差し支えないなのでは…

530:デフォルトの名無しさん
20/02/09 10:28:32 Ej5ffr5G.net
>>516
なんでそんなに自信満々なんだよw
マジでドキュメント見てこい
URLリンク(docs.microsoft.com)

531:デフォルトの名無しさん
20/02/09 10:45:20 Jw8Rx7z0.net
>>510
GetMessageのマニュアルをちゃんと読めクソ雑魚
エラーの時は-1、WM_QUITの時はFALSE(0)を返すが、それ以外の時は「nonzeroを返す」としか言ってない
nonzeroというのはたくさんの値の集合であって、その判定をある特定の値と==で行うことはTRUEが1だろうと他の値だろうと完全な間違いだ
つまりお前のその糞プログラムは完全にバグっているし、お前がバカにしてる>>455らが言った通りの間違いをそのま


532:まやらかしてる



533:デフォルトの名無しさん
20/02/09 10:54:04 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:デフォルトの名無しさん
20/02/09 11:39:41 aEgJYC9i.net
>>519
>TRUE以外ならassertで落としていいなんてどこに書いてある?
それはこちらが聞きたい;
何を見てそう思ったのか?

535:デフォルトの名無しさん
20/02/09 11:53:18.89 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:デフォルトの名無しさん
20/02/09 12:02:53.96 Cr/e9GtE.net
while(GetMessage( &msg, hWnd, 0, 0 ) >0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

537:デフォルトの名無しさん
20/02/09 12:05:04.77 aEgJYC9i.net
とオモタがわかった
GetMessage()は WM_QUIT以外を受け取ったとき非0を返す、としか書かれていないから
bRet32 == TRUEでは正しい判定にならないのねん
使ったのがスゲー昔なので忘れていたが、そのときは多分>>519式に書いたから安心してホスイ

538:デフォルトの名無しさん
20/02/09 12:06:02.94 aEgJYC9i.net
>>522
気持ちはワカル

539:デフォルトの名無しさん
20/02/09 15:07:49.90 Z95s67CZ.net
しょうもない事で攻撃的になるやつなんなの
いつも吹いてしまうw

540:デフォルトの名無しさん
20/02/09 15:13:04.53 G+Zw2pJ3.net
(笑)

541:はちみつ餃子
20/02/09 15:27:19.45 OoesT11A.net
>>506
BASIC というか、古の言語にはビット演算と論理演算の区別がないものが結構あった。
全てのビットが立った状態 (-1) を真ということにしておけば
ビット演算用の AND, OR, NOT がそのまま論理演算のそれとして使える。
昔はこれが気の利いた方法だったんだろう。

542:デフォルトの名無しさん
20/02/09 16:19:35.32 wTv3WydA.net
#define FALSE 0 ← 正しい
#define TRUE 1 ← 間違い くず! 0点!! 出入り禁止!!!
#define TRUE (!0) ← 正しい
if(b) ← 正しい
if(b != FALSE) ← 正しい
if(b == TRUE) ← 間違い くず! 0点!! 出入り禁止!!!

543:デフォルトの名無しさん
20/02/09 17:16:55 J3Qn0niW.net
>if(b != FALSE) ← 正しい

これこそ糞コード

544:デフォルトの名無しさん
20/02/09 17:20:45 GpaXptWq.net
意味的にboolなら
if (a)
if (!a)
で判断すべきだと思う

545:デフォルトの名無しさん
20/02/09 17:24:22 GpaXptWq.net
if (a == TRUE)
if (a == TRUE == TRUE)
if (a == TRUE == TRUE == TRUE)

546:デフォルトの名無しさん
20/02/09 17:32:39 DvSFPggO.net
とぅっとぅるぅ~♪

547:デフォルトの名無しさん
20/02/09 17:40:32 J3Qn0niW.net
もともと>>438>>439を混同すんなという話なんだが、混同してる奴が次から次へと湧いて出てくるw

548:デフォルトの名無しさん
20/02/09 17:46:22.21 cYNa4VVg.net
ちゃうねん。

549:デフォルトの名無しさん
20/02/09 17:46:32.42 ugWNThcV.net
>>528
#define TRUE (!0) ← 正しい
C/C++ では、!0 は、必ず1 になることが仕様化されているので、仕様に準拠している
処理系ではこれは必ず、
#define TRUE 1
と書くのと同じになるので、敢えて (!0) と書く意味は無い。

550:デフォルトの名無しさん
20/02/09 17:48:20.60 GpaXptWq.net
boolだろうがBOOLだろうがYESNOだろうが
意味がboolであればboolと同じ扱い

551:デフォルトの名無しさん
20/02/09 17:48:58.88 6++kPC7v.net
>>529
糞コードだが
> if(b == TRUE) ← 間違い くず! 0点!! 出入り禁止!!!
より1億倍マシ

552:デフォルトの名無しさん
20/02/09 17:50:49.32 GpaXptWq.net
>>528
1がイヤなら0もイヤだろう
#define FALSE (0!=0)
としないと

553:デフォルトの名無しさん
20/02/09 17:55:11.50 J3Qn0niW.net
>>


554:537 マシとか言う以前にそもそも動作が違うんだが。 bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?



555:デフォルトの名無しさん
20/02/09 17:59:01.69 cYNa4VVg.net
>>539
!(b != TRUE)。

556:デフォルトの名無しさん
20/02/09 18:02:21.32 GpaXptWq.net
普通はTRUEかFALSEしか入ってないんだよ
それ以外が入ってる可能性があるなら
普通TRUEがどうかの判断だけじゃダメじゃないか?

557:デフォルトの名無しさん
20/02/09 18:05:49.02 GpaXptWq.net
switch (b){
case FALSE:
...
case TRUE:
...
case ???
...
default
...
}
これで

558:デフォルトの名無しさん
20/02/09 18:07:19.16 ugWNThcV.net
>>539
それは難しくいえば数学の集合論の話になる。
{0} と {非0} の二つの集合が有り、
if の条件式では、前者が偽、後者が真と評価される。
TRUEはどんな処理系であれ、必ず後者の集合の要素(元)になっていることだけは
保障されている。
なので、if ( b != 0 ) や、if (b) は正しいが、
if (b == TRUE) は絶対駄目、ということになる。

559:デフォルトの名無しさん
20/02/09 18:09:46.56 GpaXptWq.net
>>543
BOOLなのに
1と2を区別したい事があるんだってさ

560:デフォルトの名無しさん
20/02/09 18:10:45.32 ugWNThcV.net
if ( b == TRUE ) は、この条件式自体の動作は問題ないが、
b が TRUE ではないが、真である何らかの値を持っていたときに破綻してしまう。
BOOL b と書いた場合、本人が書いたプログラムでは b は、必ず
TRUE か FALSE の二値に限って書くことになろうが、往々にして、
APIなどでは、「真」の意味で「非0」の値を返してくること関数が含まれて
しまっている。
だから、勘違いや混乱が起き易い。
そのため、if ( b == TRUE ) というのは、絶対にやめておいたほうが良い書き方
となる。

561:デフォルトの名無しさん
20/02/09 18:16:58.01 GpaXptWq.net
TRUE/FALSE以外を想定するなら
時と場合による
TRUE/FALSEしか想定しないなら
if (b) / if (!b)
と書くべき

562:デフォルトの名無しさん
20/02/09 18:19:53.44 TF4jiljH.net
昔VB6からWinAPI呼ぶときの注意点として本で読んだ気がする
それboolじゃないよね?とは思った

563:デフォルトの名無しさん
20/02/09 18:20:59.38 J3Qn0niW.net
>>545
じゃあ聞いてみよう。
bがTRUEと一致するかどうか判断する必要がある場合はどう書く?

564:デフォルトの名無しさん
20/02/09 18:29:21.05 J3Qn0niW.net
>>546
排中律が成り立たないからFALSEでないことはTRUEを意味しない。
成功した場合にTRUE、失敗した場合にFALSEを返すという関数がある場合、成功したかどうかは
FALSEでないことではなくTRUEと一致するかどうかで判断しなければならない。

565:デフォルトの名無しさん
20/02/09 18:29:23.53 cYNa4VVg.net
>>548
!(b != TRUE)。

566:デフォルトの名無しさん
20/02/09 18:30:08.13 aEgJYC9i.net
>>548
架空のケースについてのお答えは差し控える
つか糞コードかどうかはともかく>>509の方はMSDNの記述に準拠したコードという意味では
非の打ち所が無い(何かあってもMSDNのせいにできる

567:デフォルトの名無しさん
20/02/09 18:30:08.50 6++kPC7v.net
>>539
> bがTRUEと一致するかどうか判断する
それ自体がまずい(ことが多い)と指摘されてることにそろそろ気づこうよ…

568:デフォルトの名無しさん
20/02/09 18:36:27.78 J3Qn0niW.net
>>552
>>514見ているのにいまだにそんなこと言っているのはなんでだろう

569:デフォルトの名無しさん
20/02/09 18:42:52.19 cYNa4VVg.net
いやちゃうねん。

570:デフォルトの名無しさん
20/02/09 18:59:34 aEgJYC9i.net
intの取り得る値の集合に対し、TRUEの定義が-93でありかつそれ以外は偽と解釈をせよと仕様に書いてあったら
さすがに(b == TRUE)とか(b != TRUE)書くことを現実の選択肢として考慮せざるおえない
もちろんそんな仕様が糞だが、仕様なのだからしようが無い
数学の本質は自由性にある、

571:デフォルトの名無しさん
20/02/09 19:07:50 mORiFTgk.net
>>549
>>546
日本語読めますか?

572:デフォルトの名無しさん
20/02/09 19:15:36 PT76WH2y.net
FALSEは定数
TRUEは範囲で観測によって収束する

適性に乏しいやつには厳しいよな

573:デフォルトの名無しさん
20/02/09 19:16:00 mORiFTgk.net
boolからBOOLになってintになってた

574:デフォルトの名無しさん
20/02/09 19:16:09 MeV8oXxA.net
集合B={FALSE=0,


575:TRUE=1} の場合 !FALSE=TRUE だが B'={FALSE=0,TRUE1=1,TRUE2=2,TRUE3=3} の場合 !FALSE={TRUE1,TRUE2,TRUE3} となる しかし TRUE={TRUE1,TRUE2,TRUE3} と定義すると B''={FALSE=0,TRUE} となり、同型B≡B'が示されるため、B'をboolとみなすことは可能である ただし、比較演算子は集合として同値であるのか、集合に含まれるのかを示さなければならない b⊂B'(≡B) のとき、 b=FALSE は一意だが、b=TRUE は b=1∩b=2∩b=3 を示す



576:デフォルトの名無しさん
20/02/09 19:17:37 mORiFTgk.net
数学関係ないのに数学ネタでひっぱってるヤツがいるな
IDは違うけど同じ人?

数学関係ないから

577:デフォルトの名無しさん
20/02/09 19:18:03 6++kPC7v.net
>>553
>>514の話なら>> 509だし、そうでないAPIもたくさんあるから
> それ自体がまずい(ことが多い)と指摘
されてるんだが、まじでわかってないのか?
引っ込みつかなくなってるだけだと思ってたが…

578:デフォルトの名無しさん
20/02/09 19:18:39 cYNa4VVg.net
ちゃうねんちゃうねん。

579:デフォルトの名無しさん
20/02/09 19:19:01 MeV8oXxA.net
訂正
b=1∩b=2∩b=3
→b=1∪b=2∪b=3

580:デフォルトの名無しさん
20/02/09 19:22:41 qoRTNAXH.net
グローバル領域にインスタンスを作って、初期化はmain()の中でしたいとします。
で、初期化に必要な情報はmain()の中で初めて分かるとします。

こういうときってそのクラスのコンストラクタとしては何もしないものを作っておいて、初期化用の関数を別途用意するというのが普通ですか?
インスタンスの宣言だけしておいてコンストラクタは後で呼ぶなんてできないですよね?

581:デフォルトの名無しさん
20/02/09 19:23:38 mORiFTgk.net
ポインタにしとけ

582:デフォルトの名無しさん
20/02/09 19:29:17 J3Qn0niW.net
>>561
逆に不思議だわ。
「成功時に0以外の値を返す」と「成功時にTRUEを返す」は違うということがなんで理解できないのか。

583:デフォルトの名無しさん
20/02/09 19:30:00 aEgJYC9i.net
std::unique_ptr<T>の出番

584:デフォルトの名無しさん
20/02/09 19:30:50 bHnzUNQO.net
apiの仕様見て適切に処理で終わる話だろこれ

585:デフォルトの名無しさん
20/02/09 19:37:32 54+KBSAm.net
optionalの出番だろ

586:デフォルトの名無しさん
20/02/09 19:39:43 OliK3lJl.net
>>568
同意

587:デフォルトの名無しさん
20/02/09 19:45:02 6++kPC7v.net
>>566
どこから違うことを理解してないと思った?
思い込み激しすぎw

588:デフォルトの名無しさん
20/02/09 19:45:29 6++kPC7v.net
>>568に一票

589:デフォルトの名無しさん
20/02/09 19:47:47 mORiFTgk.net
もともとはboolの話だったのに

590:デフォルトの名無しさん
20/02/09 19:49:14 VD5bohdG.net
GetGlyphOutline などで文字画像を取り出そうとすると、フォントが持ってない文字は代わりの文字を出力してくる。
(例えば、昔の毛筆フォントでは「?(はしご高)」などはMSゴシックになる。)
これを抑制したいので、そのフォントがグリフデータを持っているかどうか、調べる方法はありますでしょうか?

591:デフォルトの名無しさん
20/02/09 19:50:25 mORiFTgk.net
C++の相談?

592:デフォルトの名無しさん
20/02/09 19:52:53 J3Qn0niW.net
>>571
違いを理解しているなら>>566の後者はまさに>>539だということも理解できそうなもんだが。

593:デフォルトの名無しさん
20/02/09 19:54:35 bHnzUNQO.net
>>574
ここよりwindows apiのスレのがいいんじゃないかな

594:デフォルトの名無しさん
20/02/09 20:00:40 6++kPC7v.net
>>576
もしかして(ことが多い)っていう意味もわかってないのか?

595:デフォルトの名無しさん
20/02/09 20:05:04 54+KBSAm.net
win32は変な仕様多いからAPIの仕様確認しないと罠にはまる

596:デフォルトの名無しさん
20/02/09 20:05:21 J3Qn0niW.net
多い方に合わせろって話でもないだろう。
>>568の通りそれぞれの仕様に合わせて適切に扱えってこと。

597:デフォルトの名無しさん
20/02/09 20:05:58 PT76WH2y.net
>>579
ほんこれ

598:デフォルトの名無しさん
20/02/09 20:07:59 54+KBSAm.net
GetModuleFileNameとか仕様作った奴のセンスを疑う

599:デフォルトの名無しさん
20/02/09 20:20:16 6++kPC7v.net
>>580
誰も多い方に合わせろなんて言ってないのに…
単にそういうケースが多いって言うだけの話であることも説明しないとわからんのかな?w

600:デフォルトの名無しさん
20/02/09 20:30:08 J3Qn0niW.net
なら問題ないケースもあることを理解してるわけだ。だとすると>>552で指摘してたのはなんだろうと。

601:デフォルトの名無しさん
20/02/09 20:34:19 6++kPC7v.net
>>584
えっ?
まだ(ことが多い)ってわざわざ


602:書いてる意味がわからんのか? まともな奴と会話してる時ならいちいち書かないんだが、ネット掲示板なのでわけわからん奴に絡まれないようにわざわざ書いたのに想定外の低能さんなの?



603:デフォルトの名無しさん
20/02/09 20:46:39.77 J3Qn0niW.net
>>585
つまり>>552は、まずい場合もあるしそうでない場合もあるという意味のない指摘なわけだ。
ようやく>>539に戻れたな。
>>537
マシとか言う以前にそもそも動作が違うんだが。
bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?

604:デフォルトの名無しさん
20/02/09 20:52:41.00 mORiFTgk.net
bがTRUEと一致する条件の話はしてなくて
boolに対するif文をどう書くかの話だろ
APIの使い方なら他スレでやって

605:デフォルトの名無しさん
20/02/09 20:55:58.33 PT76WH2y.net
余所でやれって、APIと言語仕様のズレの話だろ
正しい理解はどのようなものかという興味は
スレ違いじゃねえぞ

606:デフォルトの名無しさん
20/02/09 21:03:28.51 mORiFTgk.net
APIの正しい理解ならAPIのドキュメントを見れば良いのでは?
もともとのboolの話とは全く関係ないですね

607:デフォルトの名無しさん
20/02/09 21:05:18.68 6++kPC7v.net
>>586
> つまり>>552は、まずい場合もあるしそうでない場合もあるという意味のない指摘なわけだ。
お前には意味ないのかもな…
必死になりすぎw

608:デフォルトの名無しさん
20/02/09 21:05:59.85 J3Qn0niW.net
>>533に書いたが、boolじゃなくてBOOLの話をしているのになぜかboolと混同する人が

609:デフォルトの名無しさん
20/02/09 21:06:45.54 mORiFTgk.net
boolの話題でbool以外を語るのはこんな感じ
内部的に固定小数点なfloatライブラリもあるぞ
内部的にvectorなmapライブラリもあるぞ

610:デフォルトの名無しさん
20/02/09 21:07:53.15 mORiFTgk.net
BOOLも同じ
意味的なBOOLが前提
それ以外は特殊事情

611:デフォルトの名無しさん
20/02/09 21:21:02.28 J3Qn0niW.net
>>590
意味のあるなしは主観だからいいとして、結局これ理解できたかな?
>>537
マシとか言う以前にそもそも動作が違うんだが。
bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?

612:デフォルトの名無しさん
20/02/09 21:23:11.71 6++kPC7v.net
>>594
>>552
低能は一度指摘されたことを何度も繰り返すw

613:い
20/02/09 21:32:30.02 Z95s67CZ.net
boolができるまでは
if (!!b)
こういうイディオムもありましてね

614:デフォルトの名無しさん
20/02/09 21:42:44.86 J3Qn0niW.net
>>576を理解しているなら
>bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?
このような判断がが必要な場合があることも理解しているはずだろうが、
結局この質問には答えられない(答えたくない)ようだな。

615:デフォルトの名無しさん
20/02/09 22:05:36.89 6++kPC7v.net
まだやってるのかよw
無能無限ループ乙

616:デフォルトの名無しさん
20/02/09 22:07:19.29 EoI3r47q.net
あいかわらずしょーもない話題だと盛り上がるのな。

617:い
20/02/09 22:16:06.44 Z95s67CZ.net
goto、マクロ、BOOL
全部C言語の範疇なんだよなw
おじさんがんばりすぎ

618:デフォルトの名無しさん
20/02/09 22:18:57.48 aEgJYC9i.net
つか真理値の型であるbool型および
真理値の型としての名前を与えられたBOOL型の議論が
Win32 APIの仕様という現実に汚染されてぐちゃらけてますな
TRUEに幅が有る、なんていうおかしいことを言い出す香具師まで出る始末、!

619:デフォルトの名無しさん
20/02/09 22:23:19.21 J3Qn0niW.net
本当は昨日で終わっていたはずの話題なんだがな。

620:◆QZaw55cn4c
20/02/09 22:31:58 mQrdek/f.net
>>487
え?話の発端は >>438 でしょう?
>>439>>438 の bool を BOOL にすげ替えたミスリードでしょう?

>>491
もう一度いいますが、
>if (b == TRUE) と書くのはバグの原因になる
のは b の型が int であれば、確かにそういえますが、b の型が bool ならばなんの問題もなにのでは?
URLリンク(ideone.com)

前提条件を全然考慮せず、条件反射的に
>if (b == TRUE) と書くのはバグの原因になる
と判断するのは老害的発想と私は断定しますね

621:デフォルトの名無しさん
20/02/09 22:33:23 EiJfhZVq.net
>>602
お前が言うなよww

622:デフォルトの名無しさん
20/02/09 22:33:54 aEgJYC9i.net
一般論として、APIの呼び出しが成功しました、という情報にはそれ以上幅も糞も無い(成功した要因など知っても無駄
から、成功=TRUE、失敗=FALSEとする割付の下では、TRUEこそ単一値として規定されるべきブツに他ならない
よって、一般論としては b == TRUEは言うほど糞ではないはずであった、

623:デフォルトの名無しさん
20/02/09 22:37:13 aEgJYC9i.net
まあエラー要因を複数種類返したい、ということなら
成功判定は b == SUCCEEDEDでSUCCEEDEDでなかったらエラーコードが入っている、という
INTかDWORD返しがストレートやったがな!(成功時非0を返す、とか言われるよりは

624:デフォルトの名無しさん
20/02/09 22:42:00 VD5bohdG.net
if( b == TRUE ) って、結局 if( b ) ってことだろ。

625:デフォルトの名無しさん
20/02/09 22:45:14 Z95s67CZ.net
クソワロタ
口調も激変

626:デフォルトの名無しさん
20/02/10 00:02:35 SkPzv01G.net
>>555
ヘッダファイルの中で TRUE の値が -93 に #define で定義されていたとしても、C/C++ の仕様だと、0だけが偽で、0以外は真であることだけはANSI Cで決まっているので、それはない。

627:デフォルトの名無しさん
20/02/10 00:06:15 hYCIpnsp.net
つまり、
#define TRUE (-93)
はANSI Cの規格上非合法だからそれはない

628:デフォルトの名無しさん
20/02/10 00:07:32 SkPzv01G.net
>>548
その場合で、かつ、b が TRUE に一致するもの以外を除去したいなら
if ( b == TRUE ) と書く以外には無い。
しかし、Win32 API の仕様でも、そのようなことを判定する必要があることはない
ように通常、作られている。
何人かが指摘しているように、FALSE との判定は良いのだ。
TRUE との判定はまずい。

629:デフォルトの名無しさん
20/02/10 00:08:23 hYCIpnsp.net
gotoといいBOOLといい、闇が深いな
裾野が広がれば、底辺は底なしカヨ、

630:デフォルトの名無しさん
20/02/10 00:08:59 hYCIpnsp.net
>>611
>>601

631:デフォルトの名無しさん
20/02/10 00:39:11 NGNAXTbr.net
【IT】不動の人気を誇る「Python」、評価が二分される「Java」「JavaScript」
スレリンク(bizplus板)

>JavaScript、Java、Python、「C++」「C」が特に多くの人に習得されたプログラミング言語だった

632:デフォルトの名無しさん
20/02/10 01:06:29 2gVSY1CN.net
C++11規格でJavaやC#の優位性がかなり失われた気がするわ。

633:デフォルトの名無しさん
20/02/10 01:07:48.45 Ro8qON5e.net
c#ならまだしもjavの優位性って?

634:デフォルトの名無しさん
20/02/10 01:35:35.28 SkPzv01G.net
>>614
というか、JSやJavaは、ちゃんと学んだ人も多いだろうが、
Pythonを実際に使ったことのある人はかなり少数派だと思う。

635:デフォルトの名無しさん
20/02/10 01:38:59.61 SkPzv01G.net
>>617
Javaは、GUIも出来たしブラウザ上でも動いたし、他に代わるものがなかったので
それしか選択肢がなかったために実際に使った人は多かったはず。
JSも、HTMLを使おうとした際にそれしか動的言語は無かったから同様。
一方で、Pythonに関しては、似たようなものは他にたくさんあるし、
自分以外の人に使ってもらうにも実行環境のインストールが必要だし、
Javaと違って互換性にも問題あるので使いにくい。

636:デフォルトの名無しさん
20/02/10 01:43:33.69 SkPzv01G.net
>>618
つまり、Pythonの評価が高いのは、前評判だけで実際に使った人が少ないから。

637:デフォルトの名無しさん
20/02/10 03:53:35.38 rxX2x5Pb.net
んなわけない。

638:デフォルトの名無しさん
20/02/10 04:03:09.14 2gVSY1CN.net
Pythonはtypoがつらい。

639:デフォルトの名無しさん
20/02/10 08:01:35 staO5LAL.net
ごちゃごちゃいうよりまずはいっぺんオッPythonで
そこそこの規模のプログラム(最低1000行以上)かいてみりゃわかる
はっきりいってクソだよ
あんなもんで巨大なプログラムはとても書けたもんじゃない

640:デフォルトの名無しさん
20/02/10 08:53:11.04 GJT/1Bxa.net
自分で1000行も書かなくても、どこかの誰かが書いてくれたライブラリを呼び出せば
望んだ仕事をやってくれるって部分がPythonの好まれる理由じゃないのん


641:? C++を使う人は、Pythonの流行を裏から支えてる感じで。



642:デフォルトの名無しさん
20/02/10 10:10:17.80 hDJC6jsQ.net
pythonで1000行くらいで根をあげてるようじゃ
どんなコード見ても文句言い出すだろ。。仕事にならんわ。

643:デフォルトの名無しさん
20/02/10 10:24:50.55 JgTqubiS.net
インデントをきっちり合わせないといけないので、Cの適当なインデントにうんざりしてる人にはむしろ合うかもしれない
でも関数やブロックが大きくなると、同一階層を探すのがつらくなるので、適切なブロック、関数分けが必須になる
いずれにしても、神経質な人には合ってるのかもしれない

644:デフォルトの名無しさん
20/02/10 10:46:13.48 oMyz9pGE.net
機械学習ならpythonほぼ必須なんだが
いまだにやったことないとか
ロートルなのを白状してるようなもん

645:デフォルトの名無しさん
20/02/10 11:15:12.10 yW0oU9fF.net
変数がどんな型にも化けられる変態言語

646:デフォルトの名無しさん
20/02/10 11:25:16.00 8A84p9rG.net
pythonがいいとは思わないけど、perlがクソすぎるので相対的にマシだから流行ってる
それ以上の理由はないと思う

647:デフォルトの名無しさん
20/02/10 11:37:39.28 oMyz9pGE.net
perlの代替っていつの時代の話だよ
お前完全に取り残されてるぞ

648:デフォルトの名無しさん
20/02/10 11:50:23.10 SkPzv01G.net
Pythonは、スマホで動かすのは難しいらしい。
少なくともスクリプト言語として動かすのは困難。
デスクトップマシンですら、
・互換性の問題がある。Ver 2系と Ver 3系で大幅に異なると聞いた。
・Windowsですらどの処理系が標準か不明。
・GUIがちゃんとまともに使えるかどうか不明。

649:デフォルトの名無しさん
20/02/10 11:55:31.13 SkPzv01G.net
>>630
Pythonのせいではなく、Perlのようなスクリプト言語がそもそも使えないという
スマホの限界だとは思う。
スマホでも使えることは使えても、IDEのような専用環境だけで使えるだけでは
本来のスクリプト言語としては使い物にならない。
このスマホの時代に Perl, Python, Ruby は合わないかも。

650:デフォルトの名無しさん
20/02/10 11:58:33.88 SkPzv01G.net
iOS, Android 共通にスクリプト的なことをやりたいなら、もう、スクリプト言語は諦めて、
C++で書いておいて iOSではSwift とリンクし、Androidでは、JNIを使ってJavaから
呼び出すほうがずっと簡単。
なお、AndroidならシェルスクリプトがPythonなんかより遥かに簡単に使える。

651:はちみつ餃子
20/02/10 12:13:49.40 gblDkkh1.net
>>625
- 括弧などに従って自動でインデントが付く
- 手動 (あるいは半自動) でインデントの位置を合わせる
これの二択だったら前者の方が「きっちり」してると思うわ。
まあインデントの付け方にいくつかの選択肢がある点はやりづらい面も
あるかもしれんが、自由度と統一性は両立できないもんだしな。
Python はいじったことないからよう知らんけど、 (インデントで構造を表す系統の文法である) Haskell を書くのはつらかった。
Haskell ではインデントと改行の替わりに波括弧とセミコロンも使えるけど、Python にそういうのないの?

652:デフォルトの名無しさん
20/02/10 12:34:04 oMyz9pGE.net
pythonをswift, javaなんかと比較してる人は
隔離された世界で誰にも使われないアプリを細々と作ってる感じがするわw
学習系を含むデータ解析のツールとして環境が優れてるからpythonが人気なんだよ
c++でテンプレートいじってるよりビッグデータ解析してビジネス提案できる方がはるかに収入高い

653:はちみつ餃子 ◆8X2XSCHEME
20/02/10 12:51:05 gblDkkh1.net
おっ、煽り入りました~~


654:



655:デフォルトの名無しさん
20/02/10 13:26:43 NGNAXTbr.net
ビジネス提案おじさん

656:デフォルトの名無しさん
20/02/10 14:18:49.02 SkPzv01G.net
>>633
ブロック開始終了記号とインデントを両方組み合わせたものが一番分かり易くて間違いにくい。
インデントだけでやると、個人的には見間違いそうで神経をすり減らすので辛い。

657:デフォルトの名無しさん
20/02/10 17:30:56 rxX2x5Pb.net
研究者が使うのにPythonは良い選択なんじゃないの。
事務作業にVBAが良い選択なのと同様に。

658:デフォルトの名無しさん
20/02/10 17:40:26 pqZ9DEAl.net
今さらですが、そもそもWin32のFALSEって、0であることは保証されてるんですか?

BOOL b = FALSE;
if (b)
{
  ここに来ないことは保証されてるんですか?
}

659:デフォルトの名無しさん
20/02/10 17:42:58 SkPzv01G.net
>>639
まともな C/C++ では、FALSE はどんな処理系でも 0 であることが保障される。

660:デフォルトの名無しさん
20/02/10 17:43:39 SkPzv01G.net
>>639
当然、そこに来ないことも保障される。

661:デフォルトの名無しさん
20/02/10 17:52:19 M5G7J8Pl.net
>>639
規格書のようなレベルで規定されているかどうかは知らないけど、公式ドキュメントの至るところで
FALSEは0である前提で書かれているものが見つかるから、そこを疑う必要はないと思う。

>>640
FALSEはWindows SDKの定義であってC/C++とは直接関係ないんだが。

662:はちみつ餃子 ◆8X2XSCHEME
20/02/10 18:04:03 gblDkkh1.net
>>640
現実にはそうだってのならわかるが、質問は保証があるかどうかなんだから、根拠を添えろよ。

少なくとも現状の WinDef.h では FALSE は 0 、 TRUE は 1 と定義されているのはわかったし、
常識的に考えればこれが変更されることはないが、
私はマイクロソフトのドキュメントからこれを裏付けるような文言を見つけられなかった。

BOOL が int であることは発見できた。
URLリンク(docs.microsoft.com)

should be TRUE or FALSE って書いてあるのにこれに反するような API があるのはアレだよな……。

663:デフォルトの名無しさん
20/02/10 18:06:40 AZ4KAaI2.net
システムハンガリアンもそうだけど明白な違反が堂々と放置されているからなあ

664:デフォルトの名無しさん
20/02/10 18:08:58 SkPzv01G.net
>>642 >>643
[根拠]
数学的に以下の根拠となる:

1. FALSE は、if ( FALSE ) とすると、偽として処理されることは絶対に保障される。
2. if (x) で x が偽として評価されるのは、ANSI C も、古い C でも必ず 0 という1つの値のみであり、他の値はすべて真と評価される。

1, 2 を両方成り立たせるためには、FALSE は必ず 0 でなければならないことが
証明される。

665:デフォルトの名無しさん
20/02/10 18:10:00 SkPzv01G.net
数学が大事です。
今の場合、仕様書に書いてなくても、数学的に考えれば絶対であることが証明できます。

666:デフォルトの名無しさん
20/02/10 18:13:48.89 M5G7J8Pl.net
昨日の奴かw
BOOLとboolは別物だということが結局最後まで理解できなかったんだな。

667:デフォルトの名無しさん
20/02/10 18:19:36.47 1F9oSbm6.net
windows apiのスレでやってくれよ

668:デフォルトの名無しさん
20/02/10 18:21:23.11 1D/jLqBa.net
>>645
頭が悪いとか話が通じないってよく言われない?
言われる度に相手の方が間違ってると思ってるだろうけど、話が通じてないのはお前が自分の間違いを認識できてないからだぞw

669:デフォルトの名無しさん
20/02/10 18:22:28.83 SkPzv01G.net
このスレには、失礼ですが、はちみつさんも含め、数学に弱い人が多いようです。

670:デフォルトの名無しさん
20/02/10 18:23:02.20 SkPzv01G.net
>>649
いや、むしろ逆に現実では天才と呼ばれています。

671:デフォルトの名無しさん
20/02/10 18:25:05.67 SkPzv01G.net
仕様書にすべては書いてなくても、数学で考えれば絶対であることが証明できる事柄があるのです。
今回のもその一例です。

672:はちみつ餃子
20/02/10 18:25:15.66 gblDkkh1.net
ああ、荒らしに来ただけか。
まぜっかえすにしてももうちょっとマシなこと言えよ。

673:デフォルトの名無しさん
20/02/10 18:27:13.76 rZ6GQco7.net
東大数学科卒だが
>>650は頭が弱いと思う

674:デフォルトの名無しさん
20/02/10 18:27:37.23 rxX2x5Pb.net
マクロはほとんど書く


675:必要なくなったよね。



676:デフォルトの名無しさん
20/02/10 18:27:43.95 SkPzv01G.net
失礼ですが、はちみつ氏は、C++の仕様には詳しいですが、それ以外は結構間違っています。

677:デフォルトの名無しさん
20/02/10 18:29:09.02 rZ6GQco7.net
>>656
ここでの君の書き込みだけで判断すると
君が間違ってる可能性が高い

678:デフォルトの名無しさん
20/02/10 18:29:40.36 SkPzv01G.net
>>654
でも現実に私は天才と言われています。

679:デフォルトの名無しさん
20/02/10 18:30:41.13 rZ6GQco7.net
数学の実績は?

680:デフォルトの名無しさん
20/02/10 18:31:14 SkPzv01G.net
>>1
私は、東大数学科の人とは意見が一致することが多いです。
よく考えてみてください。
もし分からないようなら、多分、あたなは東大数学科ではないか、レベルが落ちてしまったと思われます。

681:デフォルトの名無しさん
20/02/10 18:33:21 rZ6GQco7.net
学科は?

682:デフォルトの名無しさん
20/02/10 18:33:32 M5G7J8Pl.net
まとめるとこう。

1. BOOL型およびTRUE/FALSEは真偽値として用いるために*Windowsで独自に定義*されたものだが
 厳密には真偽値と振る舞いが異なる
2. 具体的には、FALSEでなれければTRUE、TRUEでなければFALSE、という排中律が成り立たない
3. 排中律が成り立たない以上、FALSEとの比較、TRUEとの比較はそれぞれ意味がある

683:デフォルトの名無しさん
20/02/10 18:34:10 SkPzv01G.net
ここは、学歴も実績も嘘を付けてしまうので参考になりません。
東大数学科と言うのもたぶんデタラメでしょう。

684:デフォルトの名無しさん
20/02/10 18:34:25 rZ6GQco7.net
なんでWindows前提?

685:デフォルトの名無しさん
20/02/10 18:37:31 rZ6GQco7.net
排中律君も数学君と同じ人かと思った
違うのかな?

普通の言葉で書こうよ
書けるでしょ

686:はちみつ餃子
20/02/10 19:01:26.22 gblDkkh1.net
>>664
TRUE を持つ内では皆が共通に論じられるほど広く知られたもののひとつだからでしょ。
反例としてはひとつあれば充分。
ちなみに「TRUE と比較するべきではない」に対する反例ね。
true であれ TRUE であれ、それと == で比較するのが罠になりやすいっつーのは
罠になりやすい部分として有名すぎて逆によく知られている常識だが、
絶対不変の定理みたいに言い始めたやつがいたから変なことになってるんだよ。
現実はそんな綺麗なもんじゃねーよっていうのに Windows はうってつけだろ?

687:デフォルトの名無しさん
20/02/10 19:02:19.07 VRCQc/iz.net
BOOLはWindows APIでしか使わないと思ってるから話が通じないんだな
数学君はなぜ話が通じない?
BOOLがTRUE, FALSE, UNKNOWN, ERROR
からなる集合だったら?

688:デフォルトの名無しさん
20/02/10 19:04:47.41 4ZzuDNO4.net
>>664
>>639からの流れで、あくまでWin32APIの中でのFALSEの話をしているからだろう

689:デフォルトの名無しさん
20/02/10 19:06:03.16 VRCQc/iz.net
BOOLは非常に広い環境で使われていて
その多くはTRUE/FALSEの2値を示す型として使われる
こういう普通の環境では
if (b) / if (!b)
で判断するのが最良
そうではない特殊な環境(Windows APIなど)は
個々のAPI別に語らないと意味が無い

690:デフォルトの名無しさん
20/02/10 19:06:46.57 VRCQc/iz.net
Wimdows APIに限定した話ならここですべきではない
他へ

691:デフォルトの名無しさん
20/02/10 19:33:07.36 M5G7J8Pl.net
つまり、Windowsで>>439のように書いていたのをWindowsのBOOLを知らずに否定しちゃう人、
というネタそのものを体現してくれたわけだな。

692:デフォルトの名無しさん
20/02/10 19:35:42.65 Ro8qON5e.net
BOOLについて議論するならどのBOOLか限定しないと
enum BOOL {TRUE,FALSE};
みたいなのかもしれないし
負論理の入出力ポート読み書きする値だとかで順番も重要だったりして

693:デフォルトの名無しさん
20/02/10 19:47:34.98 VRCQc/iz.net
>>671
何が「つまり」だか
Windows APIが色々と特殊なのは知ってるよ
Windows 2.0から組んでるし
特殊事情はあくまで特殊事情

694:デフォルトの名無しさん
20/02/10 19:56:01 M5G7J8Pl.net
そもそも、特殊じゃない「普通の環境」のBOOLって何ぞ?
typedef bool BOOL; とかw

695:デフォルトの名無しさん
20/02/10 20:01:48 rxX2x5Pb.net
URLリンク(ideone.com)
こうなるので、負の型にキャストするのが良いんですかね?

696:デフォルトの名無しさん
20/02/10 20:25:38.47 L7QZkeGE.net
なんでBOOLの話をしてんだよジジイども

697:デフォルトの名無しさん
20/02/10 20:46:16.46 te1zn0Q+.net
標準にはboolと_Boolしかないんだからそれ以外はどこぞの馬の骨が好き勝手に決めただけの独自定義
そのライブラリのマニュアル熟読しろでこの話は終わり

698:デフォルトの名無しさん
20/02/10 21:07:46.28 oMyz9pGE.net
>>675
そうなんだけど
C言語スレでやれ
じじくさい話ばっかりでうんざりするわ

699:デフォルトの名無しさん
20/02/10 21:11:10.36 dan9Jlhp.net
ナウでヤングな話題よろ

700:デフォルトの名無しさん
20/02/10 21:30:33.43 Ui+QSiGG.net
じゃあboolに戻すけど
if (b == true)
これ書く異常者は一定数おるわな

701:
20/02/10 21:33:51.78 3bnN/FFY.net
>>680
私には正常な書き方に思えますよ
その書き方のどこが異常なのでしょうか?

702:デフォルトの名無しさん
20/02/10 21:37:09.03 AZ4KAaI2.net
if (b) で済むのを
if (b == true) と書くのは
if (b == true == true) と書く異常者と同じ
きりねえって話

703:デフォルトの名無しさん
20/02/10 21:38:01.11 AZ4KAaI2.net
括弧ねえと読めねえ「異常者」出てこいw

704:デフォルトの名無しさん
20/02/10 21:49:47.77 rxX2x5Pb.net
>>678
ちゃうねん。

705:デフォルトの名無しさん
20/02/10 21:51:16.94 oMyz9pGE.net
>>683
つまんないことでイキんなカス

706:デフォルトの名無しさん
20/02/10 21:51:26.11 M5G7J8Pl.net
bool b;
if (b == true) // コードスメルではあるがバグではない
BOOL b;
if (b == TRUE) // 正しいか正しくないかは状況による

707:デフォルトの名無しさん
20/02/10 21:53:08.25 AZ4KAaI2.net
>>685
C++スレでC++以外の言語という「つまんないこと」でイキってんのおまえだろ

708:デフォルトの名無しさん
20/02/10 21:53:54.97 AZ4KAaI2.net
おまえみたいの「いちびり」って言うんだけど意味わかる?w

709:
20/02/10 21:55:45.19 3bnN/FFY.net
>>682
バグにならなければ問題ないのでは?
>if (b == true == true)
とは私も書きませんが、だからといって異常だとは思わない
というか、あなたの「異常」の定義が異常なのでは?

710:
20/02/10 21:56:36.80 3bnN/FFY.net
>>688
いちびり、とは、あなた、関西人ですなぁ

711:デフォルトの名無しさん
20/02/10 22:02:36.14 AZ4KAaI2.net
>>689
正常と異常の境をおまえさんはどこだと思っている?

712:デフォルトの名無しさん
20/02/10 22:02:53.98 VRCQc/iz.net
>>674
Windowsしか知らないの?
世界が狭い
非常に多くの環境でBOOLを使う

713:デフォルトの名無しさん
20/02/10 22:03:55.09 AZ4KAaI2.net
>>690
ああ、おまえほんまは関西人ちゃうなw
俺もほんまの関西人ちゃうけどなw

714:デフォルトの名無しさん
20/02/10 22:04:40.63 AZ4KAaI2.net
>>692
大文字のBOOLを使う「非常に多くの環境」とは?

715:デフォルトの名無しさん
20/02/10 22:06:02.65 VRCQc/iz.net
>531や>>682が異常とは思えないって
まじかQZ

716:デフォルトの名無しさん
20/02/10 22:07:56.51 M5G7J8Pl.net
>>692
その定義を出してみなよ。
標準の仕様じゃないんだからその環境ごとの特殊な定義であることは変わらんだろ。

717:デフォルトの名無しさん
20/02/10 22:14:01.58 VRCQc/iz.net
本当に知らないんだ
まじか

718:デフォルトの名無しさん
20/02/10 22:22:07.37 4ZzuDNO4.net
>>697
その返しは口喧嘩に負けた小学生みたいだから、ちゃんと相手の質問に答えなよ

719:デフォルトの名無しさん
20/02/10 22:23:41.11 1F9oSbm6.net
非常に多いなら具体例2、3あげて終わりでしょ

720:デフォルトの名無しさん
20/02/10 22:24:53.62 M5G7J8Pl.net
もう自分で何を言っているのかわからなくなっているんだろうな。
BOOLやTRUEの定義が環境によって異なる場合があると認めた時点で
if (b == TRUE)
これが正しいと言えるかどうかはその定義次第だということになるのに。

721:デフォルトの名無しさん
20/02/10 22:29:19.34 TAH0RZ5f.net
俺の狭い経験だと
BOOLはintで、TRUEは1、FALSEは0
しか見たことないけど、他の定義の環境ってあるの�


722:ゥな?



723:デフォルトの名無しさん
20/02/10 22:33:34.58 PZnoEIEf.net
-1というか全ビットonは何かで見た

724:デフォルトの名無しさん
20/02/10 22:50:32.94 Qny4UpdU.net
windef.hのFALSEが-1とかに変更されたら、既存のソースは崩壊だろうな

725:デフォルトの名無しさん
20/02/10 23:14:46.53 zaYnGTVS.net
!FALSE

726:デフォルトの名無しさん
20/02/10 23:38:01.28 yW0oU9fF.net
typedef unsigned BOOL:1;
ならまだ救いがあった
なんでint型にしてんだろうな

727:デフォルトの名無しさん
20/02/11 00:40:44 wwgXq7Q5.net
>>705
それは BitField みたいだけど、構造体メンバ以外で使えるようになったんだっけ?

728:デフォルトの名無しさん
20/02/11 01:18:20 wwgXq7Q5.net
>>703
FALSEは絶対的に0のまま。

729:デフォルトの名無しさん
20/02/11 01:20:55 wwgXq7Q5.net
もしかしたら、Rubyが、0をtrueと解釈してしまうことから変なことを思ってる
人がいるのかもしれないが、C/C++においては、言語仕様的に条件式で偽と
解釈されるのは、古くから、唯一、整数の 0 しかないなかったので、言語仕様が
修正されない限り TRUE が 0 以外の値にマクロ定義されることは絶対に無い。

730:デフォルトの名無しさん
20/02/11 02:07:59 iFdutQCH.net
あれ?
もしかして私・・また同じ日を繰り返してる・・??

731:デフォルトの名無しさん
20/02/11 02:12:10 lTJc7ZeR.net
まだやってんのかお前ら
ゲハ厨みたいなスレだな

732:デフォルトの名無しさん
20/02/11 02:43:47.12 wwgXq7Q5.net
>>708
スマン:
誤:修正されない限り TRUE が 0 以外の値にマクロ定義されることは絶対に無い。
正:修正されない限り FALSE が 0 以外の値にマクロ定義されることは絶対に無い。

733:デフォルトの名無しさん
20/02/11 02:58:41.73 f/mZFEPY.net
>>681
if(b)で十分なのにif(b==true)と書くのはif((a==b)==true)と書くのと同じで冗長なんだよ
これがすぐに理解できないなら論理を簡潔にする能力が欠如してるのでプログラミングの才能はないね

734:デフォルトの名無しさん
20/02/11 03:04:36.42 wwgXq7Q5.net
>>712
しかも、b は、少なくとも見かけ上は int 型ではなく、BOOL 型だし。
それに他の言語の場合、if の条件式に入れられるのは唯一 bool 型の
場合があり、一番 if の条件式に入れ易い型。

735:デフォルトの名無しさん
20/02/11 03:08:16.20 wwgXq7Q5.net
>>713
他の言語の場合、例えば x, y が整数型の場合、
x == y
とした結果の型が bool 型。
そして、if の条件式に入れられるのは bool 型のみだったりする。
だから、もともと b が bool 型なのに、敢えて b == true と判定して
また bool 型に「直して」しまうのはとても奇妙な感じになる。
その文化との兼ね合いから、C/C++ でも、b が BOOL 型の場合は、
if (b) とするのが美しく見える。

736:デフォルトの名無しさん
20/02/11 03:33:01.69 AiNLffgv.net
MISRA-C でも、if( 変数 )で、変数が実質的にブール型の場合は、これでOK
int a = ( 5 < 10 );
printf( "%d", a ); /* 1 */
if( 5 < 10 ) と、if( a ) は同じ意味。
a は、実質的にブール型

737:デフォルトの名無しさん
20/02/11 06:36:51 DrkniQZr.net
bool型が存在しない時代に何故bool型になるのか

738:
20/02/11 08:01:59.71 Sh/x76Zj.net
>>695
異常を「コンパイラがコンパイルできない」と定義していますから

739:
20/02/11 08:02:50.77 Sh/x76Zj.net
>>712
コンパイルが通るんだったら異常ではないのでは?

740:
20/02/11 08:03:52.59 Sh/x76Zj.net
>>712
>論理を簡潔にする能力が欠如してる
簡潔すぎてわかりにくいのも困りますね、プログラミングはまず他人への分かりやすさを優先するべきでは?

741:デフォルトの名無しさん
20/02/11 08:29:09.76 lXsf9fbV.net
簡潔過ぎて分かりにくいって何?
if (b) で分かりにくいなら
変数名が適切でないとかそもそも分かりにくい作りとか
他に問題があるんじゃないの?

742:デフォルトの名無しさん
20/02/11 08:33:12.52 lXsf9fbV.net
もしかして
if (a ==b)
よりも
if ( (a == b) == true )
の方が見やすいとかいっちゃう?

743:デフォルトの名無しさん
20/02/11 08:56:04 tUwi24Vl.net
そりゃ
if (a == 42)
よりも
if (a == 42 == true)



744:フほうが見やすいし if (a == 42 == true != false) のほうがさらに見やすいのが異常者



745:デフォルトの名無しさん
20/02/11 08:58:48 lXsf9fbV.net
カッコも付けないと見にくいよな

if (((a == 42) == true) != false)

746:デフォルトの名無しさん
20/02/11 09:09:46 Kcy+Q8b9.net
どれだけ冗長に書けるか選手権?

747:デフォルトの名無しさん
20/02/11 09:15:23 oAfdlMqH.net
QZは変なこだわりに固執するやつだから、一般的な感覚とか常識とかについて議論しようとしてもそもそも議論が噛み合わないし、スレを無駄に汚すだけ

748:デフォルトの名無しさん
20/02/11 09:21:24 tUwi24Vl.net
if (true == true == true == b == true)
if (true == b == true == b == true)
int *p = &*&*(int *)&*&*&*&*&*(int *)&a;

749:デフォルトの名無しさん
20/02/11 09:34:27 Gt4Evnq6.net
ようちえんじがかんじをつかわないでってぐずってるのとおなじだね

750:デフォルトの名無しさん
20/02/11 10:19:17.04 G5APdl5q.net
異常とは、普通じゃないことだよ
少数派のこと
if (b == true == true) は明らかに異常
if (b == true) はたまに見るけど、まぁ異常かな

751:デフォルトの名無しさん
20/02/11 10:34:12.60 lXsf9fbV.net
つまりQZは異常

752:デフォルトの名無しさん
20/02/11 10:35:43.55 Kcy+Q8b9.net
boolやBOOLでない変数abcをif(a==b==c)と書きたい事はある。

753:デフォルトの名無しさん
20/02/11 10:56:56.94 0rT9FQIK.net
QZってコイツ片山だっけ?

754:デフォルトの名無しさん
20/02/11 11:01:53.65 u3DUqgh+.net
if(b==true)
はifのなかには比較入れないとダメだと思っているんじゃね
そう言う言語もあるし

755:デフォルトの名無しさん
20/02/11 11:09:22.66 IotAbjtu.net
「rust が c++ を超えた!! 神!!」みたいな記事をよく見ますけど、今後c++がrustから学んでもっと良くなることって期待して良いですよね?
rustに勉強のコストを割くか迷っています

756:デフォルトの名無しさん
20/02/11 11:12:06.04 HeZx7HUk.net
>>731
片山はQZほど馬鹿ではない
まず国籍が違う

757:デフォルトの名無しさん
20/02/11 11:29:50.94 Ci+AyeA2.net
なぜ
if (a == true)
と書くやつがでてくるのか
それは条件式に食わせるためには比較演算子で値から「真偽値」に変える必要があると
思っていてそれがboolと同値と理解していないからだろ
だからそういうやつは
if (a == 42 == true)
とは書かない
この例はむしろboolを理解してるやつからしか出てこない発想
やつらはいったん「真偽値」になればあとは論理演算子でつなげると理解している
ある意味、条件式を作るときのイディオムに馬鹿正直に従っているわけで別に
異常だと騒ぐほどひどくはない
別の見方をすればboolを特別視しないで書いてるわけで、
冗長にはなるが共通のフォーマットで書ききるってことはほかでもあることだ
そう思えばやっぱりひどくはない
実際おれは特別読みにくいとは感じないし、この無駄は最適化で消える
何かの機会にこれ冗長だよねと教えてやるぐらいで十分

758:デフォルトの名無しさん
20/02/11 11:37:00.49 kh2SGwFh.net
ほんといつまでやってんの

759:デフォルトの名無しさん
20/02/11 11:38:29.11 KQZ3+5BK.net
冗長な書き方をする人の真意なんて測りようもないし理由が一つに決められるわけもないだろう。
想像するだけ無駄。

760:はちみつ餃子
20/02/11 12:17:11.73 GpQNLMm4.net
>>715
そう書くべきだしそれが普通ってことはわかってんだって。
自分で書く分にはそう書くよ。
でも、他者が書いたコードを読むときや利用するときは
> 変数が実質的にブール型の場合は
っていう前提を確信できない場合がある。
整数型で真偽値の代用にすることがある C/C++ では
型で判断できないことがあるから罠だよねって話をしてるんだよ。
真っ当なデザインではない場合があるから思い込まずにちゃんと確認しようねってこと。

761:デフォルトの名無しさん
20/02/11 15:09:17.27 lXsf9fbV.net
>>735
同値
意味�


762:オらないのね



763:デフォルトの名無しさん
20/02/11 15:15:33.26 Gt4Evnq6.net
> この例はむしろboolを理解してるやつからしか出てこない発想
そりゃそうだ
ifの制御式は比較でなければならないと言い張るやつへの皮肉なわけで

764:デフォルトの名無しさん
20/02/11 15:19:47.85 QCVkc9h/.net
operator =(BOOL value){
if(value==0){
return FALSE;
else if(value==1||value==2||...){
}

765:デフォルトの名無しさん
20/02/11 15:21:35.11 IKSpGnXe.net
>>596
あったあった
今はわざわざそれ使う理由忘れた

766:デフォルトの名無しさん
20/02/11 15:25:53 Uk2CrnAG.net
Cだとそれで必ず0か1になるからTRUEと比較しても大丈夫!っていうクソみたいなバッドノウハウ

767:デフォルトの名無しさん
20/02/11 15:28:40 QCVkc9h/.net
operator ==(BOOL value){
 if(this->value == 0){
  if(this->value == value){
   return TRUE;
  }
 }
 else{
  if(value==1||value==2||...){
   return TRUE;
  }
 }
}

768:デフォルトの名無しさん
20/02/11 15:38:44 KQZ3+5BK.net
>>743
そもそもTRUEと比較する必要はないしWindowsから出てきたイディオムでもないと思うが。
どちらかというとtruthyな値からtrueを得るイディオムとして使われているような。
よく見かけるのはJavaScriptとか。

769:デフォルトの名無しさん
20/02/11 15:45:19.74 Gt4Evnq6.net
リターン式から返却値の型を推定させる場合にはautoが必要だ

770:◆QZaw55cn4c
20/02/11 17:36:36 Sh/x76Zj.net
>>725
あなたのいう「一般的」というものが、実はそれほど一般的ではなかった、という可能性はありませんかね?
というか、まずあなたのいう「一般的」をあなたの言葉で定義するべきでしょう

あなたに定義できますか?

771:デフォルトの名無しさん
20/02/11 18:04:17 G5APdl5q.net
単語の意味は辞書引けよ
APIの仕様はヘルプ読め、と同様だな
なんで個人が定義するんだよ

772:はちみつ餃子 ◆8X2XSCHEME
20/02/11 18:24:26 GpQNLMm4.net
URLリンク(get.secret.jp)

773:はちみつ餃子
20/02/11 18:40:23.65 GpQNLMm4.net
true と比較したけりゃすればいいじゃないの。
そのプロジェクト内で一貫したポリシーがあるのならそれでいいよ。

774:デフォルトの名無しさん
20/02/11 18:49:13.60 TuMeiRsT.net
ちゃうねん。

775:デフォルトの名無しさん
20/02/11 18:52:49 TuMeiRsT.net
ストリーム遅いな。

776:デフォルトの名無しさん
20/02/11 20:44:57.22 f/mZFEPY.net
コード規約「if(bool)はif(bool==true)と書かなければならない」
やだよ、そんな規約ww
規約決めるまでに紛糾してプロジェクト始められねぇよw

777:デフォルトの名無しさん
20/02/11 20:57:43.57 Z6POtQL5.net
どっちでもええやん

778:デフォルトの名無しさん
20/02/11 22:08:40 Pk2ehCPz.net
explicit operator boolだとラムダとかの戻り値強制したいときそうなっちゃわない?

value() && true か value() || false
static_cast<bool>(value())は好きじゃない

779:デフォルトの名無しさん
20/02/11 22:19:09 Uk2CrnAG.net
素直に戻り値boolに指定しろよ

780:デフォルトの名無しさん
20/02/11 22:21:59 ggTX+OPA.net
意味的にboolの型であればboolにキャスト
そうじゃないなら意味通りにboolに変換

781:◆QZaw55cn4c
20/02/11 22:23:23 Sh/x76Zj.net
>>258
mmap を確かめています、なんだかすごく時間がかかってしまいました…
ideone はファイルを作らせてくれないみたいですね… URLリンク(ideone.com)

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

今は cygwin で見てますが、ちゃんと linux をいれて確かめるつもりです…

782:デフォルトの名無しさん
20/02/11 22:24:35 ggTX+OPA.net
オンメモリで出来ることは素直にオンメモリでやれば

783:デフォルトの名無しさん
20/02/11 23:36:09 TuMeiRsT.net
くじで決めてはどうか。

784:デフォルトの名無しさん
20/02/11 23:39:16 RnNFx+rl.net
モンテカルロ法やな

785:デフォルトの名無しさん
20/02/11 23:56:08 TuMeiRsT.net
I/Oの遅さの陰に隠れてたけど。
ストリームよりSSDのほうが速いよって時代になって困る。

786:デフォルトの名無しさん
20/02/12 01:53:51 CB9IiDBv.net
YouTuberは「最強の職業」である理由。
URLリンク(www.youtube.com)
【事例付き】YouTuberは最強の副業である件について。
URLリンク(www.youtube.com)
【初心者向け】YouTubeの始め方・稼ぎ方を徹底解説!
URLリンク(www.youtube.com)
「YouTubeなんていつか稼げなくなる」という主張を論破する。
URLリンク(www.youtube.com)
収益化から丸1年!YouTubeでいくら稼いだか公開。
URLリンク(www.youtube.com)
その動画で月商○○万!? YouTubeで稼ぐ裏技的アプローチ。
URLリンク(www.youtube.com)
【貧者の工夫で戦え】ガラケーだっていい。YouTube始めるのにパソコンはいらない!
URLリンク(www.youtube.com)
【第一回】SNS、YouTube、ブログで稼ぐ方法を、丁寧に解説します!
URLリンク(www.youtube.com)

787:デフォルトの名無しさん
20/02/12 06:38:05.77 m8mhjAm7.net
>>763
グロ

788:デフォルトの名無しさん
20/02/12 10:03:09.83 DWihvkH4.net
URLリンク(qph.fs.quoracdn.net)

789:デフォルトの名無しさん
20/02/12 16:01:35.18 a1w2Xqz0.net
>>743
ああなるほど
if(TRUE == !!b) のことか
if(!!b) は javascript の方だろ

790:はちみつ餃子
20/02/12 16:24:33.81 KQxiYwOn.net
! は見づらいから私は not と書くことにしてる。

791:デフォルトの名無しさん
20/02/12 17:16:20.22 DU9qWhLl.net
一応、alternative tokensに規定はあるが
使う奴の心は #define BEGIN { なんてやるやつと同質だね

792:デフォルトの名無しさん
20/02/12 17:20:59.01 DU9qWhLl.net
Cにも_Boolがなきゃヤダジタしてたやつとか
マジそういう言語へ行ったきり帰ってくるなって感じ
で結局BOOL < 0みたいなオカシイことが起き出す原因を作りやがる

793:はちみつ餃子
20/02/12 17:47:16.08 KQxiYwOn.net
C と C++ で解釈が違うのに結果として動作は同じみたいなのがたまにあってすげーなって思う。

794:デフォルトの名無しさん
20/02/12 18:09:20.78 goJJte/u.net
たとえば?

795:はちみつ餃子 ◆8X2XSCHEME
20/02/12 19:09:04 KQxiYwOn.net
>>770-771
if 文の条件式を見てて思い出した。
C だと条件式の評価結果を 0 と比較するというルール
C++ だとブールに変換するというルール。

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

他にも列挙定数の型が C と C++ では違うとか……。
私が把握してるのはそんくらいだけど、
探せばもっとあるんじゃないかな。

796:デフォルトの名無しさん
20/02/12 20:25:01 ytylQgpT.net
>>766
>if(TRUE == !!b) のことか

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

!!b は、bool型(と、しばしばオーバーロード)を備えた言語で非bool型の値bをbool型に変換するテクニックだろ。

797:デフォルトの名無しさん
20/02/12 20:38:11 rfok9Tr/.net
b!=0 で良い

798:デフォルトの名無しさん
20/02/12 21:12:18


799:h1wCYtKx.net



800:デフォルトの名無しさん
20/02/12 21:26:37 rfok9Tr/.net
(bool)b
はCへの移植の可能性があるならやっちゃダメ

801:デフォルトの名無しさん
20/02/12 21:31:03 DU9qWhLl.net
>>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.

802:デフォルトの名無しさん
20/02/12 21:34:37.96 rfok9Tr/.net
typedef char bool;
の可能性があるから

803:デフォルトの名無しさん
20/02/12 21:35:17.48 ytylQgpT.net
Cに移植する可能性があるならC++の機能を使っちゃダメなのは当たり前だよなぁ
C++スレで言うことではないと思うが

804:デフォルトの名無しさん
20/02/12 21:36:55.01 rfok9Tr/.net
>>779
問題点はそこじゃない
移植時にコンパイラが問題点を見つけられないのが問題

805:デフォルトの名無しさん
20/02/12 21:38:26.52 rfok9Tr/.net
コンパイラが問題点を見つけられない例は他に山ほどあるが
だからといってわざわざ増やさなくても良い

806:デフォルトの名無しさん
20/02/12 21:39:05.32 ytylQgpT.net
いや、問題があるなら移植する人が見つけろよ

807:デフォルトの名無しさん
20/02/12 21:40:47.83 rfok9Tr/.net
移植は完璧な人がする
なんて妄想は捨てた方が良い

808:デフォルトの名無しさん
20/02/12 21:42:13.60 rfok9Tr/.net
Cに移植する可能性が無いならどうでも良い
ちなみにキャストで警告が出る環境もある

809:デフォルトの名無しさん
20/02/12 21:42:36.95 ytylQgpT.net
だからそれは移植する側の問題だろ。勝手にやれよ

810:デフォルトの名無しさん
20/02/12 21:52:54.99 DU9qWhLl.net
>>778
マクロとtypedefが被った場合どうなるか解ってる?

811:デフォルトの名無しさん
20/02/12 22:12:26.79 ecElmrkB.net
もちろん

812:デフォルトの名無しさん
20/02/13 00:16:13.58 X++L6urQ.net
>>733
Rustを少し見てみたけど、書き方が全くC/C++とは違っていて、
全く異なる文化圏の言語になれた人が設計した臭がした。
これがC/C++の代替になるとは考えにくい。
はっきり行って、これを使えといわれると辛い。

813:デフォルトの名無しさん
20/02/13 00:26:27.60 YbJF2Pjt.net
テスト機能が標準で用意されてるのはいい

814:はちみつ餃子 ◆8X2XSCHEME
20/02/13 00:45:52 XX4mj9DD.net
個人的には Rust は好感触。
型システムは ML 系言語で実績があるものを基礎にしてることもあって、C++ のグダグダな歴史を背負ったものよりはまとも。
ML 系はやっぱり高級路線の言語だし、インデントでブロックを表す系統なのがしんどいけど、
Rust は上手く低レイヤ用 (としても使えるよう) に着地させてるし、 C 風の外観を踏襲してもいる。

C++ が Rust から取り入れられるものはそんなに多くないと思う。
C++ は良くも悪くも互換性についてかなり強い要求があるので、
Rust 的な、カッチリと保護された仕組みを後付けするのはどう考えても無理。
C++ が Rust を参考にすることは間違いなくあるとは思うが、
全体の思想がまるで違うので限定的な範囲でしか取り入れられない。

もし取り入れらたらそれは C++ の新機能として新しく学ぶので十分でしょ。

Rust を学ぶのは間違いなく有用ではあるけども、
Rust の知見が C++ に取り入れられる可能性がありそうだからという理由ならそんなに意味ない。

815:デフォルトの名無しさん
20/02/13 01:02:46 b1nbpqgi.net
C++の配列は長さの情報を持ってないってことになってるけど
長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?
なんでその情報をプログラマが利用できないようになってるの?

816:デフォルトの名無しさん
20/02/13 01:06:29 qzSQSiwu.net
rustがかっちり保護してくれるとか低レイヤー向けとか馬鹿ほど信じてるよね。
ありゃ帯に短し襷に長しの典型言語だわ。

817:デフォルトの名無しさん
20/02/13 01:44:34.08 X++L6urQ.net
>>792
実際、Rustは、Cを簡単にするのではなく、Cを難しくしてしまっていて、Cのポインタが理解できない or 難しく感じる人には、Rustの特徴の核心たる所有権、借用などの部分はちんぷんかんぷんだと思う。

818:デフォルトの名無しさん
20/02/13 01:48:50.73 X++L6urQ.net
>>793
Cの問題点を取り除いたと言うより、ほとんど全てのプログラミング言語が暗黙のうちに用いている代入の概念をなるべく使わないようにして変数束縛などの全く異なる独自概念を用いようとしている。
しかし、これは、手続き型言語と関数言語の違いに匹敵するくらいのプログラミングの概念の変更になってしまうため、手続き型言語の中で改良された次世代言語と言うものではなくなってしまっているとも言える。

819:デフォルトの名無しさん
20/02/13 05:24:36 AWnkBPoe.net
変数束縛って右辺値参照でしょ

820:デフォルトの名無しさん
20/02/13 06:24:47.58 fMXzK7Sc.net
RustはC++なら簡単にできることをものすごく回りくどく書かないとコンパイル通らない感じだからとてもつらい

821:デフォルトの名無しさん
20/02/13 09:13:38.23 6FSFTWhE.net
>>790
RustがC++に取って代わることがあるか、というニュアンスの質問でした
今C++でやってる仕事がRustに置き換わる可能性が高いなら今から勉強しとこうか、と

822:デフォルトの名無しさん
20/02/13 12:35:22.33 z5cRWLgY.net
>>797
断言してもいいが、RustはC++に取って代わることは無い。
なぜなら、普通の手続き型言語での枠組みにすら入ってない書き方を強要されるから。
手短に言えば、単にC/C++と書き方が大幅に違っているだけではなく、書き方が他のどんな減の範疇にも属していない。

823:はちみつ餃子
20/02/13 13:30:24.18 XX4mj9DD.net
>>796
C/C++ でのオブジェクトの寿命の管理の難しさってのは
理屈が理解しづらいというよりはわかってても間違うという難しさなんだよね。
そして間違っていてもコンパイラは黙って通すことも多い。
C/C++ を長く使っていればそれを感じることって結構あるでしょ。
そういう部分のプログラムが正しいことはプログラマが保証しなくてはならんわけだ。
でも Rust では言語処理系の側でやってくれる。
C/C++ で面倒な部分を Rust では自動でやってくれる。
まわりくどいのは確かだけど、それで楽できるのも確かなので、
どっちを取るかって話だな。
オブジェクトをどこで後始末するか。
管理の主導権はどのモジュールに持たせるか。
そういうのって C/C++ でも考えてるよね。
C/C++ ではプログラムに書いてないだけで本来はあるはずのものなんだよ。
(C++ だとスマートポインタの導入で少し楽にはなったけど。)
自分が何を考えていたのか、そして何を考えられていなかったのが
明らかになるのはそれはそれで楽しいと思う。
まあ、それは俺が趣味でやってるからかもしれんな。

824:デフォルトの名無しさん
20/02/13 13:34:58.25 3lSBa444.net
おまえの設計がヘタクソなだけだろ

825:はちみつ餃子 ◆8X2XSCHEME
20/02/13 13:45:30 XX4mj9DD.net
>>800
そうだよ。
そんでもって大抵の人間は設計がヘタクソだし、
ヘタなところが検出されるなら検出されないより良い。

826:デフォルトの名無しさん
20/02/13 14:01:13 z5cRWLgY.net
>>799
変数束縛やら所有権や借用の概念が複雑すぎて、そっちの方が C/C++の
メモリ管理よりミスし易い。

827:はちみつ餃子 ◆8X2XSCHEME
20/02/13 14:13:53 XX4mj9DD.net
>>802
間違いなくミスし易いけどミスした箇所が検出できないということはあまりない。

828:デフォルトの名無しさん
20/02/13 14:20:14 3lSBa444.net
設計がヘタクソなヤツが書いたソースのメンテやらされるのは最悪だけど自分で組み上げるならC++以外有り得ない
各々の力量が顕著に表れやすい最高の言語には違いない
バカも容易に炙り出せるしな

829:デフォルトの名無しさん
20/02/13 14:20:33 z5cRWLgY.net
>>803
仮にあなたはちゃんと理解できても、一般のプログラマは変数束縛やら所有権や借用の概念を理解することが難しすぎるので、C/C++を置き換える言語にはならない。
それらの概念は学習コストが高すぎるどころか、一生理解できないプログラマが多いだろう。

830:はちみつ餃子 ◆8X2XSCHEME
20/02/13 15:53:13 XX4mj9DD.net
>>805
誤解のないように補足しておくけど、俺は Rust が C++ を置き換えるという主張はしてないからね。
C++ の重大な欠点を (実行コストをあまり払わない形で) 改善しているのは確かってだけ。
そんでもってそれが必要な場面は間違いなくあるってことも。

831:デフォルトの名無しさん
20/02/13 19:21:34 b1nbpqgi.net
>>791
わかる人いませんか?

832:デフォルトの名無しさん
20/02/13 19:29:34 z5cRWLgY.net
>>807
new TYPE[] のようにしてヒープから配列として確保されたメモリは確かに
要素数の情報を持っている。
しかし、new TYPEのように配列ではない場合は、高速化のために情報を
持ってない処理系もある。そのために 前者では delete[] を、後者では
deleteを使うことになっており、間違った組み合わせを使った場合には
不具合を生じる。

また、ポインタは、ヒープから確保された配列ばかりをポイントしているとは
限らず、例えばスタック上のローカルオート変数や、グローバル変数をポイント
していることもあり、その場合には、要素数の情報は全く持っていない。

さらに、Cの場合、関数の引数に TYPE buf[] のように配列を書いても、
TYPE *buf に自動修正される仕様となっている。
そのため、配列を受け取るのは、必ずポインタということになる。
しかし、ポインタで受け取るということは、そこには、&a のように、
ローカルオート変数も実引数として指定して呼び出すことも出来る。
その場合には要素数が無いので、あなたの望みをかなえる高速な
一般的方法が存在しない。

望みをかなえるためには、言語の拡張が必要となる。

833:デフォルトの名無しさん
20/02/13 19:33:05 bRhYdbIA.net
Rustっていろいろ清々しいよね
関数型言語に必須じゃねえのと思うリスト関係がぽっかり抜けてるのは不満だけど

834:デフォルトの名無しさん
20/02/13 19:57:05 WjLTLikp.net
>>807
URLリンク(ideone.com)

835:デフォルトの名無しさん
20/02/13 20:01:17 b1nbpqgi.net
>>808
ヒープに確保した配列の要素数はやはりメモリ上にあるんですね
手段がないのは文法として一貫性をもたせられないからということでしょうか
なるほど、回答ありがとうございます

836:デフォルトの名無しさん
20/02/13 20:08:49 J94ypinO.net
delete [] pと同じように
sizeof [] pを用意すりゃいいのにね
pがnew []されてなかったら誤動作するって挙動ならdeleteと同じだろうに

837:デフォルトの名無しさん
20/02/13 20:15:32 iivZofrB.net
言いたいことは分かるが構文がきもい

838:デフォルトの名無しさん
20/02/13 20:17:34 Y6SS1xK+.net
欲しいなら作れば?
それができるのがc++じゃん

839:
20/02/13 20:36:41.73 ImKshd8q.net
>>791
>C++の配列は長さの情報を持ってないってことになってるけど
>長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?
new したときは、その領域サイズが実行時にユーザーのみえないところに保存される、というだけなのでは?
C/C++ の配列は長さ情報を(自分でそう書かないかぎり)持たないとおもいますよ

840:デフォルトの名無しさん
20/02/13 20:38:39.62 WjLTLikp.net
ちゃうねん。

841:デフォルトの名無しさん
20/02/13 20:50:05.52 qzSQSiwu.net
設計がダメな場合コンパイラにいくら指摘されようと根本的には治らんのだが、
(たいていそういう馬鹿はコンパイラ通すためにmut,RefCell,unsafeを使いまくる)
そういうのを少しもわかってないバカがrust推しなんだよなぁ。
構造体を1から作り直さなきゃならんかったり根本的に間違ってる。

842:デフォルトの名無しさん
20/02/13 21:00:18 sl9OX6cI.net
>>808
new TYPE[]するとき内部的にサイズ情報を持つ保証ってあったっけ?
例えば自前でoperator new []を実装するとき、予め2^nバイトのブロックを所定の数用意しておいて、要求サイズに応じて必要十分な大きさのブロックを返すなら、割り当て時に要求されたバイト数または要素数の情報を保持しないという実装も可能かと思う。

843:デフォルトの名無しさん
20/02/13 21:18:32.64 9NIgZq2/.net
>>811
いえいえ

844:デフォルトの名無しさん
20/02/13 21:37:18.24 Y6SS1xK+.net
>>818
デストラクタ呼ぶ必要ある

845:デフォルトの名無しさん
20/02/13 21:39:24.09 J94ypinO.net
デストラクタ呼ぶ必要ない型だと、size情報持ってないと言うことなんだろうね

846:デフォルトの名無しさん
20/02/13 21:40:36.17 sl9OX6cI.net
>>820
デストラクタの実装も、返ってきたアドレスの値でどのサイズの領域か(割り当て要求されたサイズではなく、自分で区切ったブロックのサイズ)が分かるようにしておけば大丈夫でないかな?

847:デフォルトの名無しさん
20/02/13 21:41:24.98 sl9OX6cI.net
>>822
すまん、勘違いでした。全部忘れてください

848:デフォルトの名無しさん
20/02/13 22:02:22.87 WjLTLikp.net
はい忘れました。

849:デフォルトの名無しさん
20/02/13 22:06:16.93 Bk3UL691.net
アドレスだけじゃなくて長さも受け渡しするインターフェースにしましょうとしか。

850:デフォルトの名無しさん
20/02/13 22:36:33.13 WjLTLikp.net
シリアル化の王道ってありますか?

851:デフォルトの名無しさん
20/02/13 22:45:19.55 iq5JxXln.net
オブジェクトならCORBA、データ構造だけでいいならASN.1とか。

852:デフォルトの名無しさん
20/02/13 22:54:55 tx2lxPGZ.net
>>822
TYPEがデストラクタを持つclassの場合に、ptr = new TYPE[n] で確保されたメモリ
を delete[] ptr とすると、 正確に n 回デストラクタを呼び出す必要がある。
new が n * sizeof(TYPE) より大きめのブロックを確保した場合でも、
delete[] ptr 時に正確な n の値を割り出す方法が必要となる。
なので、n の値は ptr の値さえあれば知ることが出来ることが必要条件となる。
つまり、少なくともデストラクタを持つ TYPE の場合に TYPE の配列をヒープから
確保した場合には、配列の要素数を必ず配列の先頭のポインタの値から「知る」事が出来る。

853:デフォルトの名無しさん
20/02/13 23:01:33 WjLTLikp.net
>>827
もうちょっと簡単なのないですかね。
型情報要らないんで。

854:デフォルトの名無しさん
20/02/13 23:09:58 iq5JxXln.net
型情報が無けりゃデシリアライズしても使いようがあるまい。

855:デフォルトの名無しさん
20/02/13 23:12:32 WjLTLikp.net
それがあるんですよ兄さん。

856:デフォルトの名無しさん
20/02/13 23:12:57 ktN45haN.net
双方向mapって何使うのがいいですか?boostのbimap?
それともこのくらいは自作してる人のほうが多いですか?

857:デフォルトの名無しさん
20/02/14 00:05:24 CPLKNT1n.net
双方向Mapって何に使えるんですか?

858:デフォルトの名無しさん
20/02/14 01:54:24 0WgbwkuV.net
型情報ないならそもそもデシリアライズできないし
型情報なしで成り立つ、つまり型情報を事前に知っている前提なら
バイナリでそのまま送ればいいだろ

859:デフォルトの名無しさん
20/02/14 02:05:36 raWqkpxU.net
型がわかっててもコンテナはそのままではバイナリで送れない

860:デフォルトの名無しさん
20/02/14 02:11:15 CPLKNT1n.net
>>834
そのやり方教えて。
あめさんあげるから。

861:デフォルトの名無しさん
20/02/14 07:52:45.40 RsXMnrpQ.net
ちゃんとやるならPODに詰め替えてからchar配列へreinterpret_cast

862:はちみつ餃子
20/02/14 09:19:01.22 nLeEzkye.net
>>826
シリアル化ってのにどういう要件を置くかだな。
同じ環境でデシリアライズ出来ればよいのであれば >>837 で十分だろうし、
データ形式が決まってて (あるいはデータ形式の側を中心に策定したくて)
それのシリアライズとデシリアライズを (それぞれ別の環境で (ときには言語も違うかも)) やりたいということなら
protobuf などのツールを使うのはよい案だと思う。

863:デフォルトの名無しさん
20/02/14 13:35:07 vZZ7SPTm.net
boostにあるじゃないですか
googleのなんか使うんじゃありません

864:デフォルトの名無しさん
20/02/14 13:41:23 a5iC3cHy.net
>>791
>>807
実装�


865:ヒ存だと思うけど hoge[-1] あたりに格納されてた



866:デフォルトの名無しさん
20/02/14 13:49:57 rQdJoGM9.net
>>840
VC++の場合、ptr = new TYPE[n] で確保された場合は、確かに
ptr[0] == n
になっていた気がする。
「確かに」というのは言葉のあやで、厳密には覚えてないが、
VC++の new で使われる組み込み関数のライブラリのソースコードを見ると分かる。

867:デフォルトの名無しさん
20/02/14 13:50:28 rQdJoGM9.net
>>841
すまん、
ptr[-1] == n
の間違い。

868:デフォルトの名無しさん
20/02/14 14:03:39 a5iC3cHy.net
>>807
>>841
OSやコンパイラで違うんでしょ
URLリンク(ideone.com)

869:デフォルトの名無しさん
20/02/14 15:26:11.39 rQdJoGM9.net
>>842
あ、すまん、正しくは、大体、
 ((DWORD *)ptr)[-1] == n
だ。
ptr[-1] だと、sizeof(TYPE)分、アドレスが戻ってしまうし、
結果の型も DWORD とかではなく、TYPE 型になってしまう。

870:デフォルトの名無しさん
20/02/14 15:28:19.59 rQdJoGM9.net
>>843
言っておくが、new char[n] とかでは、駄目な可能性は有るよ。
話は、「TYPEがデストラクタを持つとき」のnew TYPE[n]に限定。

871:デフォルトの名無しさん
20/02/14 17:17:51.62 jFoBh/u0.net
一時オブジェクトの寿命について、ご教示ください。
例えば、以下のようなコードがあった時、
void foo(const char* c); // 外部ライブラリの関数につき変更不可とする
void main()
{
const std::string s = "aaa";
foo((s + "bbb").c_str());
}
一時オブジェクトstring(s + "bbb")の破棄が行われるのは、
関数foo()を呼ぶ前でしょうか、呼んだ後でしょうか。
調べた範囲では、「完全式の終わり」という話が出てきたのですが、
どこまでが完全式なのか判断できませんでした。

872:はちみつ餃子
20/02/14 17:22:07.67 nLeEzkye.net
>>846
この場合はその行の終わり。
セミコロンのところだと思っていい。


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