トップページ⇒tech
537コメント123KB

boolやenumをintで代用する奴は氏んだ方がよい

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
命名規約もドキュメントもなく何型かわかるはずもないのに
「チミはなんで勝手にboolなぞという型で受け取ってるのかね!これは列挙型だよ!君のせいで修正が大変だ」
とか言われると心底ムカつく。

みんなはどうよ?
0348デフォルトの名無しさんNGNG
>>347
基本型にもコンストラクタがあるんだよね。
0349デフォルトの名無しさんNGNG
やはりC最強
0350デフォルトの名無しさんNGNG
int i = (int)(54.28f * 0.999f);
int i = int(54.28f * 0.999f);

キャストよりコンストラクタの方が美しいな。
0351デフォルトの名無しさんNGNG
>>350
それはコンストラクタのように見えてコンストラクタではない

class A {...};
class B {
...
operator A()const{}
};
A a;
B b;
b=B(a);

この B(a) がコンストラクタではないように
一見コンストラクタに見えてコンストラクタではないこともある。
0352デフォルトの名無しさんNGNG
>>351
コピーコンストラクタじゃないのかと(ry
0353デフォルトの名無しさんNGNG
>>352
operator A() はコピーコンストラクタじゃないだろ

ひさびさにアホ登場
0354デフォルトの名無しさんNGNG
>>353
ヘェー
で、どこでoperator A()が使われてるの?

>>350
それはコンストラクタのように見えてコンストラクタではない。
変換関数だったかなんかそんな名前が付いてる。
0355デフォルトの名無しさんNGNG
そもそも>>351のコードは通らんわけだが。
0356デフォルトの名無しさんNGNG
>>354
変換関数ってoperator T()のことじゃないの?
0357デフォルトの名無しさんNGNG
>>350
int i = int(54.28f * 0.999f);
は一時オブジェクト作るから無駄だよね
0358デフォルトの名無しさんNGNG
int i = int(54.28f * 0.999f);
でoperator T()が機能しているとするとすると、
int i(54.28f * 0.999f);
も基本的には同じ仕組みになっているはず。

しかしコンパイラは前者をすんなり通して、後者にだけ暗黙のキャストの警告を出す。
やはり前者は明示的なキャスト(の別表記)と解釈するのが妥当ではないか?
0359デフォルトの名無しさんNGNG
>>358
ファンダメンタルはどのような表記をしても
コピーコンストラクターではなくてキャストと同じ

int i = int(54.28f * 0.999f);
int i(54.28f * 0.999f);

この2つのコードはアセンブラレベルで同じになる
0360デフォルトの名無しさんNGNG
>>359
ユーザー定義型でも保障されてなかったっけ。
0361デフォルトの名無しさんNGNG
同じになるのは
int(54.28f * 0.999f);
(int)(54.28f * 0.999f);
0362デフォルトの名無しさんNGNG
スレタイよく読め
0363デフォルトの名無しさんNGNG
operator T()にもexplicitつけたいと思うこと無い?
たとえば情報が劣化するから明示的に呼び出してもらいたいときとか使えないし。
0364デフォルトの名無しさんNGNG
>>363
名前つきの関数を用意すればいいだろ。
0365デフォルトの名無しさんNGNG
つれないなぁ・・・
templateとかで不便じゃん。
0366デフォルトの名無しさんNGNG
>>363
constructorだけexplicit指定可能ってのは片手落だと思う

標準libraryなど簡単に変更できない位置付けのclassと
それの存在を踏まえた上でのapplicationなclassとの間で型変換をしたいとき
標準library側のclassのconstructorをいじるわけにはいかないから
applicationなclass側で標準library側のclassに対する
変換methodを用意することなるわけだが、
このときexplicit指定できないことによる痛みを実感してしまう

名前付きのmethodにすれば不明瞭さは無くなるが
templateのような場面で汎用性を維持するのが難しくなる
0367デフォルトの名無しさんNGNG
でC#ではキャスト演算子にもexplicitとimplecitが指定できるようになったんだっけ。
C#は奇形児Javaと違ってよいC++の子供だね。
0368デフォルトの名無しさんNGNG
>>367
C#はJavaの子
0369デフォルトの名無しさんNGNG
C#はプラプラの子〜♪
Javaの孫ではないわいな〜♪
それが何より証拠には〜♪
なんでもかんでも取り入れる♪
0370デフォルトの名無しさんNGNG
>>369
それは隔世遺伝というんですよ
0371デフォルトの名無しさんNGNG
畸形ばかりの血統だな
0372デフォルトの名無しさんNGNG
大元のCが美しきBCPLの醜い奇形の子だから。
0373デフォルトの名無しさんNGNG
Cはともかく、C++はブサイク度上がりすぎ
0374デフォルトの名無しさんNGNG
C++ = 肥満児
Java= 無頭児
C# = シャム双生児
0375デフォルトの名無しさんNGNG
>>374
ハム・ソーセージ美味しい!
0376デフォルトの名無しさんNGNG
>375
ハムの人?
0377デフォルトの名無しさんNGNG
とっとこー(パンを買いに)走るよハム太郎〜♪


ハム太郎の中の人も大変だな。
0378デフォルトの名無しさんNGNG
公
太
郎
美
味
し
い
!
0379デフォルトの名無しさんNGNG
>>378
動物虐待でタイーホ!!
0380デフォルトの名無しさんNGNG
食用ならおけじゃなかったっけ?
0381デフォルトの名無しさんNGNG
アセンブラレベルでいえば、ブールもプールも列挙もラッキョもない。
言い返してやれ。
0382デフォルトの名無しさんNGNG
>>381
大前提:高級言語の話をアセンブラレベルで言うな。
0383デフォルトの名無しさんNGNG
烈しく同意
0384デフォルトの名無しさんNGNG
アセンブラにbool型が無いのと、C言語にbool型が無いのは
同じレベルで話せると思うが
0385デフォルトの名無しさんNGNG
boolのあるCPUは作れるし
x86でもキャリーフラグなどはboolと考えてもいいんじゃないか?
あとbit系命令でメモリアクセスもできたはず
0386デフォルトの名無しさんNGNG
>>384
Z80のFレジスタはある意味bool型
0387デフォルトの名無しさんNGNG
>>384
で、_Boolできちゃったのよね。
無いと使い物にならない糞言語だって言われる時代が来たのが明白になったから。
この状況をどう同じレベルで話す?
0388デフォルトの名無しさんNGNG
>>387
そう言ってる奴の頭が使い物にならないだけだろ
0389デフォルトの名無しさんNGNG
でも _True / _False はできてないんだよな。
1 / 0 を使う。
なに考えてんだか。
0390デフォルトの名無しさんNGNG
>>389
C厨の頭に真や偽などという人間の発想に近い概念はない。
あるのはただ0か1かのみなのだ。
0391デフォルトの名無しさんNGNG
論理学の真偽ほど人間の発想から遠いものはないよ
0392デフォルトの名無しさんNGNG
>>391
プログラムに必要な真偽値は論理学の真偽じゃねえ。
そうである か そうでない かだけだ。
そしてそれは 0 と 1 では決してない。
0393デフォルトの名無しさんNGNG
is〜 って形の関数は ! is〜 ってなったときちょっと違和感あるよね
Ruby や Scheme の 〜? の方が自然でいい感じ
0394デフォルトの名無しさんNGNG
>>393
その違和感は慣れでなんとかなりますよ
慣れればいいだけなんですよ
0395デフォルトの名無しさんNGNG
>>393
あらゆる場所で

if (! isFull()) {

って書かれてたソースを見たことがある。しかも、「!」使ってない場所は一つも無し。
当然、「!」を取って、メソッド名を isFoundEmpty に変えて、戻り値のboolean値を反転させた。

そのあと、何で「リファクタリング」にこの作業が紹介されてないのか、子一時間悩んだ。
こっちのほうがわかりやすいのに。

>>394
それは言ってはいけない言葉だと知れ。
0396デフォルトの名無しさんNGNG
>>395
!isFull のが分かりやすい。なんで変えたの。
呼び出す側の都合に合わせすぎると疎結合になる。
0397デフォルトの名無しさんNGNG
>>395
お前は大馬鹿だ。

満タンの逆は空っぽか?
ガソリンスタンドに行ってガソリンの残りが満タンじゃなきゃ
給油してたのを空っぽになってから給油するのか?
ガソリン空なら車は停止してるわ。
0398デフォルトの名無しさんNGNG
if(isFull()) {
 /* 一杯のときは何もしない */
} else {
 ここに処理を書く
}
0399デフォルトの名無しさんNGNG
#define Not !
if(Not isFull())
0400デフォルトの名無しさんNGNG
いや、それも変だろ。冗長。
0401デフォルトの名無しさんNGNG
C++ だと not が使えるよ。

if(not isFull()) { ... }

is not full の順番にならんがな...。
0402デフォルトの名無しさんNGNG
enum って列挙された以外の値も
キャストすれば代入できるよね。

内容の保証まではしてない罠。
0403デフォルトの名無しさんNGNG
>>402
C/C++ はキャストすりゃ何でもアリだからな。
0404デフォルトの名無しさんNGNG
でも、bool (C++ の)へのキャストでは
ちゃんとした bool 値に変換されるよね。
0405デフォルトの名無しさんNGNG
いや、変換されるとは限らんのか?
(bool)1 と (bool)3 が同じ表現を持つと保障する必要性はないのかな?
別に if(b == true) と書いても
if(b != false) のように判定するようなコードを吐けばいいだけだし。

どちらにしろ bool だと特に何も問題が起こらないね。
0406395NGNG
>>396
依存関係は最初によく考えたさ。結合強度が高くなる設計の、
2クラス間でしか使われてないメソッドだった。
にもかかわらず、問い合わせの if(! isFull()) は山ほどあった。
わざわざ>>398や>>399みたいな冗長な書き方したくなっちまう
定義ってのは、つまるところ定義そのものが間違っている。
修正してやる。

>>397
馬鹿はあんた。
isEmptyじゃないぞ。isFoundEmptyだぞ。空なものが見つかった、だぞ。
俺が問い合わせたいのはな、isFullってのはな、「満室か?」ってことだ。
その逆は、「空きが見つかったか?」だ。
「空っぽか?」じゃないんだよ。何得意げな顔して「空っぽか?」、だ。
お前は本当に頭が空っぽなんじゃないかと問いたい。問い詰めたい。
0407デフォルトの名無しさんNGNG
isFoundEmpty じゃ「発見された空かどうか」じゃないの?
0408デフォルトの名無しさんNGNG
>>406
単語より演算子のほうが読みやすいと思うんだが…
0409デフォルトの名無しさんNGNG
>>407
ん?「空っぽいかどうか」じゃないの?
0410デフォルトの名無しさんNGNG
is found empty 空っぽだと判明する。
0411デフォルトの名無しさんNGNG
be + 過去分詞で受動態。
0412395NGNG
A empty room is found.
をJavaちっくに並べ替えたんだよ。
isFoundAEmptyRoom
で、長いから
isFoundEmpty
にしたんだよ。
分かりずらくて悪かったな。直しておくよ。
0413デフォルトの名無しさんNGNG
>>412
hasRoom
0414デフォルトの名無しさんNGNG
isNotFull でいいじゃねぇか。
わざわざ違う単語を使うのは混乱の元だ。
0415デフォルトの名無しさんNGNG
あと、満室じゃないのは
underoccupied って言うんだ。
でも、この単語を日本人がどれだけ知ってる?
こんな単語を使うのは、英語圏の人かただの自己満足だ。
0416デフォルトの名無しさんNGNG
>>415
そんな単語を紹介するのは、頭でっかちの人かただの自己満足だ。
0417402NGNG
>>403
C#もキャストすれば代入可能。(Javaにはenumはないみたい)
0418デフォルトの名無しさんNGNG
Javaでは1.5からEnumクラスが出来るぞ。
列挙は簡単になるし、C/C++,C#とは違って、
クラスのように継承してタイプコードに実装を統合できるのが魅力だ。

今はEnum用途のクラスを自分で定義するしか無いがな……。
イマニミテオレ。
0419デフォルトの名無しさんNGNG
> C/C++,C#とは違って、
C#とは同じ。JavaのEnumクラスはC#のパクリだからね。
0420デフォルトの名無しさんNGNG
>>419
>JavaのEnumクラスはC#のパクリだからね。
0421デフォルトの名無しさんNGNG
Java1.5のEnumで出来る事は既にC#で実現されているね。
0422デフォルトの名無しさんNGNG
C# と Java はお互い猿真似していることは咎めない。
Java がどんどんシンプルじゃなくなっていく。
大丈夫か? 初心を忘れたんじゃないか。

気が付けば MS の狙いどおりか。。。
0423デフォルトの名無しさんNGNG
シンプル伊豆ベストってのは作る側の論理だからねぇ。
Java作る側にとってはJavaがシンプルだと作りやすいけど、
その分使う側が苦労する。
CISCがシンプルだと作る側が作りやすいけど、
その分人間やコンパイラが苦労するのと同じように。
0424デフォルトの名無しさんNGNG
ところでさメモリーのゼロ番地ってどうやってアクセスするのさ?
0425デフォルトの名無しさんNGNG
>>423
んなこたぁない。
0426デフォルトの名無しさんNGNG
>>416
自己満足じゃない!
日本人PGの英語能力の底上げは是非とも必要な事だ!
適切な単語があったらそれを使ったほうがいい!
0427426NGNG
間違えました >>415 へでした。
0428デフォルトの名無しさんNGNG
>>424

(void*)0
0429デフォルトの名無しさんNGNG
>>423
> CISCがシンプルだと

それはすでに CISC じゃねーだろ。
0430デフォルトの名無しさんNGNG
 
0431デフォルトの名無しさんNGNG
既にと言うより
そもそもRISC
0432デフォルトの名無しさんNGNG
(void*)0
は処理系依存ではなかったか?
0433デフォルトの名無しさんNGNG
そもそも0番地というのが処理系に依存してるのだが
0434デフォルトの名無しさんNGNG
(void*)((int*)(sizeof (int)) - 1)
0435デフォルトの名無しさんNGNG
>>431
>>423 が RISC を引き合いに出しているのは誰の目にも明らかだと思うが、主語が CISC なのはおかしいと言ってるだけだろ ?

日本語にしてみな...

「複雑な命令セットを持つコンピュータ (の命令セット) が単純だと作りやすいけど、」
0436デフォルトの名無しさんNGNG
>>424
union{
int *p:
intptr_t i;
};

i=0;
*p=123212321;

intptr_tはポインタと同じサイズの整数型。名前間違ってるかも
0437デフォルトの名無しさんNGNG
(int)0 の内部表現が 0 だというのは
保証されてるんだろうかとか考えることがあるんだけど、
保証されていようがされていまいが、
流石にそうなってない環境なんてないよね? よね?
0438デフォルトの名無しさんNGNG
>>437
> (int)0 の内部表現が 0 だというのは
禿しく意味不明。
(void*)0 の内部表現が int の 0 と同じだと言いたいのか?
そうであれば違うアーキテクチャは山ほど存在した。
0439デフォルトの名無しさんNGNG
>>438
違う違う。
例えば負の数はアーキテクチャによって
表現法が変わることがあるでしょ?
それと同じように、0 や正の数でも
表現法が変わることもあるのかどうかってこと。
0440デフォルトの名無しさんNGNG
>>438
整数0のすべてのビットが0であるかどうかと言う問題ではないか?
0441デフォルトの名無しさんNGNG
>>440
内部表現のすべてのビットが、ね。
C の段階では全てのビットは 0 であるとされる筈。

C の段階でのビット表現と
内部表現のビット表現が同じであるということが
保障されていれば何も問題ないんだけど...。
0442デフォルトの名無しさんNGNG
×保障 → ○保証

MS-IME のバカ...。
0443デフォルトの名無しさんNGNG
整数0は全ビット0 ぬるぽはそうとは限らないけど。
0444デフォルトの名無しさんNGNG
7FFFだろ
0445デフォルトの名無しさんNGNG
・ポインタに整定数0を代入するとNULLポインタになる
・ポインタと整定数0を比較するとNULLポインタとの間でだけ一致する
だろ。「定数」だけ。

あと、
・static変数の定義を省略すると=0を付けたのと同じ
・論理値を必要とするところでポインタを書くと==0と付けたことになる
から、うまいこと省略して書ける。
0446デフォルトの名無しさんNGNG
>>445
> ・論理値を必要とするところでポインタを書くと==0と付けたことになる
> から、うまいこと省略して書ける。
?
0447デフォルトの名無しさんNGNG
>>445
!=0 ?
■ このスレッドは過去ログ倉庫に格納されています