質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

複合代入が嫌いな件💛

解決済

回答 10

投稿

  • 評価
  • クリップ 0
  • VIEW 4,019

score 108


♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡


代入演算子のうちの一つ、
複合代入が嫌いです。
省略代入演算子とも呼ばれますね。

+= 
*=
%=

とかですね。

①  x = x + 10;

②  x += 10;
と書くのが嫌いです。

なるべく親切で、綺麗なcodingを心掛けたいんですが、みなさんは①か②どっち派ですか?

効率とか高速化?とかも懸念しないといけないですよね〜〜


よろしくおねがいします٩(๑❛ᴗ❛๑)۶

♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡o。.。o♡
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/02/07 07:08

    こちらの質問が他のユーザから「問題・課題が含まれていない質問」という指摘を受けました
    teratailでは、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。
    「編集」ボタンから編集を行い、質問の意図や解決したい課題を明確に記述していただくと回答が得られやすくなります。

回答 10

+13

この程度でしたら、速度よりも可読性の問題になると思います。
また、そういう視点ですと代入演算子を使ったほうが読みやすいです。

例えば、変数が長かった場合、、

String theLongGoodbyeByRaymondChandler = "Raymond";

//読みやすい
theLongGoodbyeByRaymondChandler += "Chandler";
//読みにくい
theLongGoodbyeByRaymondChandler = theLongGoodbyeByRaymondChandler + "Chandler";

となります。

これが一行ではなく何百行にも渡るとき、
こういう1つ1つの心遣いが可読性を大きく変えます。

という感じです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/26 01:26

    私も+=派ですが、この回答はカッコいいですね。

    キャンセル

  • 2016/02/12 18:12

    確かにかっこいいです٩(๑❛ᴗ❛๑)۶

    キャンセル

+4

どの程度あるかは別として、
x[foo(1)] += 2
のようなのは、簡単に書き換えられません。foo()が副作用を持っているかもしれない。Cだとポインタを使えば出来ますが、見苦しくなる。

x[a*a+b*c+3] += 2
も、書き換えるとすると、
x[a*a+b*c+3] = x[a*a+b*c+3] + 2
か、
i = a*a+b*c+3
x[i] = x[i] + 2
ですが、どちらも、いまいちです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 18:18

    高度です(´・ω・`)!!
    勉強になりました。

    キャンセル

+4

私はむしろ可能な限り複合代入を使いますね.やっていることが同じであることはわかるのですが,
x += nなどは「xをn増やす」という具合に直感的にわかるのですが,
x = x + nは「xをx+nで置き換える」という解釈になり,ちょっと戸惑います.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 18:17

    そちら側の方もいらっしゃるのですね(´・ω・`)!!

    キャンセル

checkベストアンサー

+3

最終的には好みの問題ですし、読みやすさは演算子の使い方だけで決まるものでもないので、一般論で論じている限り答えは出ない(ケースバイケース)ということだと思います。

決してこの手の質問を否定している訳ではないのですが(その証拠に回答する側にちゃっかり加わっています)、職業柄のせいか、どうもこの手の「白黒をハッキリさせたい」的なご質問や問題提起が多いように感じています。

例えば今回のご質問に関して言えば
  • 言語特有の伝統文化
  • コードの文脈
  • 処理の内容やシステムの分野
  • 処理系の実装の違い
・・・などなど、様々な前提条件を踏まえた上で、プログラマーの好みやポリシーや経験や、さらにはプロジェクト規約等によって決まる問題なので、もし意見を募ったりどちらが良いかアドバイスを求めたりするのであれば、それなりに「前提条件」をきっちりと提示された方が実りの多い質疑応答になると思います。

という、チョット堅苦しい前置きをした上で、自分の 好み というか ポリシー をすこしだけ書きます。

一般に、ある変数に何かを加える(add)という意味では、
x = x + y
のスタイルが分かりやすい(見やすい)かなぁ~と考えております。

しかし、たとえば Java ではどうしてもメソッド名などが長くなりがちなので
x += y
みたいな記法の方が可読性が高くなるケースもあります。

それと、特にC系の言語では「タイプ数の少ない」ことを美徳とする風習があるので「省略代入演算子」が多様される傾向が強いですが、例えば
i++
のような記法は、変数 i へ1を加算(add)ではなくて、ループカウンタの増加(increment)なので、躊躇せず意図的に i++ を使っています。

また、組み込み系やデバイスドライバーのようなシビアな分野で無い限りあまり意識しないと思いますが、処理系によっては i++ のように記述する事で レジスタ変数 に割り当てられ処理上のオーバーヘッドが軽減されるケースもあります。

細々書きましたが、要するにケースバイケースと言うことですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

Rubyなどでは、Don't repeat yourselfという文化があって、むしろ同じ変数を繰り返し書かない、複合代入の形が好まれています。

# こんな複合代入も存在する
# 「aが未定義、false、nilのどれかなら0を代入する」という意味
a ||= 0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 18:16

    そうなのですね(´・ω・`)!!

    キャンセル

+3

私はインフラの維持のために、PowerShellを使って手で繰り返し行う処理を自動化するためにスクリプトを書きます。
後の人にも読んでもらいやすくするために、変数名は略称を使わずに命名するので長くなりがちで、スクリプトをパッと見た時に「+=」や「++」を使った方が読みやすいので意図的に多用しています。
メモ帳で開いた時に「ミッチリ」と詰まっていると、どうにも読む気力が失せがちだと感じています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 18:16

    勉強になりました、ありがとうございます。

    キャンセル

+2

私は時と場合によります。

大学の研究でプログラミングをするのですが、自分の実験程度や自分しか見ないプログラムなら
x += n
のような形で書きます。

後輩に譲ったりするプログラムでしたら、
x = x + n
のように書いてます。

どちらが見やすいかと言われると……慣れですかね…?^^;

個人的には
x = x + n
のほうが見栄えは好きです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 18:11

    慣れですね٩(๑❛ᴗ❛๑)۶

    キャンセル

+2

ちょっと質問させてください。

何故、複合代入が嫌いなんでしょうか?

もし理解しづらいという理由なら、自分の経験上、復号代入よりもっと別の所が理解しづらいのが原因だったりします。

もっと別の理由があるならおききしたいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 18:15

    プログラミングはおおか、数学に慣れないスパー初心者からみると混乱してしまい難しいです゜・(Pдq。)・゜。

    キャンセル

+1

文字タイプ数を減らすという意味合いが強いです。
しかし一部の言語は、xに1を足すだけの場合にx++みたいに表記することが出来たりして、
x+=1でもx=x+1でも3つは一緒に見えます。
でも、言語環境によってはコンパイル後のバイナリーコード生成の最適化度合いが変わってくるため、
言語環境によっては成果物がどうなるかを気にしながらコーディングする必要もあります。
例えばC/C++とか。
コンパイラが十分賢くて最適化を更に推し進めていくケースもあるので一概にはいえませんが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

自分は、制御系な奴なので、使い分けています。

x = x + n;
x += n;

すべての環境で、確かめてるわけではありませんが、 たとえば x が volatile とか、 static / automatic かによって、吐かれるオブジェクトコードが変わる可能性があると思うので。

コードの見通しの良し悪しは、どちらかと言うと採用したアルゴリズムの方に依存する事の方が大きい気がします。



投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/12 18:15

    実に興味深いお話です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る