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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1439閲覧

for ループ における「前置きインクリメント演算子」に関するメリットについて

GuielNo4

総合スコア88

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/11/05 02:54

アドバイスを頂きたいこと

前任者より引き継いだコードのリファクタリングを行っているのですが、
forループにて「前置きインクリメント演算子」の記述があり、
以下のコードで、
「「前置き」にすることで index を2からスタートさせようとして書いたのか?」と思える部分を見かけました。
実際は1からスタートすると思うのですが…

少々紛らわしいコードの書き方のような気もしたので、
コードの記述を += 1; にし、ビルドイメージが一致したので、
この記述に変更しようと思ったのですが、
「前置きにすることによる別のメリット」「変更によるデメリット」もあるのではないかと思い、
質問させてもらうことにしました。

「該当のソースコード」と「試したこと」

【引き継いだ状態】 for( int index = 1; index < 10; ++index ) { .... } 【変更後】 for( int index = 1; index < 10; index +=1 ) { .... }

どちらもビルドイメージが一致したので、コンパイラは同じと判断したことになると考えております。

アドバイスを頂きたい内容

可読性も含め、forループの「前置き」にはどんなメリットがありますでしょうか?
また、この変更によって、デメリットがありますでしょうか?

アドバイス頂けると助かります。
宜しくお願い致します。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/11/05 03:27

変更後の > +=1 の方が「紛らわしいコードの書き方」に思えます. (何で「++」じゃないの? 何か特別な意図が…? と.)
GuielNo4

2020/11/05 05:11

++の方がメジャーなのですね…プログラムをデコる...というか、至るところに コメントを //++++ や /*-----*/ といった記述が多くみられるコードのリファクタリングをしていまして、コード分析のとき検索しにくいので、この記述にしています。
fana

2020/11/05 05:14

コメントの方をリファクタリングしよう!
GuielNo4

2020/11/05 05:46 編集

アドバイスありがとうございます。コメントのリファクタリングも必要ですね… 下記、アドバイス頂いております内容も鑑みているのですが、「前置き」「後置き」には「暗黙の了解的」(的を得た表現ではないかもしれませんが) な意味について解釈が「できる人」「できない人」で変わるようですので、個人的にはまずコード設計として「前置き」「後置き」が絶対的に必要な場面でなければ +=1; にする方がしっくりくる気がしています。「今のところ」ですが…
fana

2020/11/05 06:12

まぁ,+= も コメントの話も, 変更すること自体が(時間と労力,無意味な差分の発生…,といった面での)デメリットとも言える気がしないでもないので, そういった些細な事柄の変更は保留しておいて,もっと本当に必要なことから先にやった方が良いんじゃないかな,とか. (わざわざやらなくて良いようなことであれば,やらないでおけば良い)
guest

回答2

0

ベストアンサー

言語の意味論としては、後インクリメントというのは「変数を更新する」「変数が更新される前の値を評価値とする」という性質があります。 このととから更新前の値をコピーして残しておかなければいけません。 そのような必要のない場面では前インクリメントの方が意図を正確に表現できていると考えられます。

ただ、少なくとも現代的な最適化能力のあるコンパイラでは、質問の事例で評価値を使わないことを見抜けますし、使わないなら事前にコピーしておく必要がないということもわかるのでやらないようなコードを生成します。 要するに差は出ません。

for 文でのループカウンタを更新するのは後インクリメントを使う方が初期に習慣として定着してしまったこともあってそれに合わせることは多いのですが、 C++ で意味論を意識する機会が多いのでそちらから輸入する形で C でも前インクリメントを使うことが好まれる場合もあります。

つまり、昔からの習慣を大事にするなら後インクリメント、意図を言語仕様の理屈に基づいて正確に反映させるなら前インクリメントという感じですね。

投稿2020/11/05 03:11

SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/11/05 04:06

C++でクラス型をインクリメント/デクリメントする場合、前置か後置かでオーバーロードの呼ぶ関数が違ってきてしまいますね。
GuielNo4

2020/11/05 07:53

アドバイスありがとうございます。 ・「後置き」では「更新前の値をコピーして残す」意味合いがある。 ・前インクリメントの方が意図を正確に表現できる。 ・「習慣」と「意図としての言語仕様の理屈」での区別 以上3点、勉強になりました。ありがとうございました。
guest

0

元々意味は同じです。なので、1の部分が今後 別の値に変更の可能性がある場合を除けば、index +=1のように書くことはまず無いと思います。

おそらく後置インクリメントを避けるという意味のルールだと思います。
i++の場合は、その値を使う場合は意味が異なります。
その値を使わない場合は、結果は同じです。コンパイラおよび最適化オプションによっては生成されるコードに違いが出る可能性がありますが、現状でメジャーなコンパイラだとおそらく同じコードでしょう。

投稿2020/11/05 03:11

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2020/11/05 07:47

「後置き」では「利用する」「しない」で変数の意味が異なることに注意したいと思います。 アドバイスありがとうございました。
otn

2020/11/05 08:33

> 後置き」では「利用する」「しない」で変数の意味が異なること 違います。利用しようがしまいが、意味は同じです。 冗長に書くと、 i++ と ++i はその値を使う場合は意味が異なります。当然、生成されるコードは異なります。 i++ と ++i はその値を使わない場合は結果は同じです。現代のコンパイラでは生成されるコードも同じでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問