• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:これはAnd演算に変えてよいか?)

C#初心者の質問:And演算の使用について

このQ&Aのポイント
  • C#初心者がAnd演算を使用する場合の検討ポイントやメリット・デメリットについて、詳しい方に教えていただきたいです。
  • C#初心者がif文を使用せずにAnd演算を使用することの意義や適切な使いどころについて、経験のある方からアドバイスをいただきたいです。
  • C#初心者が複雑なif文を簡潔にまとめるため、And演算の使用を検討しているのですが、実際にメリットがあるのかどうかわからないため、知識のある方にアドバイスをいただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

やってもいいけどややこしくするだけ損かと。 僕なら int value = a + b + (swichOn ? c : 0); かしら。

koumei000
質問者

お礼

 回答ありがとうございます。  3項演算も念頭にはありましたが、投稿するのはifだけでいいかなと。  まあ、ややこしくなるだけで、アセンブラでもしない限り無用の長物なんでしょうが、知識はあっても困らないということで。  こんな事に付き合ってください、ありがとうございました。

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

「昨日の自分は今日とは別人」という言葉もありまして。 メンテナンス性は、なにより自分のためだったりします。 > int value = a + b + (c & mask); このmaskを決定する際に if( switchOn ) { mask=~ 0 ; }else{ mask=0; } などとやっているなら、valueの計算でだけifを避ける意味がないですよね。 この手法が有効なのは、 int に対してだけで、double等には使えませんよね。 アセンブリまで考えると、コンパイラの最適化の設定や性能、C#ならCLI自体の性質等、いろんな要素があって、メリットがあるかどうか単純に判断できません。 「難読」というデメリットを受け入れてまで導入するメリットは無いように思います。 // 難読そのものが目的でない限り

koumei000
質問者

お礼

 回答・ご指摘ありがとうございます。 > などとやっているなら、valueの計算でだけifを避ける意味がないですよね。  他の方の回答に書かせていただいているのですが、maskはifを使わずに設定します。それと、またしても忘れていたのですが、ローカル変数でも、引数(あれっ? 引数って、ローカル変数の一種?)でもなく、privateなフィールド変数です。  TurnSwithOn(), TurnSwithOff()メソッドなどを用いて変更します。 > 「昨日の自分は今日とは別人」  ちょっと違いますが、「一週間後の自分のコードは他人のコード」という話を聞いた事があります。さすがに、そこまで多量のコードは書いていないので一週間は自分にとって大げさですが、一ヶ月触っていなかったコードを触ったときのギャップとショックと読めなさには驚きました(ショックと驚きって重複しているような)。  それからは基本的にオープンソースとして他人に見せるつもりで書いています。あと、「コードがドキュメントだ」という他称人間コンパイラさんの言葉に感銘を受けたので、(他人の見そうなところは)コメントなしでも十分に読めるようにはしています。  といいつつ、時々、(他人が見ない部分、それもあんまりパフォーマンスに影響しそうに無い部分で)極限チューニングに拘ってみたくなったりで、葛藤に苦しんでいます。  とりあえず、こんなつまらない事に付き合ってくださいありがとうございました。

回答No.2

 回答者1さんの仰る通り3年後に見て理解し難い、追跡し難いコードは避けるべきだと思います。  私なら  value = a+b;  if( switchOn ) value += c;  ですね。  boolean の switchOnの違いでcを加算するかしないかが決まるという事が一目瞭然です。

koumei000
質問者

お礼

 回答・ご指摘ありがとうございます。  確かにそうなのですが、とりあえず、c#にはプロパティがあるので、 private const int FullMask = (2進数で111……111); public bool SwitchIsOn { get { return mask == FullMask; } } public bool SwitchIsOff { get { return mask == 0; } } にするか、または、 public bool GetSwitchIsOn { return mask == FullMask; } public bool GetSwitchIsOff { return mask == 0; }  こんな感じにすれば、maskが0のとき、スイッチオンで、maskが111……111のときにスイッチオフだと一応分かるので、理解にそんなには苦労しないと思います(c#っていうと、どんどん極限パフォーマンスから遠ざかるなぁ)。  まあ、今後アセンブラみないなことはしないと思うのですが予備知識ということで。  こんなつまらない事に付き合ってください、ありがとうございました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

悪くということはないですけどマスクだと対象となる値の一部を取り出すみたいな気がするのであまり使わなそうな。 どちらかといえば三項演算子使うんじゃないでしょうか(if使うのと変わりないけど) それにmaskの値は結局switchOnで切り替えたりしませんか?

koumei000
質問者

お礼

 回答ありがとうございます。  まあ、普通そういう回答になりますよね。言い忘れていたのですが、アセンブラとかの場合につかえるかな~と思い、質問してみました。  あと、maskの値は、今実際にswitchOnの変数を使う方法でやっているように、SwitchOn()/SwitchOff()見たいなメソッドで変更するつもりだったので、switchOnという変数は現れません。  あと、maskを使うにしても、もう少しいいネーミングを検討する予定です(思い立ったがなんとやらで、考える前に投稿したせいで命名してなかったもんで)。例えば、switchMaskみたいに(そのまんまですが)少しは分かりやすいものにはする予定です(使うタイミングなんてあるかどうか分かりませんが)。

関連するQ&A