32218


とある回答への某コメントで

> I was tempted to give you an upvote until I saw "Yoda style". That style was
> horrible even when it was useful. Nowadays, every decent compiler will
> generate a warning about assignments where conditionals are expected, so
> that style is still horrible and now completely useless.

とされていて、(拙訳、重大な間違いがあったら修正下さい)  
「ヨーダスタイルを見るまではアップボート(良回答投票)しようと思ってた。  
それはかつては役に立ちましたが寒気のするものでした。  
今ではコンパイラがそのような条件を代入とすることについて警告を発するので  
まるで役に立たないばかりかまだ寒気のするスタイルです。」

えらく嫌われるもんだなと思います。  
（この方だけでなく他にも（既に場所は忘れましたが）似たようなコメントを見たことがあります）  
私は以前の大流行も知っていますし、現在ではほとんど使われなくなったと感じていますが、  
実際の所  
`1==value`と書いても`value==1`と書いてもプログラムとしての意味は変わりませんし、  
実際`1=value`になっていたら警告がでるでしょうし、  
clang では`value=1`で警告がでますが、  
gcc ではオプションを付けなければ警告はでません。（新しいバージョンだと違う？）

私的にはどっちでもそんなに目くじら立てるようなこと(また回答としての評価を下げること)なのかな？と思います。

また関数の返値の場合も（次の例の場合代入でさえないがヨーダスタイルと言われる(?)）  
`1==func()`よりも`func()==1`の方が好まれるような感じを受けます。

これ（ヨーダスタイル）って英語の文脈的に生理的に受け付けないとかそういう意味があるんでしょうか？  
なぜそこまで毛嫌いされるのですか？


CC BY-SA 3.0
2017-01-28T03:54:58.117
32214
2017-01-29T02:26:44.957
2017-01-29T02:26:44.957
754
5044
question
c coding-style
ヨーダスタイルについて


コメントで色々会話されているようですが，ヨーダスタイルがなぜ現代では用いられていないのかについてここで回答として書いておくことは，後で読む人のために有用だと思うので書かせてください．

そもそもヨーダスタイルとはif文などの条件判断部内の式で

[code]

    value==1
    
[/code]

と書かずに

[code]

    1==value
    
[/code]

と定数を左辺に，変数を右辺に書くスタイルを指します．  
ヨーダスタイルという名称は，スターウォーズに出てくるヨーダという長老ポジションのキャラクターが倒置法を多用して喋ることに由来しています．

なぜこのように逆にするかというと，`==`演算子を打ち間違って`=`演算子にした場合に結果が異なるためです．  
前者では

[code]

    value=1
    
[/code]

となり，C言語においては，式の結果は（`value`の元の値に関わらず）代入後の`value`の値，すなわち`1`となります．ここで，C言語においては代入文がif文の条件判断部に書いてあった場合もシンタックスエラーではないというのがミソで，原因が分かりにくいバグの原因になります．

一方，後者では

[code]

    1=value
    
[/code]

となり，定数に代入しようとしているためこれは明確にシンタックスエラーとなります．

こうした人間のケアレスミスによるバグを無くすために過去には使われることがあったヨーダスタイルですが，現代では使うことは誤りだと考えられています．

その理由としては，「ソースコードはコンピュータではなく人間のために読みやすくあるべき」という前提があることが挙げられます．

ヨーダスタイルは，一言で言ってしまえば，コンパイラが人間のケアレスミスを発見しやすくするためのスタイルです．すなわちコンピュータのための記法です．

一方で，英語がどうということは一旦置いておいても，少なくともC言語においては変数は左辺に，定数は右辺に書くことが自然です（代入演算子との一貫性がある）．なので，ヨーダスタイルを知らないプログラマが既に書かれたヨーダスタイルのコードを読んだ時，少なからず面食らうことは容易に想像できます．

これらは「ソースコードはコンピュータではなく人間のために読みやすくあるべき」という前提に反します．

また，質問者の方がおっしゃるように現代のコンパイラはこの手の比較演算子と代入演算子の書き間違えは普通に検出することができます．

ちなみにGCCでは`-Wparentheses`オプションを付ければ警告が出るようになります．（今回の話とは関係ありませんが，コンパイラの警告機能はデフォルトで全て有効にしておくべきです．GCCでは`-Wall`オプションで全ての警告機能を有効にできます）

以上のことから，最早現代においてはヨーダスタイルを使用する必要はまったく無くなりました．  
新しいコードを書く上でヨーダスタイルを使うのは止めましょう．  
巨人の肩に乗るべきです．ヨーダは小柄すぎます．


CC BY-SA 3.0
2017-01-28T08:08:40.393
32218
2017-01-28T08:43:52.717
2017-01-28T08:43:52.717
4548
4548
32214
answer