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(条件文) 実行文;
と書くよりも変換効率(?)か何かが良いと聞いたのですが、
どういう理由でどちらが良いとかありますか?
この辺の違いはコンパイラが吸収してくれるので、どちらでも良いとか、
何か参考になる文献などもありましたら、ご教示よろしくお願いします。
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
ありがとうございました。
教えて頂いたページでのLarry Wallさんのスタイルがタメになりました。
自分でも、あ、ここは同じ考えだ、ということが分かって勉強になりました。
お褒め頂いて光栄です。(笑)ありがとうございました。
No.5
- 回答日時:
個人的には
if ($a == 0)...
と書きます. なんとなく
if (0 == $a)...
は不自然な感じだから.
ちなみに演算子のオーバーロードをするときには, 数値への変換関数を「+0」という名前で表現したりする (もちろん sub +0 () と書くわけではないが) ので, そのことをふまえると
if ($a + 0 == 0)...
が正しいのかもしれない. 絶対やらないけど.
ありがとうございました。
>>と書きます. なんとなく
>>if (0 == $a)...
>>は不自然な感じだから.
そうですね、私もパッと見で違和感を感じました。
ただ、下記にも色々とご意見頂いたように、それなりの理由があったようで、納得できました。
>> 数値への変換関数を「+0」という名前で表現したりする
私も、文字列の中から数字部を切り取った際に、念のためにこのようなことをやることがありました。
例えば、$a="wgt.123kg";で
$val=substr($a,4,3) + 0;
みたいに。
No.4
- 回答日時:
(1)
可読性を考えると前者、デバッグやケアレスミスを考えると後者、かと思います。
いずれにせよ、やりやすいほうでいいと思います。
(2)
これも可読性の問題ですね。
数学的な並びのほうが読みやすいか、変数を頭に持ってきたほうが読みやすいかの違いでしょう。
Javaコーディング標準というドキュメントでは、右側に大きい値を常に持ってくる、つまり数学的な並びのほうが好ましいと書かれています。
(4)
if文を最後に書くほうが処理速度が向上します。
が、ほんのちょっとしか変わらないので速度を意識してわざわざ倒置させて書くことはしなくて良いと思います。
また、倒置構文で書くと、実行文が1文のとき"{ }"を省略できます。
利点としてはそんなもんでしょうか。
詳しい解説をありがとうございました。
たまたま今回の例に掲げたようなソースコードを見たもので、
そこらじゅうに徹底してコーディングされている様子から、
作者のものすごい”コダワリ”を感じ、これは何かあるはずだと
問い合わせさせて頂いた次第でした。
No.3
- 回答日時:
(1) これは宗教論争になりそうなのでどっちが良いということは無いと思います。
# 私は前者を使っています
#2さんも仰っていますが、デバッグで苦労することはあります。(=と==の見間違いはよくあります)
上手く動かないときには、そこから疑うようになりますが…
また、perlには独自の比較 if ($x =~ /ABC/) などがあるので、前者の方が統一感が取れると思っています。
ありがとうございます。
>>また、perlには独自の比較 if ($x =~ /ABC/) などがあるので、
説得力がありますね。
私も定数を先に書くのは何となく違和感を感じるので、特に実行上での違いがないのであれば、
(文字列比較の方は、言わずもがなですね)変数を先に書くようにしたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- Excel(エクセル) セルの値 11 2022/06/29 11:00
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) エクセルの数式で教えてください。 3 2022/10/25 10:52
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
演算子と括弧
-
Excel VBAでリンク切れをチェッ...
-
例外処理のフローチャートの記...
-
'Range'メソッドは失敗しました
-
Excel VBA 『Call』で呼び出す...
-
VBでグローバル変数を宣言するには
-
シートモジュールで使う変数を...
-
モジュールの最大数はいくつな...
-
Form間の値の渡し方
-
ユーザーフォームに最小化・最...
-
ユーザー定義関数に#NAME?が返...
-
cpanの途中の"Killed"について
-
Excel VBA 定義されたプロージ...
-
【vba】フォームに書いてあ...
-
Access VBA標準モジュールにつ...
-
サブルーチンを認識しません。
-
モジュールとサブルーチン
-
LCD ディスプレイを Raspberry ...
-
Perlソースコードをコンパイル...
-
Excel VBAで、ユーザーフォーム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
if等判定文での定数、変数の記...
-
型を調べる
-
perl 正規表現でエラー
-
perlのif文で・・・・・
-
perlのシングルクォートとダブ...
-
perlでの入れ子文字列削除
-
演算子と括弧
-
ある書籍で、見つけました、per...
-
msgboxに何故括弧がないの!
-
文字列比較
-
perl tr での変数の使い方
-
Perlでの改造方法
-
perlでの括弧対応チェック
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
VBでグローバル変数を宣言するには
-
エクセルVBAでシートモジュール...
-
'Range'メソッドは失敗しました
おすすめ情報