• ベストアンサー

if等判定文での定数、変数の記述順序

perlスクリプトなどで、判定文を記述する際の考え方について、 重箱の隅的な質問になりますが、よろしくお願いします。 (1)if等判定文での定数、変数の記述順序 例えば、ある変数が0であることを判定するのに、結果は同じなのですが、 [] if($a == 0) [] if(0 == $a) のどちらで書く方が良い(理にかなっている)のでしょうか? (文字列でも同じでしょうか) [] if("$a" eq "") [] if("" eq "$a") (2)私はよく上限、下限の判定を行う際に、 [] 0 < x < 10 ということを表現する際に、 数学的に見映え(並び順)が同じになるよう、 [] if((0 < $x) && ($x < 10)){ と書くのですが、(1)のことと照らし合わせると、 [] if(($x > 0) && ($x < 10)){ と書いたり、 [] if((0 < $x) && (10 > $x)){ と書くほうが良いでしょうか。 (3)以上の(1)(2)のことは、標準的なC言語でも同じでしょうか? (4)Perl独特の書き方ですが、1行で済む実行文の場合、 [] 実行文 if(条件文); と書く方が、 [] if(条件文) 実行文; と書くよりも変換効率(?)か何かが良いと聞いたのですが、 どういう理由でどちらが良いとかありますか? この辺の違いはコンパイラが吸収してくれるので、どちらでも良いとか、 何か参考になる文献などもありましたら、ご教示よろしくお願いします。

  • goku3
  • お礼率78% (97/123)
  • Perl
  • 回答数6
  • ありがとう数8

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.6

(1) どちらが理にかなっているかといえば、断然前者でしょう。if (a == b) は 「AはBですか?」という文なので、定数==変数と書けば違和感があって当然です。 しかし、タイプミスによる代入のチェックのために後者を使うという文化も確かにあります。ですが、if 文での代入は   perl -wc スクリプト名 とすれば警告されますから、すぐに見つけられるでしょう。 (2) > 数学的に見映え(並び順)が同じになるよう、 > [] if((0 < $x) && ($x < 10)){ これは立派な心がけです。 プログラムを少しでも視覚的に分かりやすく書くことは、バグの混入を防ぐ効果があります。 (3) これらはCでもC++でもJavaでも何でも、たいていの言語で同じです。 (4) 実行効率は変わらないでしょう。ベンチを取ったら少しは違うのかもしれませんが、速度の改善をコードに求めるのはアルゴリズムやデータ構造が完全に最適化された後にすることです。 Perlは構文上、if 文のブロックを省略できないので   実行文 if 条件 や   条件 and 実行文   条件 or 実行文 という書き方を好む人も多いですが、Perlはそもそも少ないタイプでコードを書けるように、というコンセプトがあるので、会社などで制限されているのでなければ好みで使い分けてよいでしょう。 この辺のことはPerlの標準ドキュメント「perlstyle」にも書かれています。 シェルから「perldoc perlstyle」としても読めますが(英文)、下記に和訳がありますのでそちらも参照してみてください。

参考URL:
http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod
goku3
質問者

お礼

ありがとうございました。 教えて頂いたページでのLarry Wallさんのスタイルがタメになりました。 自分でも、あ、ここは同じ考えだ、ということが分かって勉強になりました。 お褒め頂いて光栄です。(笑)ありがとうございました。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

個人的には if ($a == 0)... と書きます. なんとなく if (0 == $a)... は不自然な感じだから. ちなみに演算子のオーバーロードをするときには, 数値への変換関数を「+0」という名前で表現したりする (もちろん sub +0 () と書くわけではないが) ので, そのことをふまえると if ($a + 0 == 0)... が正しいのかもしれない. 絶対やらないけど.

goku3
質問者

お礼

ありがとうございました。 >>と書きます. なんとなく >>if (0 == $a)... >>は不自然な感じだから. そうですね、私もパッと見で違和感を感じました。 ただ、下記にも色々とご意見頂いたように、それなりの理由があったようで、納得できました。 >> 数値への変換関数を「+0」という名前で表現したりする 私も、文字列の中から数字部を切り取った際に、念のためにこのようなことをやることがありました。 例えば、$a="wgt.123kg";で $val=substr($a,4,3) + 0; みたいに。

回答No.4

(1) 可読性を考えると前者、デバッグやケアレスミスを考えると後者、かと思います。 いずれにせよ、やりやすいほうでいいと思います。 (2) これも可読性の問題ですね。 数学的な並びのほうが読みやすいか、変数を頭に持ってきたほうが読みやすいかの違いでしょう。 Javaコーディング標準というドキュメントでは、右側に大きい値を常に持ってくる、つまり数学的な並びのほうが好ましいと書かれています。 (4) if文を最後に書くほうが処理速度が向上します。 が、ほんのちょっとしか変わらないので速度を意識してわざわざ倒置させて書くことはしなくて良いと思います。 また、倒置構文で書くと、実行文が1文のとき"{ }"を省略できます。 利点としてはそんなもんでしょうか。

goku3
質問者

お礼

詳しい解説をありがとうございました。 たまたま今回の例に掲げたようなソースコードを見たもので、 そこらじゅうに徹底してコーディングされている様子から、 作者のものすごい”コダワリ”を感じ、これは何かあるはずだと 問い合わせさせて頂いた次第でした。

  • m_mik
  • ベストアンサー率26% (31/117)
回答No.3

(1) これは宗教論争になりそうなのでどっちが良いということは無いと思います。 # 私は前者を使っています #2さんも仰っていますが、デバッグで苦労することはあります。(=と==の見間違いはよくあります) 上手く動かないときには、そこから疑うようになりますが… また、perlには独自の比較 if ($x =~ /ABC/) などがあるので、前者の方が統一感が取れると思っています。

goku3
質問者

お礼

ありがとうございます。 >>また、perlには独自の比較 if ($x =~ /ABC/) などがあるので、 説得力がありますね。 私も定数を先に書くのは何となく違和感を感じるので、特に実行上での違いがないのであれば、 (文字列比較の方は、言わずもがなですね)変数を先に書くようにしたいと思います。

  • gentaro
  • ベストアンサー率47% (105/221)
回答No.2

(1)の部分的な回答ですが if($a == 0) if(0 == $a) 私は昔からのクセで後者です。というのは、 if($a = 0) と記述して、デバッグに苦しむ経験を何度もしていますので(笑) if(0 = $a) と書けばコンパイラに怒られてすぐわかります。

goku3
質問者

お礼

タッチの差でNo.1さんにも同じ回答を頂きました。ありがとうございました。 長いことif($a == 0)で慣れているので、生理的な違和感を感じるのは否めません。。(苦笑

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

こういうのは決まりがないので結論でませんよね。 ただ if(0 == $val) とすると if(0 = $val) と間違えたときにエラーがでるので使っているという話は聞いたことがあります。私は使ってませんが。

goku3
質問者

お礼

なるほど。確かに、定数を先に書いてあれば、= のみ記述のミスが防げますね。 誰から教わることもなく、長いこと自己流でプログラムをやってきましたが、目から鱗でした。 ありがとうございました。

関連するQ&A

  • perlのif文で・・・・・

    こんにちは。 お聞きしたいのですが、perlのif(A eq B)文で、crypt関数で暗号化した文字列の比較をしているのですが、画面に双方の変数をテスト表示をしてみて、AとBは一致しているにもかかわらず、このif文を飛ばしてしまいます。 暗号化した変数を使うのは初めてなんですが、何か可能性として考えられることはありますか? 自分でも考えられるチェックはしたつもりなんでが・・・

  • if文の判定条件に配列

    2次元配列(ここではa[M][N]とします)の値が全て0の時にだけある文章を実行したいのですが、 if(for(i=0; i<M; i++){ for(j=0; j<N; j++) map[i][j] == 0; }){ (実行したい文) } という文をコンパイルしたところエラーが出てしまいました。 if文の判定条件中にfor文は使えないのでしょうか? 使えないのであれば、別の書き方を教えて戴けると嬉しいです。よろしくお願いします。

  • if文で変数を指定する方法…

    素人なので、うまい方法が見つからず悩んでいます。 内容が変化する変数1があります。とりあえず、これを$hen1とします。これがある文字列だったら他の変数($hen2)を○○に変えるというのを実現したいのです。 で、 if($hen1 eq "1"){$hen2 = "文字列1"} else if($hen1 eq "2"){$hen2 = "文字列2"} ~~ という風にしたのですが、なぜかうまく動きません。 いったい何が間違っているのでしょう。もしくはif文で書くこと自体おかしいのでしょうか? 解決方法を教えてください。 お願いいたします。

    • ベストアンサー
    • CGI
  • if文の記述の仕方

    こんにちは。ifの構文を教えていただければ助かります。 すいませんが、よろしくお願いします。 if (ken==1){ document.form1.text1.value = "100"; } 変数kenが1と等しい時のif文を上に書きましたが 変数kenが等しいのは1と2と3全部が等しい場合としたい時、 どのように記述したら良いですか?初歩的なことですいませんがお知らせ下さい。

  • IF文

    (A)IF 条件 THEN 単純実行文1 ELSE 単純実行文2 (B)IF 条件 THEN 実行処理1 ELSE 実行処理2 Aの文では単純実行分なのになぜ改行すると(B)の文みたいに実行処理になるのでしょうか? 実行処理と単純実行文の違いを教えてください

  • VC2005においてif文が正しく評価されない

    環境: WindowsXP SP2 VC2005 下記ソースをデバッグしています(F10によるステップ実行)。 if文の直前で変数aの値を-1など、0未満へ変更し、 そのままステップ実行しても、なぜかif文の中に入りません。 本来であれば、-1は0未満であるため、if文の判定は真と判定 されるべきであると思います。 個人的に「a = b - c」の式が悪さをしているのではないかなと 考えています。 なぜこのような現象が起こるのでしょうか? int main(void) { long a = 0; long b = 2; long c = 1; a = b - c; if( a < 0 ){ return 0; } }

  • If文の条件文の書き方

    お世話になります。 Excelでマクロを作成しております。 内容:  あるセルに、X<=300 というような条件を入れておきます。  ある値、たとえば、500 が来たときに、Xに代入して、  500<=300 という条件式を作り、それが、正しいか、正しくないか  の結果を求めたいと思っています。 このとき、if文の条件文は、値によって、変わらなくてはいけないので、 文字列の置き換え等をして、変数として条件文を作ると、「型が違います」 のエラーになります。 どのように条件文を作ればいいでしょうか?? hani = Cells(1,1).value 'セル1,1に、X<=300 が書かれています。 exp = Replace(hani, "X", 500) '"X"を500と置き換えます。 If exp Then Check = 0 Else Check = 1 End If よろしくお願いします。

  • if文の判定条件('||'と'&&'の使い方)

    ○if文の判定条件への理解が弱いため、下記プログラムを作成し、 疑問があったため、質問をしたいと思っております。 #include<stdio.h> #include<string.h> int main() { char moji[]= "A"; /***********************************************************/ if( 0 != strcmp( moji , "A" ) || strcmp( moji , "B" ) ) ^^(1) /***********************************************************/ { printf( "文字不一致" ); } else { printf( "文字一致" ); } return (0); } ○質問 「/*/」で囲ったif文の判定箇所になりますが、 この判定条件は"配列mojiに格納されている値が"A",または"B"以外の" ときに、画面上に「文字不一致」を出力します。そうでなければ 「文字一致」を出力します。 今回、配列mojiには"A"が格納されており、「文字一致」が画面に 出力されるはずですが、「文字不一致」が出力されてしまいます。 判定条件が誤っていると思い、色々と試したところ、(1)の箇所を 「&&」にしたときに、「文字不一致」が出力されます。 「||」(論理和)と「&&」(論理積)が理解できていないと思われ、 この部分を交えて、何故「&&」にしないと「画面不一致」と出力 されないのかを、ご教授の程お願い致します。

  • if文の中のif文・・・について

    質問させていただきます。 if文の中のif文の記述の仕方について質問があります。 例えば if ( x > 0 ){ a = b+c; if ( a > 1) d = e+f; ・・・1 if ( a < 1) d = e-f; ・・・2 if ( a = 1 ) d = 1-g; ・・・3 } h = d + i; aが1より大きい場合は、1の処理を、aが1より小さい場合は2の処理を、aが1と同じであった場合、3の処理をして最終的に、h = d + i;の式の d に代入して h を求めたいと思っているのですが、うまくゆきません。 if文の中のif文の記述はどのようにすればよいのでしょうか? よろしければご教示よろしくお願いします。

  • IF文について

    A以上B以下という処理条件を記述しているんですが、この以外のものが来たらIF文を出るようにしたいんですが、どのように記述すれば良いのでしょうか? マクロだと、確か"Exit ~"で抜けれたと思うんですが、どなたか教えて下さい。

専門家に質問してみよう